আধুনিক সি কীভাবে লিখবেন সে সম্পর্কে কি কোনও সাধারণভাবে গৃহীত গাইডলাইন রয়েছে?


13

আমার একটি শক্তিশালী জাভা / গ্রোভির পটভূমি রয়েছে এবং আমাকে এমন একটি দলের দায়িত্ব দেওয়া হয়েছে যা প্রশাসনিক সফ্টওয়্যারটির জন্য বেশ বড় সি কোড বেস বজায় রাখে।

কিছু ব্যথা পয়েন্ট, যেমন ডেটাবেজে ব্লব নিয়ে কাজ করা বা পিডিএফ এবং এক্সেলের প্রতিবেদন তৈরি করা জাভা ওয়েব পরিষেবাতে বহিরাগত করা হয়েছে।

তবে জাভা দেব হিসাবে আমি কোডের কিছু দিক থেকে কিছুটা বিভ্রান্ত হয়ে পড়েছি:

  • এটি ভার্জোজ (বিশেষত 'ব্যতিক্রম' নিয়ে কাজ করার সময়)
  • প্রচুর বিশাল পদ্ধতি রয়েছে (অনেক 2000+ লাইন পদ্ধতি)
  • কোনও উন্নত ডেটা কাঠামো নেই (আমি তালিকাটি মিস করি, সেট এবং মানচিত্রটি প্রচুর মিস করি)
  • উদ্বেগের কোনও বিভাজন নেই (এসকিউএল আনন্দের সাথে কোডের চারপাশে মেশানো হয়েছে)

ফলস্বরূপ আমি অনুভব করি যে ব্যবসায়টি প্রচুর প্রযুক্তিগত কোডে লুকিয়ে আছে এবং আমার মস্তিষ্ক, অবজেক্ট ওরিয়েন্টেড এবং এক চিমটি ফাংশনাল প্রোগ্রামিং এর সাথে আকৃতির, স্বাচ্ছন্দ্য নয়।

প্রকল্পটির ভাল দিকটি হ'ল কোডটি সোজা এগিয়ে রয়েছে: কোনও কাঠামো নেই, রানটাইমে কোনও বাইট কোড ম্যানিপুলেশন নেই, কোনও এওপি নেই। এবং জাভা "হ্যালো ওয়ার্ল্ড" থুতু লাগানোর চেয়ে জাভা কম মেমরি ব্যবহার করে সার্ভার একযোগে 10000+ ব্যবহারকারীকে একটি মেশিন দিয়ে উত্তর দিতে পারে।

আমি সাধারণভাবে গৃহীত আধুনিক নীতিমালা অনুসারে সি কোড লিখতে শিখতে চাই। আধুনিক সি কীভাবে রচনা এবং কাঠামোগত করা উচিত সে সম্পর্কে কোনও সাধারণভাবে গৃহীত নীতিগুলি রয়েছে কি?

কিছুটা 'কার্যকর জাভা' বইয়ের সমতুল্য, তবে সি এর জন্য

উত্তর এবং মন্তব্যগুলির আলোকে সম্পাদনা করুন:

  • আমি আমার মানসিকতা সি কোডের সাথে খাপ খাইয়ে নেওয়ার চেষ্টা করব এবং এটিকে ওওপিতে মিরর করার চেষ্টা করব না।
  • আমি মন্তব্য (জিএনইউ কোডিং স্ট্যান্ডার্ডস এবং লিনাক্স কার্নেল কোডিং স্টাইল) থেকে প্রস্তাবিত কোডিং শৈলীর গাইডগুলি স্ক্যান-পড়া শুরু করেছি।
  • আমি তখন আমার সহকর্মীদের কাছে এই কোড শৈলীর প্রস্তাব দেওয়ার চেষ্টা করব। সবচেয়ে কঠিন অংশটি সহ-কর্মীদের বোঝাতে পারে যে বিশাল পদ্ধতিটি ছোট অংশে বিভক্ত হতে পারে এবং ত্রুটি পরিচালনার কোডের একই 4 টি লাইনের পুনরাবৃত্তি করা কোনও পদ্ধতির সাহায্যে এড়ানো যেতে পারে।

5
অ্যাপ্লিকেশনটির কি আসলেই আধুনিকীকরণ প্রয়োজন, বা আপনি কী ভাবেন যে এটি করা হয়েছে কারণ এটি যেভাবে লেখা হয়েছিল তা অপরিচিত?
blrfl


1
@ ব্ল্রফ্ল, আমার মনে হয় অ্যাপ্লিকেশনটি পুরানো মান দিয়ে লেখা হয়েছে। আমি কেবলমাত্র জানতে চাই (আজকের (২০১)) মানকটি (প্রশাসনিক) সি এর জন্য কী আছে। আমি বর্তমান অ্যাপটি রিফ্যাক্টর বা পুনরায় আকার দিতে চাই না, কোডটির পরবর্তী অংশটি কীভাবে লিখতে হবে সে সম্পর্কে আমি ধারণা নিতে চাই।
গিলাইম


3
@ অ্যান্টলরসফট: একটি 2,000 লাইন ফাংশন যা একের পর এক সাধারণ জিনিসগুলির দীর্ঘ তালিকা করে, একেবারেই কোনও সমস্যা নয় এবং কোনও অজুহাত প্রয়োজন নেই। "আপনার ২,০০০ লাইন ফাংশন লিখতে হবে না কারণ আপনার ২,০০০ লাইন ফাংশন লিখতে হবে না" এই জাতীয় বিজ্ঞপ্তি দিয়ে উত্তর দিন না।
gnasher729

উত্তর:


14

আমি আপনার প্রশ্ন থেকে বুঝতে পারি সমস্যাটি কোডটি পুরানো সি নয় তবে কেবলমাত্র খারাপ প্রোগ্রামিং। ভার্বোসিটি, বিশাল 2000+ লাইন ফাংশন বা উদ্বেগের কোনও পৃথকীকরণের মতো আপনি উল্লেখ করেছেন এমন বেশিরভাগ সমস্যা কোনও ভাষা, সি বা জাভাতে প্রযোজ্য।

ভার্বোসিটির ত্রুটি পরিচালনার প্রসঙ্গে উল্লেখ করা হয়েছিল। আপনি একটি উদাহরণ সরবরাহ করেন নি তাই আমি কেবল মনে করিয়ে দিতে পারি যে ত্রুটি পরিচালনার কোডটিও কোড । বয়লারপ্লেট কোডটির পুনরাবৃত্তি বিভাগগুলির জন্য কোনও অজুহাত নেই। ফ্যাক্টর এটি আউট; হয় কোনও ফাংশনে বা (যদি এটি পৃথক ফাংশন তৈরি করার উপযুক্ত না হয়) goto Error;প্যাটার্নটি করুন এবং ত্রুটি পরিচালনা ও Error:ফাংশনটির নীচের অংশে রিসোর্স ক্লিনআপটি সরান ।

যদি কল শৃঙ্খলে ত্রুটিটি পাস করা সমস্যা বলে মনে হয়, নিজেকে জিজ্ঞাসা করুন: এখানে কার্যকারিতাটি কি আসলেই এখানে কিছু ছোট ছেলেটির জানা দরকার? কোনও ভাষা অন্তর্নির্মিত ব্যতিক্রম পদ্ধতিগুলি এটি করা সহজ করে তোলে তবে সাধারণভাবে ব্যতিক্রমগুলি তাড়াতাড়ি পরিচালনা করা ভাল (যে কোনও ভাষায়) যাতে ত্রুটির শর্তটি উচ্চ-স্তরের কোডের যুক্তিকে দূষিত না করে। এবং যদি সেখানে উপস্থিত ক্রিয়াকলাপটি সত্যই জানতে হবে, এবং এর সাথে ব্যতিক্রমগুলি অনুকরণ করার উপায় রয়েছে ।setjmplongjmp

আমি মনে করি কেবলমাত্র সত্যিকারের সি সম্পর্কিত সমস্যা হ'ল মানক ধারকগুলির অভাব। যদিও Setসাধারণভাবে করতে পারেন একটি সাজানো অ্যারে এবং প্রতিস্থাপিত হতে Mapযুগলের একটি অ্যারের বা (অধিকাংশ অংশ জন্য) একটি struct(যদি আপনি কী সেট হাত আগে জানতে map[key] = valueপালাক্রমে মধ্যে s.key = value), কিন্তু সত্য সেখানে মান কোন গতিশীল অ্যারের ধারক এর গ্রন্থাগার। C99 এ আপনি কমপক্ষে স্ট্যাকের উপর একটি পরিবর্তনশীল দৈর্ঘ্যের অ্যারে ঘোষণা করতে পারেন ( int array[len]) তবে আপনাকে lenআগেই গণনা করতে হবে (সাধারণত হার্ড নয়) এবং অবশ্যই আপনি এটিকে কোনও স্ট্যাক-বরাদ্দ করা বস্তু হিসাবে ফিরিয়ে দিতে পারবেন না। বেশিরভাগ প্রকল্প তাদের নিজস্ব গতিশীল অ্যারে ধারক লিখে বা একটি মুক্ত-উত্স গ্রহণ করে শেষ হয়।

একটি সমাপ্ত নোটে, আমি এখানে এসেছি তা উল্লেখ করতে চাই। আমি জাভা প্রোগ্রামার হয়েছি যা সি ++ এবং খাঁটি সিতে চলে এসেছি আমি "ভাল সি শিখতে এক্স বই পড়ুন" কে পরামর্শ দিতে চাই তবে জাভাটির মতো কোনও নেই এমনটি নেই। এগিয়ে যাওয়ার উপায় হ'ল ভাষার সমস্ত জটিলতা এবং স্ট্যান্ডার্ড লাইব্রেরি ভেজানো; গুগল অনেক, প্রচুর পড়ুন, এবং সি কোড করা শুরু না করা পর্যন্ত অনেক কোড করুন আপনি জাভাতে যেমন সি তে জিনিস লেখার চেষ্টা করছেন তেমনি হতাশার সাথে বিদেশী ভাষায় একটি বাক্য লেখার চেষ্টা যেমন আপনার মায়ের কাছ থেকে সরাসরি অনুবাদ করা হয়েছে জিহ্বা; আপনি এবং পাঠক উভয়ই সঙ্কুচিত হবেন। সুসংবাদটি হ'ল ভাল প্রোগ্রামিং শেখা ধীর হলেও অন্য ভাষা শেখা দ্রুত। সুতরাং আপনি যদি জাভাতে শালীন কোড লিখেন,


1
সব মিলিয়ে এটি সত্যিই ভাল উত্তর। আমি কেবল বৈধ সরঞ্জাম হিসাবে setjmp()/ দেখার জন্য আপত্তি longjmp()জানাব: এটি কোনও ক্লিনআপ করার চেষ্টাও করে না। যেকোন বরাদ্দ ফাঁস হবে, যে কোনও হোল্ড লক প্রকাশ হবে না, খোলা ফাইলটি বন্ধ হবে না এবং কোনও ক্ষণস্থায়ী ডেটা অসঙ্গতি স্থায়ী হয়ে যাবে। আইএমএইচও, এই ফাংশন জুটিটি মূলত সবচেয়ে খারাপ হ্যাক যা এখনও আবিষ্কার হয়েছিল, এটির একমাত্র যুক্তি দিয়ে এটি বাস্তবায়ন সম্ভব হয়েছিল। শেষ অবধি, সি তে ত্রুটি পরিচালনার পক্ষে সত্যই একটি বৈধ উপায় আছে: সুস্পষ্ট ত্রুটি কোডগুলি।
মাস্টার -

@ মাস্টার হ্যাঁ ব্যক্তিগতভাবে, setjmp/longjmpসিতে জলের বাইরে কোনও মাছ মনে হয় এবং আমি সেগুলি কখনও ব্যবহার করি না। আমি কেবল ব্যতিক্রমগুলি নকল করার জন্য ইন্টারনেটে অসংখ্য টিউটোরিয়াল / গ্রন্থাগারগুলির কারণে সেগুলি অন্তর্ভুক্ত করতে বাধ্য হয়েছিল বলে মনে করেছি, সুতরাং আমি ভেবেছিলাম এমন লোক রয়েছে যারা প্রকৃতপক্ষে এটি ব্যবহার করে।
একটি আউল

7

প্রকল্পটির ভাল দিকটি হ'ল কোডটি সোজা এগিয়ে রয়েছে: কোনও কাঠামো নেই, রানটাইমে কোনও বাইট কোড ম্যানিপুলেশন নেই, কোনও এওপি নেই। এবং জাভা "হ্যালো ওয়ার্ল্ড" থুতু লাগানোর চেয়ে জাভা কম মেমরি ব্যবহার করে সার্ভার একযোগে 10000+ ব্যবহারকারীকে একটি মেশিন দিয়ে উত্তর দিতে পারে।

আমি আপনাকে পরামর্শ দিচ্ছি যে কম কোড জটিলতা সহ একটি ওয়ার্কিং সফ্টওয়্যার "আধুনিকীকরণ" এবং কে ভাল পারফরম্যান্স করেছে তার জন্য "আপনার আধুনিকায়ন" করার জন্য আপনার সময় এবং সংস্থার অর্থ ব্যয় করা উচিত কিনা তা সম্পর্কে আপনাকে সতর্ক হওয়ার পরামর্শ দিন। খুব সম্ভবত একটি হুড রয়েছে যা আপনি নিজের সাথে নতুন বাগ প্রবর্তন করবেন, বিশেষত যেহেতু এটি এমন একটি সিস্টেম বলে মনে হচ্ছে যা আপনি অপরিচিত।

আপনি যদি এখনও সেই রাস্তায় যেতে চান তবে আমি নীচের পরামর্শ দেব:

  • সফ্টওয়্যার / কোডের একটি রাজ্য চিত্র তৈরি করুন (বা জেনারেট করুন)
  • কোডটিতে ডুব দিন এবং যথাক্রমে কোডের সবচেয়ে জটিল বা গুরুতর অংশগুলির একটি তালিকা তৈরি করুন
  • সেই কোড বেস সম্পর্কে জ্ঞানবান এমন কাউকে খুঁজুন এবং তাদের জিজ্ঞাসা করুন কেন এটি এইভাবে তৈরি করা হয়েছে এবং কী কারণে সমস্যা হয়েছে বলে জানা গেছে
  • আপনি যা শিখলেন তা থেকে ডকুমেন্টেশন লিখুন

এই মুহুর্তে, আপনি সিদ্ধান্ত নেবেন যে এটি অনুসন্ধান করার উপযুক্ত কিনা। যদি আপনার কোম্পানির সংস্কৃতি ব্যর্থতার পুরষ্কার না দেয় তবে উচ্চতর বা কোনও পরিচালকের কাছ থেকে গ্রিন লাইট পান।

  • সফ্টওয়্যারটির বিভিন্ন বিল্ডিং ব্লকগুলিকে বিভাগীয়করণ এবং প্রতিটিটির জন্য ইউনিট পরীক্ষা লিখুন।
  • আপনি একসাথে বিভিন্ন মডিউল আঠালো না হওয়া পর্যন্ত Iterate
  • প্রকৃত ব্যবহারকারীর মিথস্ক্রিয়া (স্ট্রেস টেস্ট ইত্যাদি) অনুকরণ করে এমন আরও পরীক্ষা করুন Do

আমি মনে করি এটি মোটামুটি ভাল রাস্তার মানচিত্র এবং যেখানে আপনার প্রয়োজন সেখানে আপনাকে নিয়ে যাবে। এই প্রকল্পের সুনির্দিষ্ট না জেনে আপনার পক্ষে অনেক বেশি সহায়তা করা শক্ত। মাত্রাতিরিক্ত অ্যালার্মিস্ট হিসাবে আমার দাবি অস্বীকার করবেন না। প্রচুর সেরা প্রোগ্রামাররা তাদের বিদ্যমান ভাষাটিকে তাদের প্রিয় ভাষায় পুনরায় লেখার চেষ্টা করে বা "আধুনিক" সরঞ্জামগুলি ব্যবহার করে ধুলাবালি করেছে। এটি এমন একটি সিদ্ধান্ত যা অবশ্যই যত্ন সহকারে চিন্তা করা উচিত এবং আমি আপনাকে অনুরোধ করছি আপনার দুর্বৃত্তদের এড়াতে এবং আপনার সহকর্মীদের কাছ থেকে ম্যানেজমেন্ট সহায়তা বা সহায়তা ছাড়াই নিজে থেকে এটি না করার জন্য।


2
আমি পুনরায় বলি যে আমার প্রশ্নটি মোটেই পরিষ্কার ছিল না। আমি কোডটি রিফ্যাক্টর করতে চাই না। মোটেই আমি বিদ্যমান কোড বেসটি ঠিক তেমনভাবে বজায় রাখতে চাই। তবে আমি কীভাবে নতুন বৈশিষ্ট্যটির জন্য আধুনিক সি লিখতে শিখতে চাই। এবং এখানে আমি হারিয়েছি। আমি যে ডকুমেন্টেশন পেয়েছি তার বেশিরভাগটি সিটিতে কোড কীভাবে করা উচিত, 'আধুনিক' সি কিভাবে লিখতে হবে তা সম্পর্কে নয় ... সম্ভবত 'আধুনিক' সি'র মতো কোনও জিনিস নেই ...
গিলাইউম

1

আপনি যদি উচ্চ স্তরের ভাষা পছন্দ করেন তবে সি ++ বা অবজেক্টিভ-সি জাতীয় কিছু ভাষা রয়েছে যা সি কোডের সাথে খুব সহজেই মেশানো যায়।

বিকল্পভাবে, সি এবং সি ++ যুক্তিসঙ্গতভাবে সামঞ্জস্যপূর্ণ। আপনি কয়েকটি পরিবর্তন সহ কেবল পুরো কোডবেসটি সি ++ হিসাবে সংকলন করতে সক্ষম হতে পারেন - আপনার মাঝে "শ্রেণি" বা "টেমপ্লেট" নামক অনিয়মিত ভেরিয়েবল থাকবে যা আপনার নাম পরিবর্তন করতে হবে, তবে বাস্তবে এটি সমস্ত হবে। (আকারের ('এ') সি এবং সি ++ তে আলাদা, তবে আমি মনে করি না যে আমি কখনও এটি ব্যবহার করেছি)।

আপনি যদি সেই পথে যান তবে বিবেচনা করুন যে পরবর্তী রক্ষণাবেক্ষণকারী সি ++ এর সাথে খুব সাবলীল নাও হতে পারেন। বহন করবেন না। সি ++ এর সুবিধা নিন তবে কেবলমাত্র এ পর্যন্ত যে কোনও সি প্রোগ্রামার সহজেই তা উপলব্ধি করতে পারে।


1
আমি এখানে মতানৈক্য আছে। সি এবং সি ++ স্বতন্ত্র ভাষা, এবং কিছু একটি সি ++ কম্পাইলার (স্পষ্টভাবে ফেরত মান ভোটদান প্রয়োজনীয় কোড malloc) সি খারাপ অভ্যাস মানে বলে মনে করা হয় constএবং inlineএছাড়াও খুব সি এবং সি ++ মধ্যে পার্থক্য, এবং অবশ্যই C ++ বোঝে না __restrict। উভয় ভাষাকে সংকলন করে এমন উত্সের উপসেটেও ভাষাগুলি বিনিময়যোগ্য হিসাবে বিবেচনা করবেন না।
অ্যাঞ্জিউ আর

1

মূলত, ভাল সি কোড লেখা ভাল সি ++ বা জাভা কোড লেখার মতোই: আপনি একটি ক্লাস চান, একটি ব্যবহার করুন struct। আপনি উত্তরাধিকার চান, structনামটিকে প্রথম নামহীন সদস্য হিসাবে অন্তর্ভুক্ত করুন । আপনি ভার্চুয়াল ফাংশন চান, structফাংশন পয়েন্টার একটি স্ট্যাটিক একটি পয়েন্টার যোগ করুন । ইত্যাদি ইত্যাদি, এটি হুডের নীচে সি ++ ঠিক কী করে, কেবল তফাতটি এটি সিতে স্পষ্ট licit সুতরাং আপনি সিতে নিখুঁতভাবে ওরিয়েন্টেড প্রোগ্রামিং করতে পারেন, এটি আপনার চেয়ে কিছুটা আলাদা এবং আরও বেশি বয়লারপ্লেট দেখাচ্ছে অভ্যস্ত.

মুল বক্তব্যটি হ'ল, ভাল প্রোগ্রামিং ভাষার বৈশিষ্ট্যগুলি নিয়ে নয়, দৃষ্টান্তগুলি সম্পর্কে। সত্য, আপনার ভাষা বৈশিষ্ট্যগুলি আপনি যে নমুনাগুলি ব্যবহার করতে চান তার জন্য ভাল সমর্থন সরবরাহ করে তা সর্বদা দুর্দান্ত তবে ভাষার বৈশিষ্ট্যগুলির কোনও প্রয়োজন হয় না। আপনি যখন এটি বুঝতে পেরেছেন, আপনি কোনও কোনও ভাষাতে ভাল কোড লিখতে পারেন (ব্রেনফাক বা ইন্টারকলের মতো কিছু গুরূত্বপূর্ণ ভাষা বাদে)।

অবশ্যই, সমস্যাটি রয়ে গেছে যে স্ট্যান্ডার্ড সি লাইব্রেরিতে আপনার ব্যবহৃত if নিফটি ধারক শ্রেণীর কোনও নেই। দুর্ভাগ্যক্রমে, এর অর্থ হল যে আপনাকে নিজের নিজস্ব ব্যবহার করতে হবে, বা গতিশীলভাবে বরাদ্দ করা অ্যারে ব্যবহার করে এই অভাবটি ঘটাতে হবে। তবে আমি খুব শীঘ্রই শিখে ফেলব যে, আপনার যা দরকার তা হ'ল ডায়নামিক অ্যারে ( malloc()) এবং লিঙ্কযুক্ত তালিকাগুলি / গাছগুলি যা আপনার ক্লাসের মধ্যে পয়েন্টার সদস্যের মাধ্যমে প্রয়োগ করা হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.