রক্ষণাবেক্ষণ অনুসারে, হস্তক্ষেপ না করা বন্ধনীগুলি ছাড়া কি অন্যথায় নিরাপদ বলে বিবেচিত হয়?


26

else whileহস্তক্ষেপ না করা ছাড়া কি "নিরাপদ" রক্ষণাবেক্ষণ বুদ্ধিমান?

if-elseনীচের মতো ব্রেস ছাড়াই কোড লিখন ...

if (blah)
    foo();
else
    bar();

... একটি ঝুঁকি বহন করে কারণ ধনুর্বন্ধকের অভাব অজান্তে কোডটির অর্থ পরিবর্তন করা খুব সহজ করে তোলে।

তবে, নীচে কি ঝুঁকিপূর্ণ?

if (blah)
{
    ...
}
else while (!bloop())
{
    bar();
}

বা else whileহস্তক্ষেপকারী ধনুর্বন্ধনী ছাড়া "নিরাপদ" হিসাবে বিবেচনা করা হয়?


20
আমার কাছে else whileআইকি চেহারা দেখাচ্ছে। আমি ব্যবহার করতাম else { while (condition) { ... } }
জোছিম সউর

7
আমি মনে করি এটি একটি যথাযথ উত্তরের জন্য খুব সাবজেক্টিভ ... আমি নিজেই এটি করব না কারণ আমি কোনও লুপ আশা করব না এবং আমি মনে করি যে আমি পাঠযোগ্যতা কঠিন করে তুলব বলে আশা করি না।
জোহানেস

7
আমি চাই পদ্ধতি বের করার সময়-উপাদানের জন্য
মশা

12
সত্যিই, এটি আমাকে লতা দেয়। ifশুধুমাত্র একবার মূল্যায়ন করা হয়, তবে whileএকটি লুপ বোঝায়, সুতরাং উভয়কে সংযুক্ত করা আমাকে একটি অসম্পূর্ণ অনুভূতি দেয় যে if
লুপটির

4
এবং এই elseধারাটিতে যদি আপনি আরও কিছু করতে while এবং করতে চান ? দয়া করে ধনুর্বন্ধনী ব্যবহার করুন।
কার্লোস ক্যাম্প্ডার'স

উত্তর:


57

এটি আমাকে এই কোডটি মনে করিয়ে দেয়:

if ( ... ) try {
..
} catch (Exception e) {
..
} else {
...
}

প্রতিবার আপনি দুটি ধরণের ব্লকের সংমিশ্রণ করছেন, বন্ধনীগুলি ভুলে যাচ্ছেন না এবং বাড়ানো ইন্ডেন্টেশন না দিয়ে, আপনি কোড তৈরি করছেন বুঝতে এবং বজায় রাখা খুব কঠিন difficult


18
ভালো উদাহরণ. এটি লিখতে কি ভয়ঙ্কর উপায়।
লিও

4
বাহ, এই উত্তরটি হাস্যকরভাবে বিশ্বাসযোগ্য!
মেহরদাদ

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

55

সম্ভবত এটি কারণ যে আমি জ্যাকসন সত্তা কাঠামো ডায়াগ্রাম পদ্ধতিটি ব্যবহার করে আমার বাণিজ্য শিখলাম (ফিরে আসার সময়) তবে আমি এই মতামতটি সাবস্ক্রাইব করেছি যে একটি বা এর পরে একমাত্র সঠিক আনব্রেসড শব্দটি পরবর্তীকালে (যেমন একটি মইকে অনুমতি দেওয়া ) isifelseifelse if

অন্য যে কোনও কিছুই (কোনও পাং উদ্দেশ্য নয়) ভুল বোঝাবুঝি এবং / অথবা রক্ষণাবেক্ষণ সংক্রান্ত সমস্যার সম্ভাবনা ফেলেছে। ওপিএস ধারণাটি "অনিরাপদ" হওয়ার কেন্দ্রীয় দিকটি এটি।

আমি while()একই লাইনে অন্তর্ভুক্ত করার বিষয়ে খুব কাজি হয়েছি else- বন্ধনীযুক্ত কিনা তা whether এটি আমার কাছে সঠিকভাবে পড়ে না ... কোনও অতিরিক্ত ইন্ডেন্টেশন মাস্কের ঘাটতি এটি যে এই elseধারাটি। এবং স্পষ্টতার অভাব ভুল বোঝাবুঝির জন্য (উপরে দেখুন) তোলে।

সুতরাং উদাহরণে আমি দৃ strongly়ভাবে পরামর্শ / সুপারিশ করব (এবং আমার দলে জোর দিয়ে বলি):

if ( blah )
{
    ...
}
else
{
    while ( !bloop() )
    {
        bar();
    }
}

অবশ্যই, আমি উপযুক্ত মন্তব্যগুলিও দেখতে আশা করব।

- সম্পাদনা করুন -

সম্প্রতি অ্যাপল কোনও এসএসএল দুর্বলতায় ভুগেছে, এটি একটি দুর্বল রক্ষণাবেক্ষণ ফিক্সের কারণে হয়েছিল - যা একটি আন-ব্রাসযুক্ত একক লাইনে একটি দ্বিতীয় লাইন যুক্ত করেছিল। সুতরাং আসুন বিছানায় এই ধারণাটি করা যায় যে ব্র্যাকবিহীন একক লাইনগুলি ঠিক আছে?


2
আমি যদি একমাত্র সঠিক শব্দটিকে অন্য কোনও অনুসরণ করার জন্য সম্মতি জানায় তবে আমি সম্মত। যদি একটি থাকে তবে else whileআমি সম্ভবত খেয়ালও করতাম না যে কোডের দ্রুত স্কিমিংয়ের মধ্যে একটি লুপ ছিল, বিশেষত যদি আমি যে শর্তটি খুঁজছিলাম তা যদি if দ্বারা সন্তুষ্ট হয়।
ড্রার ক্লারিস

3
এটা মজার. প্রত্যেকে বলেছে যে সবকিছু ধনুর্বন্ধনীতে থাকলে এটি পড়া সহজ। আমি বিপরীতটি সত্য বলে মনে করি। যদি এটি কেবল একটি বিবৃতি থাকে তবে এটিকে বন্ধনী থেকে দূরে রাখলে এটি পড়া সহজ হয়। কম বিশৃঙ্খলা। এটি কেবলমাত্র কারণ আমি সর্বদা এটি করে চলেছি।
জেফ ডেভিস 15

2
@ জেফডাভিস এটি একটি ভাল ক্যাচ "পড়ার পক্ষে সহজ" অযথা পবিত্র যুদ্ধের একটি সাধারণ আমন্ত্রণ। আমি একজনকে ধনুর্বন্ধনী পছন্দ করি তবে অপ্রাসঙ্গিক "ইজিস্টোরডোরড" আবর্জনার কারণে নয় (উদাহরণস্বরূপ আমার কাছে এটি সম্পূর্ণ বিপরীত) তবে আরও কোড রক্ষণাবেক্ষণে ভাঙ্গা শক্ত বলে because উপায় দ্বারা ওপি তাদের প্রশ্নে এটি আরও ভাল বানান: হস্তক্ষেপগুলি বন্ধনী করা else whileছাড়া "নিরাপদ" হিসাবে বিবেচনা করা হয় না ?
gnat

@JeffDavis - আমি জানি এই থ্রেড দুই বছর বয়সী, কিন্তু অ্যাপল সম্প্রতি আবিষ্কার কেন ধনুর্বন্ধনী ব্যবহার করছেন না না একটি ভাল ধারণা andrewbanks.com/...
অ্যান্ড্রু

@ অ্যান্ড্রু যাইহোক, অ্যাপলের সুইফট ভাষা এখন স্পষ্টভাবে এক-লাইন প্রবাহ নিয়ন্ত্রণ নিষিদ্ধ করেছে। সেই বাগটি এটি করার অন্যতম কারণ হতে পারে।
সুলতান

6

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

    if(blah)
    {
     ....
    }
    else
    {
       while(!bloop()
       {
        bar;
       }
    }

6

আমি পদ্ধতি নিষ্কাশন এবং এটি করতে হবে

if ( blah )
{
    ...
}
else
{
   newMethod();
}

রিফ্যাক্টরিং ক্যাটালগ সাইটে "নিষ্কাশন পদ্ধতি" পদ্ধতির ব্যাখ্যাটি দেখুন :

আপনার একটি কোড টুকরা রয়েছে যা একসাথে গ্রুপ করা যেতে পারে।

খণ্ডটিকে এমন পদ্ধতিতে রূপান্তর করুন যার নাম পদ্ধতির উদ্দেশ্য ব্যাখ্যা করে।

void printOwing() {
    printBanner();

    //print details
    System.out.println ("name:    " + _name);
    System.out.println ("amount    " + getOutstanding());
}

                                                                                                         http://www.refactoring.com/catalog/arrow.gif

void printOwing() {
    printBanner();
    printDetails(getOutstanding());
}

void printDetails (double outstanding) {
    System.out.println ("name:    " + _name);
    System.out.println ("amount    " + outstanding);
}

নির্ভর করে ... উদাহরণস্বরূপ, যখন লুপটি ফাংশন স্তরের ডেটা ব্যবহার করে, এখন আপনাকে মডিউলটিতে (বা শ্রেণি, যদি সি ++ ব্যবহার করে) স্তরটি আরও বেশি থাকে। এবং যদি কোডের কেবল একটি ছোট স্নিপেট হয় তবে আপনি তুচ্ছ পদ্ধতিতে চলে আসছেন। তবে কখনও কখনও, পরিস্থিতির উপর নির্ভর করে, আমি সম্মত হই।
অ্যান্ড্রু

1
+1 স্মার্ট সি ++ সংকলক একটি ফাংশনটি ইনলাইন করতে পারে। নেট পরিবেশে ছোট কার্যাদি জেআইটির কারণে ভাল better
চাকরী

4

আমি এটিকে কোডিংয়ের একটি খারাপ অভ্যাস হিসাবে বিবেচনা করব। কখনও কখনও এটি পুরোপুরি সূক্ষ্মভাবে কাজ করে এবং কোডটি সংকলন এবং চালনায় আপনার কোনও সমস্যা হবে না। অন্যান্য সময়ে এটি গুরুতর ত্রুটির কারণ হতে পারে এবং আপনি এই বাগটি ঠিক করতে কয়েক ঘন্টা ব্যয় করবেন।

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

if ( blah )
{
    ...
}
else
{
    while ( !bloop() )
    {
        bar();
    }
}

ব্লকগুলিতে কোড রাখা ভাল অনুশীলন। এটি এটিকে বোঝার এবং ডিবাগ করা সহজ এবং সহজ করে তোলে।


4

এটি ঠিক থাকতে পারে যদি এটি সরল থাকে তবে ব্যক্তিগতভাবে আমি এটি পছন্দ করি না এবং / অন্য কোডগুলি ব্লক করে থাকলে আমার পছন্দটি এমনকি সহজতমের জন্যও ব্রেস ব্যবহার করা। এটা আমার জন্য পরিপাটি।

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

বিষয়টি হ'ল জিনিস পরিষ্কার করা যাতে অন্যান্য প্রোগ্রামাররা এক নজরে সঠিক এবং ভুল কী তা দেখতে পারে। কোডটি লিখুন যাতে প্যাটার্নটি সঠিক দেখায় এবং জার করে না।

এর উল্টো দিকটি হ'ল আমি হয়ত কিছু লোককে দাবী করতে দেখলাম যে কিছু দৃষ্টান্তে এটি ভাল পড়ে reads আমি যদি কিছু উত্স পেয়ে থাকি তবে অন্য কিছু করার জন্য অপেক্ষা করার সময় আমার এই প্রক্রিয়াজাতকরণটি করা দরকার do তারপরেও আমার কাছে এখনও অন্য ব্লকের ভিতরে লুপ নেস্ট করার কোনও পার্থক্য নেই।


3

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

if (...)
   foo();
else while(...)
   bar();

... আমি আসলে এটি " else while(...)" উল্লেখযোগ্যভাবে পঠনযোগ্য! এটি এমনকি সরল ইংরেজি মত পড়া! তবে আমি অনুমান করি যে লোকেরা সকলেই এটিকে অদ্ভুত বলে মনে করবে কারণ কমপক্ষে এটি বলা অস্বাভাবিক।

শেষ পর্যন্ত, আমরা সকলেই এটি ব্রেস দিয়ে ইডিয়ট প্রুফ তৈরি করার ঝোঁক রাখি যদিও ... কারণ, ভাল, আপনি জানেন।


3
বিশেষত পাঠযোগ্য পরে কিছু নির্দোষ রক্ষণাবেক্ষণকারী পরিবর্তন হবেন যে else while(...) bar();ভালো কিছু করার জন্য else while(...) foobar(); bar();:)
মশা

3
ভাল, আমি বলব যে এটি একটি দুর্দান্ত বোকা এবং বিপজ্জনক নিষ্পাপ রক্ষণাবেক্ষণকারী। আমি বোকা ত্রুটিগুলি এড়ানোর জন্য এটিকে নীরব করার নীতিটি জানি ... তবে তবুও এদিকে যাওয়া মোটামুটি দুঃখজনক। তবে আমি জানতাম যে আমি এই জাতীয় মন্তব্য এবং ডাউনভোটগুলি পেয়ে যাব। সমস্যা নেই.
ড্যাগলিনিস

2
"সর্বদা কোড হিসাবে মনে করুন যে আপনার কোডটি বজায় রাখবে সেই ব্যক্তি হিংস্র মনোবিজ্ঞানী যিনি জানেন আপনি কোথায় থাকেন" " ( অ্যালান Braggins )
মশা

1
ঠিক আছে, আপনার কোডটিতে কাজ করা কারোর বোকামি স্তরটি আপনি কী অনুমান করেন তা সবকিছুই ফোটায়। আমি যুক্তি দিচ্ছি যে যদি আপনার "রক্ষণাবেক্ষণকারী" এই চারটি কোডের কোডের মাধ্যমে বিভ্রান্ত হন ... তবে আপনার হাতে একটি বিশাল সমস্যা রয়েছে। এবং যদি এটি হিংসাত্মক মনো, আপনার দুটি আছে two ;)
ডাগলিনি

1
যদি - ভাল লিঙ্কটি আমি উপরে উল্লেখ করেছি, এই উক্তির সংস্করণটি প্রসারিত হয়েছে: প্রোগ্রামার 1: 'এখানে একটি দুর্দান্ত উক্তি রয়েছে - "সর্বদা কোড হিসাবে মনে হয় যে আপনার কোডটি বজায় রাখবে এমন ব্যক্তি হিংস্র মনোবিজ্ঞানী যিনি জানেন আপনি কোথায় থাকেন" " । প্রোগ্রামার 2: (রক্ষণাবেক্ষণকারীকে দেখায়) 'আপনি "যেমন" এর অর্থ কী? "
gnat

2

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

if(blah) {
    foo();
}
else {
    bar();
}

ধনুর্বন্ধনী অবস্থান সম্ভবত ধর্মের বাইরে কিছু (বা সম্ভবত সহ) তুলনায় আরও যুক্তি ট্রিগার!
অ্যান্ড্রু

একমত। অবস্থানটি নয়, তাদের অস্তিত্বের উপর জোর দেওয়ার জন্য আমার উত্তর সম্পাদনা করবে।
Tsvetomir Dimitrov

2

ধনুর্বন্ধকের সাথে এত ভুল যে এতগুলি লোক এগুলি এড়াতে চেষ্টা করছে?

ঠিক কোন সমস্যার else whileসমাধান হয়?

ধনুর্বন্ধনী সস্তা এবং ভাল, এবং তারা কোড উদ্দেশ্য স্পষ্ট এবং চতুর এবং মজাদার বিরোধিতা হিসাবে সহজ।

ইউনিক্স দর্শনের উদ্ধৃতি:

স্পষ্টতার বিধি: বুদ্ধিমানের চেয়ে স্পষ্টতা ভাল।

যেহেতু রক্ষণাবেক্ষণ এত গুরুত্বপূর্ণ এবং ব্যয়বহুল, তাই প্রোগ্রামগুলি লিখুন যেমন তারা করেন যে সর্বাধিক গুরুত্বপূর্ণ যোগাযোগ তাদের সম্পাদনকারী কম্পিউটারের নয় বরং সেই মানব জাতির জন্য যারা ভবিষ্যতে উত্স কোডটি পড়বেন এবং বজায় রাখবেন (নিজেকে সহ)।


1

এতে কোনও ভুল নেই

if (blah)
    foo();
else
    bar();

ঠিক তেমন কোনও সমস্যা নেই

if (blah) foo(); else bar();

সঠিক পরিস্থিতিতে (আপনার পরিস্থিতি পরিবর্তিত হতে পারে তবে আপনার যদি প্রচুর পুনরাবৃত্তি কোড থাকে তবে সেই নির্দিষ্ট শৈলীটি সবচেয়ে ভাল ব্যবহৃত হয় - তবে প্রতিটি লাইনের দৃষ্টিভঙ্গি স্টাইলিস্টিক ইনডেন্টেশনের চেয়ে বেশি গুরুত্বপূর্ণ)

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


এছাড়াও, আমি এই কোডটি আগে দেখেছি:

if (x) foo()
{
  bar();
}

এবং এটি কোডিং স্ট্যান্ডার্ড নাজি নিজে লিখেছিলেন (যিনি সমস্ত কিছুর জন্য বন্ধনীর প্রতি জোর দিয়েছিলেন)।


1

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

if (blah) {
  blub();
} else
  while (!bloop()) {
    bar();
  }

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

ব্যক্তিগতভাবে, আমি কোড খুঁজে পাই যা ধনুর্বন্ধনী এবং লাইনব্রেকগুলি খুব বেশি পঠনযোগ্য বাদ দেয় কারণ এটি বিশৃঙ্খলা এড়ায়:

if (blah) blub();
else while (!bloop()) bar();

তবে অবশ্যই, অনেক বিকাশকারী চিরকাল এবং একদিন এই জাতীয় জিনিস নিয়ে তর্ক করতে খুব খুশি।

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