কন্ডিশনের অংশে অ্যাসাইনমেন্টগুলি কী খারাপ অভ্যাস?


35

ধরে নেওয়া যাক আমি একটি ফাংশন লিখতে চাই যা সিতে দুটি স্ট্রিং সংহত করে আমি এটি যেভাবে লিখব তা হ'ল:

void concat(char s[], char t[]){
    int i = 0;
    int j = 0;

    while (s[i] != '\0'){
        i++;
    }

    while (t[j] != '\0'){
        s[i] = t[j];
        i++;
        j++;
    }

    s[i] = '\0';

}

তবে কে ও আর তাদের বইতে এটি আলাদাভাবে প্রয়োগ করেছে, বিশেষত সময়ের অবস্থার যতটা সম্ভব লুপ সহ:

void concat(char s[], char t[]){
    int i, j;
    i = j = 0;
    while (s[i] != '\0') i++;

    while ((s[i++]=t[j++]) != '\0');

}

কোন পথে পছন্দ হয়? কে ও আর কীভাবে কোড লিখতে উত্সাহিত বা নিরুৎসাহিত করা হয়েছে? আমি বিশ্বাস করি আমার সংস্করণটি অন্য ব্যক্তিদের দ্বারা পড়া আরও সহজ হবে।


38
ভুলে যাবেন না, কে অ্যান্ড আর প্রথম প্রকাশিত হয়েছিল 1978 সালে। তখন থেকে আমরা কীভাবে কোড করি তাতে দুটি ছোট পরিবর্তন হয়েছে।
কর্সিকা

28
টেলিপ্রিন্টার এবং লাইন-ভিত্তিক সম্পাদকদের সময়ে পাঠযোগ্যতা খুব আলাদা ছিল was সমস্ত স্টাফকে একক লাইনে মুশ করানো আরও পড়তে পেত ।
ব্যবহারকারী 2357112

15
আমি হতবাক হয়েছি যে এগুলির পরিবর্তে 'something 0' এর সাথে সূচক এবং তুলনা রয়েছে while (*s++ = *t++); (আমার সি খুব মরিচা, অপারেটর নজিরের জন্য আমার কি সেখানে পেরেন দরকার?) কে ওআরআর তাদের বইয়ের নতুন সংস্করণ প্রকাশ করেছিল? তাদের মূল বইটিতে চূড়ান্ত সংক্ষিপ্ত এবং পরিচয়মূলক কোড ছিল।
user949300

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

10
লক্ষ্য করুন যে দুটি কোড ব্লক সমতুল্য নয়। প্রথম কোড ব্লক সসীম অনুলিপি করবে '\0'থেকে t( whileপ্রথম প্রস্থানের)। sএটি একটি '\0'পরিণতি ছাড়াই ফলাফল স্ট্রিংটি ছাড়বে (যদি না স্মৃতি অবস্থানটি ইতিমধ্যে শূন্য না থাকে)। দ্বিতীয় কোড ব্লক লুপটি '\0'প্রস্থান করার আগে সমাপ্তির অনুলিপি তৈরি করবে while
মাকেন

উত্তর:


80

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

কোনও বোকা কোড বুঝতে পারে এমন একটি কোড যা কম্পিউটার বুঝতে পারে। ভাল প্রোগ্রামাররা কোড লিখেন যা মানুষ বুঝতে পারে। (এম। ফোলার)

সুতরাং, কোনও সন্দেহ নেই, আমি বিকল্প A এর জন্য যাব এবং এটি আমার চূড়ান্ত উত্তর।


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

26
নিবন্ধন করুন কোনও কোডের পার্শ্ব প্রতিক্রিয়া রয়েছে যেখানে আপনি এটি প্রত্যাশা করেন না এমন কিছু সমস্যা আছে, যেমন ফাংশন আর্গুমেন্টগুলি পাস করা বা শর্তাদি মূল্যায়ন। এমনকি উল্লেখ করাও নয় যে if (a=b)সহজেই ভুল হতে পারে if (a==b)
আর্থার হাভলিসেক

12
@ লুক: "আমার আইডিই এক্স পরিষ্কার করতে পারে, সুতরাং এটি কোনও সমস্যা নয়" বরং আপত্তিহীন। যদি এটি কোনও সমস্যা না হয় তবে আইডিই এটি "ফিক্স" করা এত সহজ করে কেন?
কেভিন

6
@ আর্থার হাওলিসেক আমি আপনার সাধারণ বিষয়টির সাথে একমত, তবে শর্তসাপেক্ষে পার্শ্ব প্রতিক্রিয়া সহ কোডটি এতটা অস্বাভাবিক নয়: while ((c = fgetc(file)) != EOF)প্রথমটি যা আমার মনে আসে।
ড্যানিয়েল জোর

3
+1 "বিবেচনা করে দেখুন যে ডিবাগিং প্রথমে কোনও প্রোগ্রাম লেখার চেয়ে দ্বিগুণ কঠোর, যদি আপনি এটি লেখার সময় যতটা চালাক হন তবে আপনি কীভাবে এটির ডিবাগ করবেন?" বিডাব্লুকির্নিঘন
ক্রিস্টোফ

32

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

যে প্রোগ্রামারগুলি সি দিয়ে শুরু হয়নি, তাদের জন্য প্রথম সংস্করণটি সম্ভবত বোঝা সহজ, কারণ আপনি ইতিমধ্যে জানেন।

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

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


14

সম্পাদনা: লাইনটি s[i] = '\0';প্রথম সংস্করণে যুক্ত করা হয়েছিল, যার ফলে নীচে ভেরিয়েন্ট 1 তে বর্ণিত হিসাবে এটি ঠিক করা হয়েছে, সুতরাং এটি আর প্রশ্নের কোডের বর্তমান সংস্করণে প্রযোজ্য নয়।

দ্বিতীয় সংস্করণটির সঠিক হওয়ার স্বতন্ত্র সুবিধা রয়েছে , যখন প্রথমটিটি নয় - এটি লক্ষ্যযুক্ত স্ট্রিংটিকে সঠিকভাবে বাতিল করে দেয় না।

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

  1. দ্বিতীয় লুপ শেষ হওয়ার পরে নাল-সমাপ্তি যুক্ত করুন (আরও কোড যুক্ত করা, তবে আপনি পঠনযোগ্যটি যুক্তিযুক্ত করতে পারেন এটি সার্থক করে তোলে) বা বা
  2. লুপের বডিটি "প্রথমে বরাদ্দ করুন, তারপরে নির্ধারিত চরটি যাচাই বা সংরক্ষণ করুন, তারপরে ইনক্রিমেন্ট সূচকগুলি" পরিবর্তন করুন। লুপটির মাঝামাঝি শর্তটি পরীক্ষা করার অর্থ লুপটি ভেঙে ফেলা (স্পষ্টতা হ্রাস করা, বেশিরভাগ পিউরিস্টদের দ্বারা উদ্ভূত)। নির্ধারিত চরটি সংরক্ষণের অর্থ অস্থায়ী পরিবর্তনশীল (স্পষ্টতা এবং দক্ষতা হ্রাস করা) প্রবর্তন করা উচিত। এই দু'জনেই আমার মতে সুবিধাটি বিনষ্ট করবে।

সঠিক পাঠযোগ্য এবং সংক্ষিপ্ত চেয়ে ভাল।
user949300

5

তুলিনেস কর্ডোভা এবং এইচডিডি এর উত্তরগুলি পরিষ্কারভাবে / পঠনযোগ্যতার দিকগুলি বেশ ভালভাবে কভার করে। শর্তে অ্যাসাইনমেন্টের পক্ষে অন্য কারণ হিসাবে আমাকে স্কোপিংয়ে ফেলতে দিন । শর্তে ঘোষিত একটি পরিবর্তনশীল কেবলমাত্র সেই বিবৃতিতে পাওয়া যায়। দুর্ঘটনার পরে আপনি সেই পরিবর্তনশীলটি ব্যবহার করতে পারবেন না। জন্য লুপ বয়সের জন্য এই কাজ করা হয়েছে। এবং এটা গুরুত্বপূর্ণ যথেষ্ট যে আসন্ন সি ++ 17 প্রবর্তন একটি অনুরূপ বাক্য গঠন জন্য যদি এবং সুইচ :

if (int foo = bar(); foo > 42) {
    do_stuff();
}

foo = 23;   // compiler error: foo is not in scope

3

না এটি খুব স্ট্যান্ডার্ড এবং সাধারণ সি স্টাইল। আপনার উদাহরণটি একটি খারাপ উদাহরণ, কারণ এটি কেবল লুপের জন্য হওয়া উচিত, তবে সাধারণভাবে এতে কোনও ভুল নেই

if ((a = f()) != NULL)
    ...

উদাহরণস্বরূপ (বা কিছুক্ষণের সাথে)।


7
এটিতে কিছু ভুল আছে; `! = সিউল শর্তাধীন নুলা এবং এর আত্মীয় স্বভাবতই বিকাশকারীদের প্ল্যাকেট করার জন্য যারা মান সত্য বা মিথ্যা (বা তদ্বিপরীত) হওয়ার ধারণার সাথে স্বাচ্ছন্দ্য বোধ করে না to
জোনাথন

1
@ জাস্টক্ট না, এটি অন্তর্ভুক্ত করা আরও স্পষ্ট != NULL
মাইলস রাউট

1
না, এটি আরও স্পষ্ট করে বলা (x != NULL) != 0। সর্বোপরি, সি সত্যই যাচাই করে চলেছে তাই না?
জোনাথন কাস্ট

@ জাস্ট জাস্ট, না তাই না। কোনও কিছুর পক্ষে অসম্পূর্ণ কিনা তা যাচাই করা আপনি কোনও ভাষায় কীভাবে শর্তসাপেক্ষ লিখেন তা নয়।
মাইলস রাউট

"কিছু অসত্যের কাছে অসম কিনা তা পরীক্ষা করা আপনি কোনও ভাষায় কীভাবে শর্তসাপেক্ষ লিখেন তা নয়" " যথাযথভাবে।
জোনাথন কাস্ট

2

কে অ্যান্ড আর এর দিনগুলিতে

  • 'সি' ছিল বহনযোগ্য সমাবেশ কোড
  • এটি প্রোগ্রামাররা ব্যবহার করেছিলেন যা সমাবেশ কোডে ভাবেন
  • সংকলকটি খুব বেশি অপ্টিমাইজেশন করেনি
  • বেশিরভাগ কম্পিউটারের "জটিল নির্দেশের সেট" ছিল, উদাহরণস্বরূপ while ((s[i++]=t[j++]) != '\0')বেশিরভাগ সিপিইউগুলিতে একটি নির্দেশকে মানচিত্র করা হবে (আমি ডিসেম্বর ভ্যাকটি আশা করি)

সেখানে দিন

  • সি কোড পড়া বেশিরভাগ লোকেরা এসেম্বলি কোড প্রোগ্রামার নয়
  • সি সংকলকগণ প্রচুর অপ্টিমাইজেশন করেন, সুতরাং কোড পড়ার সহজতর পদ্ধতিটি একই মেশিন কোডে অনুবাদিত হতে পারে।

(সর্বদা ব্রেস ব্যবহার করার বিষয়ে একটি নোট - কিছু সংকেতবিহীন থাকার কারণে কোডের প্রথম সেটটি আরও বেশি জায়গা নেয় {} , আমার অভিজ্ঞতায় প্রায়শই এই কোডটি প্রতিরোধ করে যা সংকলক থেকে খারাপভাবে মার্জ করা হয়েছে এবং ভুল ";" এর সাথে ত্রুটিযুক্ত ত্রুটিগুলি অনুমতি দেয়) সরঞ্জাম দ্বারা সনাক্ত।)

তবে পুরানো দিনগুলিতে কোডের ২ য় সংস্করণটি পড়তে হবে। (আমি যদি এটা ঠিক পেতাম!)

concat(char* s, char *t){      
    while (*s++);
    --s;
    while (*s++=*t++);
}

2

এমনকি এটি আদৌ করতে সক্ষম হওয়া খুব খারাপ ধারণা। এটি কথোপকথন হিসাবে "বিশ্বের শেষ বাগ," হিসাবে পরিচিত:

if (alert = CODE_RED)
{
   launch_nukes();
}

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


এই সতর্কতার আগে আমরা লিখব CODE_RED = alertতাই এটি একটি সংকলক ত্রুটি দিয়েছে gave
ইয়ান 21

4
@ ইয়ান যোদা শর্তাদি যাকে বলা হয়। তারা পড়া কঠিন। দুর্ভাগ্যজনক তাদের জন্য প্রয়োজনীয়তা।
ম্যাসন হুইলারের 21

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

2
@ ব্যবহারকারী949300 দুটি শব্দ: স্টকহোম সিনড্রোম: পি
ম্যাসন হুইলারের

2

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

উদাহরণস্বরূপ, নিম্নলিখিত প্রকাশটি নেটবিন দ্বারা হাইলাইট করা হয়েছে :

if($a = someFunction())

"দুর্ঘটনাজনিত কার্যভার" এর ভিত্তিতে।

এখানে চিত্র বর্ণনা লিখুন

নেটবিন্সকে স্পষ্টভাবে বলতে যে "হ্যাঁ, আমি আসলেই তা করতে চেয়েছিলাম ...", এক্সপ্রেশনটি প্রথম বন্ধনীতে আবৃত হতে পারে।

if(($a = someFunction()))

এখানে চিত্র বর্ণনা লিখুন

দিন শেষে, এটি সমস্ত কোম্পানির স্টাইলের নির্দেশিকা এবং উন্নয়নের প্রক্রিয়াটিকে সহজতর করার জন্য আধুনিক সরঞ্জামগুলির উপলভ্যতায় ফোটে।

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