লুপের জন্য বিরতি ব্যবহার করা কি খারাপ অভ্যাস? [বন্ধ]


123

লুপের ভিতরে breakবিবৃতি ব্যবহার করা কি খারাপ অভ্যাস ?for

বলুন, আমি একটি অ্যারেতে একটি মান সন্ধান করছি। লুপের break;জন্য প্রস্থান করার জন্য একটি ফর লুপের মধ্যে এবং যখন মানটি পাওয়া যায় তার সাথে তুলনা করুন ।

এটা কি খারাপ অভ্যাস? একটি পরিবর্তনশীল সংজ্ঞায়িত: আমি বিকল্প ব্যবহার দেখেছি vFoundএবং সত্য এটি সেট যখন মান পাওয়া যায় এবং চেক vFoundমধ্যে forবিবৃতি শর্ত। তবে কেবল এই উদ্দেশ্যেই কি নতুন ভেরিয়েবল তৈরি করা দরকার?

আমি লুপের জন্য একটি সাধারণ সি বা সি ++ এর প্রসঙ্গে জিজ্ঞাসা করছি।

PS: মিশ্র কোডিং নির্দেশিকা বিরতি ব্যবহারের বিরুদ্ধে পরামর্শ দেয়।


28
স্থাপন করবেন না breakহিসাবে একই লীগ goto:)
BoltClock

2
এর, আমি তাদের ঠিক একই লিগে রাখি না ... মিশ্র বিধি বিরতি নির্দিষ্ট করে, যদি আমি সঠিকভাবে মনে করি।
কিকি

1
লুপের অভ্যন্তরে বিরতি ব্যবহার না করার আমি কেবলমাত্র কারণটিই ভাবতে পারি যখন আপনি এখনও আরও আইটেমগুলি প্রক্রিয়া করতে পারেন যা আপনি যা করছেন তার ফলাফল পরিবর্তন করতে পারে ...
ইউনেস

4
মিস্রা বিধি শিথিল করা হয়েছে: Misra.org.uk/forum/viewtopic.php?f=75&t=298
জোহান কোটলিনস্কি

উত্তর:


122

এখানে প্রচুর উত্তর, কিন্তু আমি এখনও এটি উল্লিখিত দেখিনি:

ব্যবহার breakবা এর সাথে সম্পর্কিত বেশিরভাগ "বিপদ"continueআপনি পরিপাটি, সহজেই পঠনযোগ্য লুপগুলি লিখলে লুপের লুপের থাকে। যদি আপনার লুপের বডি বেশ কয়েকটি স্ক্রিন দৈর্ঘ্যকে ছড়িয়ে দেয় এবং একাধিক নেস্টেড সাব-ব্লক থাকে তবে হ্যাঁ, আপনি সহজেই ভুলে যেতে পারেন যে বিরতির পরে কিছু কোড কার্যকর করা হবে না। তবে, যদি লুপটি সংক্ষিপ্ত এবং বিন্দুতে হয় তবে ব্রেক স্টেটমেন্টের উদ্দেশ্যটি সুস্পষ্ট হওয়া উচিত।

যদি কোনও লুপ খুব বেশি বড় হয়ে থাকে তবে পরিবর্তে লুপের মধ্যে এক বা একাধিক সু-নামযুক্ত ফাংশন কল ব্যবহার করুন। এটি না করার একমাত্র আসল কারণ হ'ল বাধা প্রক্রিয়াকরণ।


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

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

এই "নামযুক্ত ফাংশন কল (গুলি)" বাহ্যিকভাবে সংজ্ঞায়িত ব্যক্তিগত ফাংশনগুলির পরিবর্তে স্থানীয়ভাবে সংজ্ঞায়িত ল্যাম্বদা ফাংশন হতে পারে যা অন্য কোথাও ব্যবহৃত হবে না।
ডেভিডআরআর

135

না, বিরতি সঠিক সমাধান।

বুলিয়ান ভেরিয়েবল যুক্ত করার ফলে কোডটি পড়া আরও শক্ত হয়ে যায় এবং ত্রুটির সম্ভাব্য উত্স যুক্ত হয়।


2
সম্মত হয়। বিশেষত যদি আপনি একক শর্তের চেয়ে বেশি লুপটি প্রস্থান করতে চান। একটি লুপ ছেড়ে যাওয়ার বুলিয়ানটি তখন সত্যিই বিভ্রান্ত হতে পারে।
রেন্টোলজিস্ট

2
সে কারণেই আমি gotoস্তর 2+ নেস্ট করা লুপগুলি ভাঙ্গতে ব্যবহার করি - কারণ নেইbreak(level)
00

3
আমি বরং একটি ফাংশনে লুপ কোডটি রেখেছি এবং কেবল ফিরে আসব। এটি গোটো এড়িয়ে যায় এবং আপনার কোডটিকে ছোট ছোট অংশে বিভক্ত করে।
ডেভ ব্রান্টন

53

আপনি তাদের মধ্যে 'ব্রেক' বিবৃতি সহ প্রফেশনাল কোডের সমস্ত ধরণের সন্ধান করতে পারেন। এটি যখনই প্রয়োজন হবে সঠিকভাবে এটি ব্যবহার করা বুদ্ধিমান। আপনার ক্ষেত্রে এই বিকল্পটি কেবল লুপ থেকে বেরিয়ে আসার উদ্দেশ্যে পৃথক ভেরিয়েবল তৈরি করার চেয়ে ভাল।


47

breakপাশাপাশি continueএকটি forলুপ ব্যবহার করা পুরোপুরি ঠিক আছে।

এটি কোডটিকে সহজতর করে এবং তার পাঠ্যতা উন্নত করে।


হ্যাঁ ... একটি সময়ের জন্য আমি ধারণাটি পছন্দ করি নি এবং এর চারপাশে কোড করেছিলাম, তবে আমি বুঝতে পারি না ... "ওয়ার্কআরাউন্ড" প্রায়শই একটি রক্ষণাবেক্ষণ দুঃস্বপ্ন। ঠিক আছে, একটি দুঃস্বপ্ন নয়, তবে আরও ত্রুটিযুক্ত।
মেটালমাইকস্টার

24

দূরে খারাপ অভ্যাস, পাইথন (এবং অন্যান্য ভাষায়?) থেকে বাড়ানো forলুপ গঠন তাই এটা অংশ হবে শুধুমাত্র যদি লুপ কার্যকর করা না break

for n in range(5):
    for m in range(3):
        if m >= n:
            print('stop!')
            break
        print(m, end=' ')
    else:
        print('finished.')

আউটপুট:

stop!
0 stop!
0 1 stop!
0 1 2 finished.
0 1 2 finished.

সমান কোড ছাড়াই breakএবং সেই সুবিধাজনক else:

for n in range(5):
    aborted = False
    for m in range(3):
        if not aborted:
            if m >= n:
                print('stop!')
                aborted = True
            else:            
                print(m, end=' ')
    if not aborted:
        print('finished.')

2
ওহ, আমি এটি পছন্দ করি এবং মাঝে মাঝে সি.-এর জন্যও শুভেচ্ছা জানাতাম, যা অস্পষ্টতা ছাড়াই ভবিষ্যতের সি-জাতীয় ভাষায় রূপান্তরিত হতে পারে।
সুপারক্যাট

"সি-এর মতো ভাষা": পি
নির্বানস্বাপ

15

ব্রেক স্টেটমেন্ট ব্যবহার করে সহজাত ভুল কিছু নেই তবে নেস্টেড লুপগুলি বিভ্রান্ত হতে পারে। পাঠযোগ্যতার উন্নতি করতে অনেকগুলি ভাষা ( কমপক্ষে জাভা করে ) লেবেলগুলিতে বিরতি সমর্থন করে যা পাঠযোগ্যতার ব্যাপক উন্নতি করবে।

int[] iArray = new int[]{0,1,2,3,4,5,6,7,8,9};
int[] jArray = new int[]{0,1,2,3,4,5,6,7,8,9};

// label for i loop
iLoop: for (int i = 0; i < iArray.length; i++) {

    // label for j loop
    jLoop: for (int j = 0; j < jArray.length; j++) {

        if(iArray[i] < jArray[j]){
            // break i and j loops
            break iLoop;
        } else if (iArray[i] > jArray[j]){  
            // breaks only j loop
            break jLoop;
        } else {
            // unclear which loop is ending
            // (breaks only the j loop)
            break;
        }
    }
}

আমি বলব বিরতি (এবং প্রত্যাবর্তন) বিবৃতিগুলি প্রায়শই সাইক্লোমেটিক জটিলতা বাড়ে যা কোড প্রমাণ করতে এটি কঠিন করে তোলে যে সমস্ত ক্ষেত্রে সঠিক কাজ করছে।

আপনি যদি কোনও নির্দিষ্ট আইটেমের ক্রমকে ঘুরিয়ে দেওয়ার সময় বিরতি ব্যবহার করার কথা ভাবছেন তবে আপনি আপনার ডেটা ধরে রাখতে ব্যবহৃত ডেটা স্ট্রাকচারটি পুনর্বিবেচনা করতে চাইতে পারেন। সেট বা মানচিত্রের মতো কিছু ব্যবহার করা আরও ভাল ফলাফল সরবরাহ করতে পারে।


4
সাইক্লোমেটিক জটিলতার জন্য +1।
sp00m

.NET প্রোগ্রামাররা লিনকু ব্যবহারকে জটিল লুপগুলির সম্ভাব্য বিকল্প হিসাবে অন্বেষণ করতে চাইতে পারে for
ডেভিডআরআর

14

বিরতি ব্যবহারের জন্য সম্পূর্ণ গ্রহণযোগ্য বিবৃতি (তাই চালিয়ে যাওয়া , বিটিডাব্লু)। এটি কোড পাঠের যোগ্যতা সম্পর্কে - যতক্ষণ না আপনার কাছে অতি-জটিল জটিল লুপ থাকে না, ঠিক আছে।

এগুলি এর মতো নয় যে তারা গোটোর মতো একই লিগ ছিল । :)


আমি দেখেছি এটা যুক্তি দেখান যে একটি বিরতি বিবৃতি হয় কার্যকরভাবে একটি এতে যান
glenatron

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

1
শুনেছি এটা যুক্তি দেখান যে একটি ফাংশন জন্য একাধিক প্রস্থান পয়েন্ট থাকার হয় কার্যকরভাবে একটি এতে যান । ; ডি
গ্লেনাট্রন

2
@glenatron গোটোর সমস্যা গোটো স্টেটমেন্ট নয়, এটি যে লেবেলের সাথে গোটো লাফ দেয় সেটিই সমস্যা। আপনি যখন একটি গোটো বিবৃতিটি পড়েন, নিয়ন্ত্রণ প্রবাহ সম্পর্কে কোনও অনিশ্চয়তা নেই। আপনি যখন কোনও লেবেলটি পড়েন, নিয়ন্ত্রণ প্রবাহ সম্পর্কে প্রচুর অনিশ্চয়তা থাকে (এই লেবেলে নিয়ন্ত্রণ স্থানান্তরকারী সমস্ত গোটো কোথায়?) ব্রেক স্টেটমেন্ট কোনও লেবেল প্রবর্তন করে না, সুতরাং এটি কোনও নতুন জটিলতার পরিচয় দেয় না।
স্টিফেন সি স্টিল

1
"বিরতি" একটি বিশেষীকরণযোগ্য গোটো যা কেবলমাত্র ব্লকগুলিই ছাড়তে পারে। "গোটো" এর সাথে ;তিহাসিক সমস্যাগুলি হ'ল (১) এটি হতে পারে এবং প্রায়শই ওভারল্যাপিং লুপ ব্লক এমনভাবে নির্মাণ করা হত যা সঠিক নিয়ন্ত্রণ কাঠামো দিয়ে সম্ভব নয়; (২) একটি "যদি-তারপর" নির্মাণের একটি সাধারণ উপায় যা সাধারণত "মিথ্যা" ছিল তা ছিল কোডের কোনও সম্পর্কযুক্ত জায়গায় সত্যিকারের শাখাটি বন্ধ করে দেওয়া, এবং তারপরে আবার শাখা করা। এটি বিরল ক্ষেত্রে দুটি শাখা এবং সাধারণ ক্ষেত্রে শূন্যের জন্য ব্যয় করতে পারে তবে কোডটি ঘৃণ্য দেখাচ্ছে।
সুপারক্যাট

14

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

আপনি কিছু না পাওয়া পর্যন্ত লুপিংয়ের ক্ষেত্রে, আপনি বাইরে বেরোনোর ​​সময় খুঁজে পাওয়া যায় না বলে পার্থক্য করার সমস্যাটি দেখান। এটাই:

for (int x=0;x<fooCount;++x)
{
  Foo foo=getFooSomehow(x);
  if (foo.bar==42)
    break;
}
// So when we get here, did we find one, or did we fall out the bottom?

সুতরাং ঠিক আছে, আপনি একটি পতাকা সেট করতে পারেন, বা একটি "পাওয়া" মান শূন্য করতে শুরু করতে পারেন। কিন্তু

সে কারণেই আমি সাধারণভাবে আমার অনুসন্ধানগুলিকে ফাংশনগুলিতে ঠেলে দিতে পছন্দ করি:

Foo findFoo(int wantBar)
{
  for (int x=0;x<fooCount;++x)
  {
    Foo foo=getFooSomehow(x);
    if (foo.bar==wantBar)
      return foo;
  }
  // Not found
  return null;
}

এটি কোড খাড়া করতে সহায়তা করে। মূল লাইনে, "সন্ধান করুন" একটি একক বিবৃতিতে পরিণত হয় এবং যখন শর্তগুলি জটিল হয়, সেগুলি কেবল একবার লেখা হয়।


1
ঠিক কী বলতে চেয়েছি আমি। প্রায়শই যখন আমি নিজেকে ব্যবহার করতে পাই তখন আমি breakকোডটিকে কোনও ফাংশনে রিফ্যাক্টর করার জন্য কিছু উপায় খুঁজে বের করার চেষ্টা করি, যাতে returnপরিবর্তে আমি এটি ব্যবহার করতে পারি ।
রিনি সরসু

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

আপনার উত্তরটি কয়েকটিকে একাধিক রিটার্ন স্টেটমেন্টগুলি ব্যবহার করার পরামর্শ দেওয়ার জন্য অনুরোধ করতে পারে ।
ডেভিডআরআর

13

এটি ভাষার উপর নির্ভর করে। আপনি সম্ভবত এখানে বুলিয়ান চলক পরীক্ষা করতে পারেন:

for (int i = 0; i < 100 && stayInLoop; i++) { ... }

কোনও অ্যারেতে চুলকানোর সময় এটি করা সম্ভব নয়:

for element in bigList: ...

যাইহোক, breakউভয় কোডই আরও পঠনযোগ্য করে তুলবে।


7

আপনার উদাহরণে আপনি লুপের জন্য পুনরাবৃত্তির সংখ্যা জানেন না । পরিবর্তে লুপ করার সময় কেন ব্যবহার করবেন না , যা শুরুতে পুনরাবৃত্তির সংখ্যাটি অনির্দিষ্ট হতে দেয়?

সুতরাং সাধারণভাবে ব্রেক স্টেটমেন্ট ব্যবহার করা প্রয়োজন হয় না , কারণ লুপটি কিছুক্ষণ লুপ হিসাবে আরও ভালভাবে বর্ণনা করা যায় ।


1
একটি "for" লুপ প্রায়শই ভাল থাকে যদি সেখানে পরিচিত সংখ্যার পুনরাবৃত্তির পরিমাণ থাকে। বলা হয়ে থাকে, কিছুক্ষণের মধ্যে (1) লুপ কখনও কখনও এমন দৃশ্যে আরও ভাল হয় যেখানে কেউ কোনও আইটেম অনুসন্ধান করে এবং এটি উপস্থিত না থাকলে এটি তৈরির পরিকল্পনা করে। সেক্ষেত্রে কোডটি আইটেমটি খুঁজে পেলে এটি সরাসরি বিরতি দেয় এবং যদি অ্যারের শেষে আঘাত করে তবে এটি একটি নতুন আইটেম তৈরি করে এবং তারপরে একটি বিরতি ঘটায়।
সুপারক্যাট

2
প্রদত্ত উদাহরণে - কোনও কীটির জন্য অ্যারের মাধ্যমে সন্ধান করা, লুপের জন্য হ'ল যথাযথ প্রতিচ্ছবি। আপনি কোনও অ্যারে দিয়ে হাঁটতে কিছুক্ষণ লুপ ব্যবহার করবেন না। আপনি লুপ জন্য একটি ব্যবহার। (অথবা যদি পাওয়া যায় তবে প্রতিটি লুপ)। আপনি অন্যান্য প্রোগ্রামারদের সৌজন্য হিসাবে এটি করেন, যেহেতু তারা "for (int i = 0; i <raleleth; i++)" অবিলম্বে "অ্যারের মধ্য দিয়ে হাঁটা" হিসাবে নির্মাণ করুন এই বিরতিতে বিরতি যুক্ত করছে কেবলমাত্র "যদি পারেন তবে তাড়াতাড়ি প্রস্থান করুন" বিবৃতি।
ক্রিস চডমোর

7

আমি অন্যদের সাথে সম্মত যারা ব্যবহার করার পরামর্শ দেয় break। সুস্পষ্ট পরিণতিজনক প্রশ্নটি হল যে কেউ অন্যথায় সুপারিশ করবে কেন? ঠিক আছে ... যখন আপনি বিরতি ব্যবহার করেন, আপনি ব্লকের বাকী কোড এবং বাকী পুনরাবৃত্তিগুলি এড়িয়ে যান। কখনও কখনও এটি ত্রুটির কারণ হতে পারে, উদাহরণস্বরূপ:

  • ব্লকের শীর্ষে অর্জিত কোনও সংস্থান নীচে ছেড়ে দেওয়া যেতে পারে (এটি forলুপগুলির অভ্যন্তরের ব্লকের জন্যও সত্য ) তবে একটি breakবিবৃতিতে "আধুনিক" থেকে "অকাল" প্রস্থান হওয়ার পরে এই রিলিজ পদক্ষেপটি ঘটনাক্রমে এড়িয়ে যেতে পারে ( সি ++, "আরআইআইআই" এটি নির্ভরযোগ্য এবং ব্যতিক্রম-নিরাপদ উপায়ে পরিচালনা করার জন্য ব্যবহৃত হয়: মূলত, অবজেক্ট ডেস্ট্রাক্টরগুলি ফ্রি রিসোর্সগুলি নির্ভরযোগ্যভাবে কোনও সুযোগ ছাড়াই নির্ধারিত হয়)

  • কেউ আবার forবিবৃতিযুক্ত প্রস্থান শর্ত আছে তা না ভেবে বিবৃতিতে শর্তসাপেক্ষ পরীক্ষাটি পরিবর্তন করতে পারে

  • এনডিআইমের উত্তরে লক্ষ্য করা গেছে যে কিছু লোক breakতুলনামূলকভাবে সামঞ্জস্যপূর্ণ লুপ রান-টাইম বজায় রাখতে এড়াতে পারে তবে আপনি breakবুলিয়ান প্রারম্ভিক-প্রস্থান নিয়ন্ত্রণ ভেরিয়েবল ব্যবহারের সাথে তুলনা করছেন যেখানে এটি নেই

এই ত্রুটিগুলি পর্যবেক্ষণ করা লোকেরা প্রত্যেকেই বুঝতে পারে যে এই "কোনও বিরতি" নিয়মের দ্বারা তাদের প্রতিরোধ / প্রশমিত করা যায় ... প্রকৃতপক্ষে "সুরক্ষিত" প্রোগ্রামিংয়ের জন্য "নিরাপদ" প্রোগ্রামিংয়ের জন্য একটি সম্পূর্ণ সম্পর্কিত কৌশল রয়েছে, যেখানে প্রতিটি ফাংশন থাকার কথা একটি একক প্রবেশ এবং প্রস্থান পয়েন্ট (যেমন কোনও গোটো নয়, প্রথম দিকে ফিরে আসবে না)। এটি কিছু ত্রুটিগুলি মুছে ফেলতে পারে, তবে এটি অবশ্যই অন্যদের পরিচয় দেয়। কেন তারা এটা করে?

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

হ্যাঁ, তবে তবে আমি আবার এমন লোকদের দ্বারা কোডগুলিতে বাগগুলি দেখেছি যারা ধর্মীয়ভাবে এড়াতে চেষ্টা করেছিল break। এটি এড়ানো হয়নি তবে ব্রেক ব্যবহারের পরিবর্তিত শর্তগুলির মধ্যে চিন্তা করতে ব্যর্থ হয়েছিল।
টোমা জ্যাটো - মনিকা

5

এটি ব্যবহারের জন্য পুরোপুরি বৈধ break- অন্যরা যেমন উল্লেখ করেছে, এটি একই লিগে আর নেই goto

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


5

আমি বর্তমানে যে কোডবেসে কাজ করছি তার উপর কিছু বিশ্লেষণ করেছি (জাভাস্ক্রিপ্টের ৪০,০০০ লাইন)।

এর মধ্যে আমি মাত্র 22 টি breakবিবৃতি পেয়েছি :

  • 19 ভিতরে ব্যবহার করা হয়েছিল switch স্টেটমেন্টের (আমাদের কাছে মোট 3 টি সুইচ স্টেটমেন্ট রয়েছে!)
  • 2 টি forলুপের অভ্যন্তরে ব্যবহৃত হয়েছিল - একটি কোড যা আমি অবিলম্বে পৃথক ফাংশনে রিফ্যাক্টর হিসাবে প্রতিস্থাপন করা এবং এর সাথে প্রতিস্থাপন করা হিসাবে শ্রেণিবদ্ধ করেreturn বিবরণী হিসাবে বিবরণী ।
  • চূড়ান্ত breakঅভ্যন্তরের whileলুপের জন্য ... আমি দৌড়ে git blameএসে দেখি কে এই বকাবকি লিখেছেন!

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

আমি continueবিবৃতি জন্য অনুসন্ধান । কিছুই পাওয়া যায় নি।



4

এম্বেড করা বিশ্বে, এখানে প্রচুর কোড রয়েছে যা নিম্নলিখিত রচনাগুলি ব্যবহার করে:

    while(1)
    { 
         if (RCIF)
           gx();
         if (command_received == command_we_are_waiting_on)
           break;
         else if ((num_attempts > MAX_ATTEMPTS) || (TickGet() - BaseTick > MAX_TIMEOUT))
           return ERROR;
         num_attempts++;
    }
    if (call_some_bool_returning_function())
      return TRUE;
    else
      return FALSE;

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

আমার ব্যক্তিগত অভিমত হ'ল যতক্ষণ না অনির্দিষ্টকালের জন্য লুপে রোধ করার জন্য যথাযথ যত্ন নেওয়া হয় ততক্ষণ এই পদ্ধতিতে লুপটি লেখার কোনও ভুল নেই।


1
আপনি কি এই বিস্তারিত বলতে পারেন? এটি আমার কাছে দেখে মনে হচ্ছে যেন লুপটি একেবারে কিছুই করে না ... যদি না continueঅ্যাপ্লিকেশন যুক্তির ভিতরে বিবৃতি না থাকে । সেখানে আছে?
রিনি সরসু

1
অব্যাহত বিবৃতি অপ্রয়োজনীয় কারণ আপনি ইতিমধ্যে অসীম লুপ দ্বারা আবদ্ধ। আপনি মূলত একটি লক্ষ্য অর্জনের জন্য প্রয়োজনীয় প্রয়োজনীয় যুক্তিটি সম্পাদন করেন এবং যদি সেই লক্ষ্যটি এন সংখ্যায় প্রয়াসের সাথে পূরণ না হয় বা সময়সাপেক্ষ শর্তের মেয়াদ শেষ হয়ে যায়, আপনি একটি বিরতি নির্মাণের মাধ্যমে লুপটি প্রস্থান করুন এবং সংশোধনমূলক পদক্ষেপ নিন বা ত্রুটির কলিং কোডকে অবহিত করবেন। আমি ইউসিগুলিতে প্রায়শই এই ধরণের কোড দেখতে পাই যা একটি সাধারণ বাসের মাধ্যমে যোগাযোগ করে (আরএস -৮৮৫, ইত্যাদি) আপনি মূলত লাইনটি ধরে ফেলতে এবং সংঘর্ষ ছাড়াই যোগাযোগ করার চেষ্টা করেন, যদি সংঘর্ষ ঘটে তবে আপনি একটি এলোমেলো সংখ্যা দ্বারা নির্ধারিত একটি সময়কালের জন্য অপেক্ষা করুন এবং চেষ্টা করুন আবার।
নট

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

"যদি (কল_সোম_বুল_রেটর্নিং_ফাংশন ()) সত্য ফিরে আসে; অন্যথায় মিথ্যা ফিরিয়ে দিন;" সবেমাত্র "কল কল_সোম_বুল_রেটর্নিং_ফাংশন ()" হতে পারে
ফ্র্যাঙ্কস্টার

3

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

এই ক্ষেত্রে এমনকি পতাকা নির্ধারণ করা এমনকি সমস্তটির পরে পতাকাটির মানটি পরীক্ষা করাও বুদ্ধিমান হয়ে উঠবে for লুপ পুনরাবৃত্তির প্রকৃতপক্ষে সঞ্চালনের । অবশ্যই, লুপের পুনরাবৃত্তির জন্য সমস্ত কোড কোড চালানো দরকার যা এখনও একই সময়ে সময় নেয়।

আপনি যদি রান সময় সম্পর্কে চিন্তা না করেন ... ব্যবহার করুন break;এবং continue;কোডটি পড়া সহজ করে তুলুন।


1
সময় নির্ধারণ করা যদি গুরুত্বপূর্ণ হয় তবে আপনি কিছুটা ঘুমানোর থেকে ভাল হয়ে উঠতে পারেন এবং সিস্টেমের সংস্থানগুলি সংরক্ষণের চেয়ে প্রোগ্রামটি ব্যবহারযোগ্য-অকেজো অপারেশনটি করার চেয়ে ভাল।
বিগস

2

উপর মিশ্রের 98 বিধি, যে সি দেব আমার কোম্পানির উপর ব্যবহার করা হয়, বিরতি বিবৃতি ব্যবহার করা যাইবে ...

সম্পাদনা করুন: MISRA '04 এ বিরতির অনুমতি রয়েছে


2
ঠিক কেন আমি এই প্রশ্ন জিজ্ঞাসা! কোডিং গাইডলাইন হিসাবে এই জাতীয় নিয়ম থাকার কোনও কারণ নেই find এছাড়াও, এখানে সবাই যেমন বলেছে, বিরতি; ভালো দেখায়.
কিকি 11

1
কেন এটি নিষিদ্ধ করা হয়েছে আমি ঠিক জানি না (আমার চেয়ে আরও চতুর ব্যক্তি এটি সম্পর্কে চিন্তাভাবনা করে ...) তবে ব্রেক (এবং একাধিক প্রত্যাবর্তন) পাঠযোগ্যতার জন্য ভাল (আমার মতে, তবে আমার মতামত কর্পোরেটের নিয়ম নয় ... )
বেনোট

1
উহ, মিস্রার বিধিগুলি বিরতি বিবৃতিগুলি ব্যবহারের অনুমতি দেয়: Misra.org.uk/forum/viewtopic.php?f=75&t=298
luis.espinal

আমরা মিস্রা 98 টি বিধি ব্যবহার করেছি ... এটি ঠিক যে মিশ্র 2004 বিধি পরিবর্তন করে
বেনোট

0

অবশ্যই, break;লুপ বা ফোরচ লুপ বন্ধ করার সমাধান। আমি এটি পিএইচপি ব্যবহার করে পূর্বে এবং লুপের জন্য এবং কাজ করতে পেলাম।


0

আমি দ্বিমত!

আপনি নিজের তৈরি করতে লুপটির অন্তর্নির্মিত কার্যকারিতাটি কেন উপেক্ষা করবেন? আপনার চাকাটি পুনর্নির্মাণের দরকার নেই।

আমি মনে করি এটির মতো লুপের জন্য আপনার চেকগুলি আপনার শীর্ষে রাখা আরও বোধগম্য

for(int i = 0; i < myCollection.Length && myCollection[i].SomeValue != "Break Condition"; i++)
{
//loop body
}

অথবা আপনার যদি প্রথমে সারিটি প্রক্রিয়া করার প্রয়োজন হয়

for(int i = 0; i < myCollection.Length && (i == 0 ? true : myCollection[i-1].SomeValue != "Break Condition"); i++)
{
//loop body
}

এইভাবে আপনি সমস্ত কিছু সম্পাদন করতে এবং অনেক ক্লিনার কোড তৈরি করতে কোনও ফাংশন লিখতে পারেন।

for(int i = 0; i < myCollection.Length && (i == 0 ? true : myCollection[i-1].SomeValue != "Break Condition"); i++)
{
    DoAllThatCrazyStuff(myCollection[i]);
}

অথবা আপনার অবস্থা জটিল হলে আপনি সেই কোডটিও সরিয়ে নিতে পারেন!

for(int i = 0; i < myCollection.Length && BreakFunctionCheck(i, myCollection); i++)
{
    DoAllThatCrazyStuff(myCollection[i]);
}

"পেশাদার কোড" যা বিরতিতে ছিটিয়ে থাকে তা আমার কাছে পেশাদার কোডের মতো শোনায় না। এটি অলস কোডিংয়ের মতো শোনাচ্ছে;)


4
অলস কোডিং IS পেশাদার কোড :)
জেসন

কেবলমাত্র এটি বজায় রাখতে
বাটে

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

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

1
হা হা। এই বিষয়টি বিবেচনা করুন যে নিরুৎসাহিত করা বেশিরভাগ লোকেরা breakযুক্তি দেয় যে এটি কোড পাঠযোগ্যতার জন্য। এখন আবার উপরের লুপগুলিতে 5 মাইল দীর্ঘ অবস্থার দিকে তাকাও ...
টোম জ্যাটো - মনিকা পুনরায় ইস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.