"যখন (সত্য)" লুপগুলি এত খারাপ? [বন্ধ]


218

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

do{
     //get some input.
     //if the input meets my conditions, break;
     //Otherwise ask again.
} while(true)

এখন আমার পরীক্ষার জন্য আমি কিছু কনসোল ইনপুট জন্য স্ক্যান করছি, তবে আমাকে জানানো হয়েছিল যে এই ধরণের লুপটি নিরুৎসাহিত করা হচ্ছে কারণ এটি ব্যবহারের breakঅনুরূপ goto, আমরা কেবল এটি করি না।

আমি পুরোপুরি বুঝতে পারি gotoএর জাভা চাচাতো ভাইয়ের ক্ষতি break:labelএবং আমি সেগুলি ব্যবহার না করার জন্য ভাল ধারণা বোধ করি। আমি আরও বুঝতে পেরেছি যে আরও একটি সম্পূর্ণ প্রোগ্রাম পালানোর আরও কিছু উপায় সরবরাহ করবে, উদাহরণস্বরূপ কেবল প্রোগ্রামটি শেষ করার জন্য বলুন, তবে এটি আমার অধ্যাপকের উদ্ধৃত কারণ নয়, তাই ...

এর সাথে কী হয়েছে do-while(true)?


23
আপনার শিক্ষককে জিজ্ঞাসা করুন, এই ধরণের জিনিসগুলি বেশ বিষয়গত।
ক্রিস ইবারল

18
গোটো সম্পর্কে ক্ষতিকারক কী তা বোঝার জন্য আমি এই নিবন্ধটিকে সহায়ক বলে মনে করেছি । সঙ্গে তুলনা breakসম্ভবত ভাল অর্থ, কিন্তু আসলে ভুল বোঝা। সম্ভবত আপনি এই বিষয়ে আপনার অধ্যাপককে শিক্ষিত করতে পারেন;) আমার অভিজ্ঞতায় অধ্যাপকরা প্রোগ্রামিংয়ের কারুকাজ সম্পর্কে খুব বেশি জানেন না।
ম্যাগনাস হফ

100
এ সম্পর্কে একমাত্র সত্যই, অবিসংবাদিত খারাপ জিনিসটি আমার মনে, সত্যটি যা do {} while (true)সমান while(true) {}এবং পরবর্তীটি আরও বেশি প্রচলিত রূপ এবং আরও পরিষ্কার।
ভু

11
কেউ যদি এর সাধারণ ভাবপূর্ণ শক্তির প্রশংসা না করে তবে breakতাদের উচিত এটি একটি ভাষায় প্রোগ্রামিংয়ের চেষ্টা করা। এটির জন্য ইচ্ছুক হওয়ার আগে এটি খুব বেশি লুপ নেবে না!
স্টিভেন

16
আমি হোমওয়ার্ক ট্যাগের সাথে একমত নই।
আআআ বি বি বি বি

উত্তর:


220

আমি এটি খারাপ বলব না - তবে সমানভাবে আমি সাধারণত অন্তত কোনও বিকল্পের সন্ধান করব।

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

breakপতাকার চেয়ে এটি কোথায় পরিষ্কার করা যায় তার উদাহরণ হিসাবে বিবেচনা করুন:

while (true)
{
    doStuffNeededAtStartOfLoop();
    int input = getSomeInput();
    if (testCondition(input))
    {
        break;
    }
    actOnInput(input);
}

এখন এটি একটি পতাকা ব্যবহার করতে বাধ্য করুন:

boolean running = true;
while (running)
{
    doStuffNeededAtStartOfLoop();
    int input = getSomeInput();
    if (testCondition(input))
    {
        running = false;
    }
    else
    {
        actOnInput(input);
    }
}

আমি পড়তে আরও জটিল হিসাবে দেখছি: এটি একটি অতিরিক্ত elseব্লক পেয়েছে , এটি actOnInputআরও উদাসীন, এবং যদি আপনি testConditionফিরে আসার পরে কী ঘটে তা কাজ করার চেষ্টা করছেন true, তবে সেখানে পরীক্ষা করার জন্য আপনাকে বাকীটির বাকী অংশটি যত্ন সহকারে দেখতে হবে check কিছু নয় পরelse ব্লক যা ঘটবে কিনা runningএ সেট করা হয়েছে falseনা বা।

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

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


3
আমি সম্মত হলাম এটি আমার কাছে পৌঁছানোর প্রথম সরঞ্জাম নয়, তবে মনে হয়েছে এটি এত পরিষ্কারভাবে সমস্যার যত্ন নিচ্ছে এবং আমি পরিষ্কার কোড পছন্দ করি।
জেহর্নাচ

3
@ এক্স-জিরো: হ্যাঁ, কখনও কখনও। যদি আপনি "ব্রেক "টিকে" প্রত্যাবর্তন "এ পরিণত করতে পারেন তবে এটি প্রায়শই সার্থকতা ... যদিও আপনি এখনও একটি দিয়ে শেষ করতে পারেনwhile (true)
জন স্কিইট

21
@ থ্রিথিয়ালিটি: আমি আমার কোডের বেশিরভাগটিকে যদিও যথাসম্ভব অনিচ্ছাকৃত থাকতে পছন্দ করি। এবং একটি যৌগিক কার্যভার সহ একটি শর্ত আমার কাছে আরও জটিল মনে হয়।
জন স্কিটি

3
@ ভিনস: হ্যাঁ, এবং লুপের শুরুতে আপনি যদি সহজে শর্তটি প্রকাশ করতে পারেন তবে তা দুর্দান্ত । তবে কখনও কখনও আপনি পারবেন না - এবং আমরা সেই পরিস্থিতিতেই কথা বলছি। আমার উত্তর দুটি বাক্য দয়া করে নোট করুন।
জন স্কিটে

6
@ ইসমাইল: আশা করি না। পোস্টগুলি কেবল তাদের সামগ্রীতে বিচার করা উচিত, লেখকের উপর নয়। হেক, আমি যদি এরিক লিপার্ট পোস্টটি ভুল করে / অনুপযোগী বলে মনে করি তবে আমি তাকেও নীচে নামিয়ে দেব। যদিও এটি এখনও ঘটেনি :)
জন স্কিটে

100

আফাইক কিছুই না, সত্যিই। শিক্ষকরা কেবলমাত্র এলার্জিযুক্ত goto, কারণ তারা কোথাও শুনেছেন এটি সত্যিই খারাপ। অন্যথায় আপনি কেবল লিখতেন:

bool guard = true;
do
{
   getInput();
   if (something)
     guard = false;
} while (guard)

যা প্রায় একই জিনিস।

হতে পারে এটি পরিষ্কার (কারণ সমস্ত লুপিং তথ্য ব্লকের শীর্ষে রয়েছে):

for (bool endLoop = false; !endLoop;)
{

}

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

4
Sensক্যমত্যটি হ'ল মূলত একটি পতাকা ভাঙ্গার চেয়ে ভাল যেহেতু এটি উদ্দেশ্যকে প্রকাশ করে? আমি দেখতে পাচ্ছি যে এটি উপকারী হবে। সমস্ত শক্ত উত্তর, কিন্তু আমি এটি স্বীকৃত হিসাবে চিহ্নিত করব।
JHarnach

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

8
আমি জোন স্কিটির উত্তরটি আরও পছন্দ করি। এছাড়াও, (সত্য) যখন do do
করণের

1
আমি ঘৃণা করি যে ডিজকস্ট্রা কখনও সেই GoTo নিবন্ধ লিখেছিল। যদিও GoTo অবশ্যই আগে অত্যাচার করা হত তার অর্থ এই নয় যে আপনি এটি কখনও ব্যবহার করবেন না। এছাড়াও, প্রস্থান করুন, বিরতি দিন, প্রস্থান করুন, চেষ্টা করুন / ক্যাচ হ'ল গোটো কেবল বিশেষায়িত ফর্ম। গোটোস প্রায়শই কোডটিকে আরও পঠনযোগ্য করে তুলতে পারে। এবং হ্যাঁ আমি সচেতন যে গোটো ছাড়া কিছু করা যায়। তার মানে এই নয় যে এটি করা উচিত।
কিবিবি

39

তিনি কীভাবে জাভাস্ক্রিপ্টে কোনও loopকাঠামো থাকতে চান তা সম্পর্কে ডগলাস ক্রকফোর্ডের মন্তব্য ছিল :

loop
{
  ...code...
}

এবং আমি মনে করি না যে জাভা কোনও loopকাঠামো থাকার কারণে আরও খারাপ হতে পারে।

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

তবে তারা যা খুব কমই উল্লেখ করেন তা হ'ল সমস্ত লুপিং প্রক্রিয়াগুলি while(true)লুপগুলির সাথে প্রতিলিপি করা যেতে পারে ।

while( a() )
{
  fn();
}

হিসাবে একই

loop
{
  if ( !a() ) break;
  fn();
}

এবং

do
{
  fn();
} while( a() );

হিসাবে একই:

loop
{
  fn();
  if ( !a() ) break;
}

এবং

for ( a(); b(); c() )
{
  fn();
}

হিসাবে একই:

a();
loop
{
  if ( !b() ) break;
  fn();
  c();
}

যতক্ষণ আপনি আপনার লুপগুলি এমনভাবে সেট আপ করতে পারেন যা আপনি ব্যবহার করতে পছন্দ করেছেন এমন কনস্ট্রাক্টের কাজ করে তা গুরুত্বহীন। এটা যদি ঘটে একটি মাপসই forলুপ, একটি ব্যবহার forলুপ।

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


2
+1: বিবৃতি জড়িত থাকার forসময় লুপগুলির সাথে অতিরিক্ত জটিলতা রয়েছে continueতবে সেগুলি কোনও বড় এক্সটেনশন নয়।
ডোনাল ফেলো

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

4
কেউ কি আর লেখেন না for (;;) {? (উচ্চারণ "চিরকাল")। এটি খুব জনপ্রিয় ছিল।
দাউদ ইবনে করিম

16

১৯ 1967 সালে, এডগার ডিজকસ્ત્રা একটি ট্রেড ম্যাগাজিনে একটি নিবন্ধ লিখেছিলেন কেন কোডের মান উন্নত করতে উচ্চ স্তরের ভাষা থেকে গোটোকে বাদ দেওয়া উচিত about "স্ট্রাকচার্ড প্রোগ্রামিং" নামে একটি পুরো প্রোগ্রামিং দৃষ্টান্তটি এ থেকে বেরিয়ে এসেছিল, যদিও সকলেই একমত হন না যে গোটো স্বয়ংক্রিয়ভাবে খারাপ কোড মানে means

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

স্পষ্টতই এটি একমাত্র প্রোগ্রামিং দৃষ্টান্ত নয়, তবে প্রায়শই এটি অন্যান্য প্যারাডিজমে যেমন অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (আলা জাভা) তে সহজেই প্রয়োগ করা যেতে পারে।

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

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

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

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



14

ইনপুট পড়ার জন্য ব্যবহারযোগ্য জাভা সম্মেলনটি হ'ল:

import java.io.*;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String strLine;

while ((strLine = br.readLine()) != null) {
  // do something with the line
}

এবং ইনপুট পড়ার জন্য সাধারণ সি ++ কনভেনশনটি হ'ল:

#include <iostream>
#include <string>
std::string data;
while(std::readline(std::cin, data)) {
  // do something with the line
}

এবং সি মধ্যে, এটি

#include <stdio.h>
char* buffer = NULL;
size_t buffer_size;
size_t size_read;
while( (size_read = getline(&buffer, &buffer_size, stdin)) != -1 ){
  // do something with the line
}
free(buffer);

অথবা আপনি যদি নিশ্চিত হন যে আপনার ফাইলের দীর্ঘতম পাঠের দীর্ঘতম রেখাটি আপনি কতক্ষণ জানেন তবে আপনি এটি করতে পারেন

#include <stdio.h>
char buffer[BUF_SIZE];
while (fgets(buffer, BUF_SIZE, stdin)) {
  //do something with the line
}

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

import java.io.*;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;

while ((line = br.readLine()) != null  && !line.equals("quit") ) {
  // do something with the line
}

সুতরাং, সেখানে অবশ্যই এমন ঘটনা রয়েছে যেখানে breakবা gotoন্যায়সঙ্গত হয়েছে, আপনি যা করছেন তা যদি কোনও ফাইল বা কনসোল লাইন থেকে লাইন দ্বারা পড়া হয়, তবে while (true)এটি সম্পাদন করার জন্য আপনার কোনও লুপের প্রয়োজন হবে না - আপনার প্রোগ্রামিং ভাষা ইতিমধ্যে আপনাকে সরবরাহ করেছে লুপ শর্ত হিসাবে ইনপুট কমান্ড ব্যবহার করার জন্য উপযুক্ত আইডিয়ম সহ


আসলে, আপনি যদি while (true)এই প্রচলিত ইনপুট লুপগুলির পরিবর্তে একটি লুপ ব্যবহার করেন তবে আপনি ফাইলটির শেষের জন্য পরীক্ষা করতে ভুলে যাচ্ছেন be
কেন ব্লুম

3
আপনি লুপের প্রথম অংশটি whileশর্তসাপেক্ষে পূরণ করে কার্যকরভাবে এটি সম্পাদন করছেন । চূড়ান্ত জাভা শর্তে এটি ইতিমধ্যে মোটামুটি শক্তিশালী হয়ে উঠছে, এবং চালিয়ে যাওয়া উচিত কিনা তা সিদ্ধান্ত নিতে যদি আপনাকে বিস্তৃত হেরফের করতে হয়, তবে এটি বেশ দীর্ঘ হতে পারে। আপনি এটিকে আলাদা ফাংশনে বিভক্ত করতে পারেন এবং এটি সর্বোত্তম হতে পারে। তবে আপনি যদি এটি কোনও ফাংশনে চান এবং চালিয়ে যাবেন কিনা তা সিদ্ধান্ত নেওয়ার আগে অযৌক্তিক কাজ করার দরকার আছে, while(true)সবচেয়ে ভাল হতে পারে।
পুলি

@ পুলি: তারপরে রিড কমান্ডটি লুপ শর্ত হিসাবে (যা ইওফের জন্য পরীক্ষা করে) হিসাবে ব্যবহার করা ভাল এবং লুপের অভ্যন্তরে আপনার অন্যান্য অবস্থার জন্য ব্রেক স্টেটমেন্ট হিসাবে পরীক্ষা করা ভাল।
কেন ব্লুম

1
এটি মূল্যবান জন্য, gets()সাধারণ সম্মেলন নয়। এটি বাফার ওভারফ্লোগুলির জন্য অত্যন্ত অনুকূল। fgets(buffer, BUFFER_SIZE, file)অনেক বেশি স্ট্যান্ডার্ড অনুশীলনের মতো।
ডেভ

@ ডেভ: আমি এখন ব্যবহারের উত্তর সম্পাদনা করেছি fgets
কেন ব্লুম 21

12

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

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

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


4
যদি লুপটি শুরু হয় তবে while (true)এটি স্পষ্টভাবে স্পষ্ট যে এটির ভিতরে breakবা এর returnভিতরে যাচ্ছে বা এটি চিরতরে চলে। সোজা হওয়া গুরুত্বপূর্ণ, তবে while(true)নিজে থেকে বিশেষত খারাপ নয়। লুপের পুনরাবৃত্তির জুড়ে জটিল আক্রমণের মতো ভেরিয়েবলগুলি এমন কোনও কিছুর উদাহরণ হতে পারে যা আরও বেশি অ্যাংস্টের কারণ হয়।
পুলি

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

11

এটি আপনার বন্দুক, আপনার গুলি এবং আপনার পা ...

এটি খারাপ কারণ আপনি সমস্যা জিজ্ঞাসা করছেন। এটি আপনি বা এই পৃষ্ঠার অন্য কোনও পোস্টার হবেন না যার লুপগুলি সংক্ষিপ্ত / সরল উদাহরণ রয়েছে।

ভবিষ্যতে সমস্যাটি খুব এলোমেলো সময়ে শুরু হবে। এটি অন্য কোনও প্রোগ্রামার দ্বারা হতে পারে। এটি সফ্টওয়্যার ইনস্টল করা ব্যক্তি হতে পারে। এটি শেষ ব্যবহারকারী হতে পারে।

কেন? আমাকে খুঁজে বের করতে হয়েছিল যে কেন 700k LOC অ্যাপ্লিকেশন প্রতিটি সিপিইউ স্যাচুরেট না হওয়া পর্যন্ত ধীরে ধীরে 100% সিপিইউ বার্ন করা শুরু করবে। এটি একটি আশ্চর্যজনক যখন (সত্য) লুপ ছিল। এটি বড় এবং কদর্য ছিল তবে এটি সিদ্ধ হয়ে গেছে:

x = read_value_from_database()
while (true) 
 if (x == 1)
  ...
  break;
 else if (x ==2)
  ...
  break;
and lots more else if conditions
}

চূড়ান্ত অন্য কোন শাখা ছিল না। মানটি যদি কোনও শর্তের সাথে মেলে না তবে লুপটি সময় শেষ না হওয়া পর্যন্ত চলতে থাকবে।

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

আইএমএইচও এটি যখন (সত্য) তেমন কনস্ট্রাক্ট ব্যবহার করা ভাল ডিফেন্সিভ প্রোগ্রামিং নয়। এটি আপনাকে হতাশ করতে ফিরে আসবে।

(তবে আমি প্রফেসরদের গ্রেডিংয়ের কথা মনে করি, যদি আমরা প্রতিটি লাইনে মন্তব্য না করি, এমনকি আই ++;)


3
ডিফেন্সিভ প্রোগ্রামিং সম্পর্কে মন্তব্যের জন্য +1।
জেহর্নাচ

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

প্রকৃতপক্ষে, যে লুপটি কি ছিল? :)
জাজলিন

6

এটি অর্থে খারাপ যে কাঠামোগত প্রোগ্রামিং কনস্ট্রাক্টসগুলি (কিছুটা কাঠামোগত না করা) বিরতি এবং বিবৃতি অব্যাহত রাখতে পছন্দ হয়। তারা তুলনা করে এই নীতি অনুসারে "গোটো" পছন্দ করে।

আমি সর্বদা আপনার কোডটি যথাসম্ভব কাঠামোগত করার পরামর্শ দিই ... যদিও জন স্কিটি উল্লেখ করেছেন, এর চেয়ে বেশি কাঠামোগত করবেন না!


5

আমার অভিজ্ঞতা অনুসারে বেশিরভাগ ক্ষেত্রে লুপগুলিতে চালিয়ে যাওয়ার "প্রধান" শর্ত থাকে। এটি এমন একটি শর্ত যা () অপারেটর নিজেই লিখতে হবে। লুপটি ভেঙে যেতে পারে এমন সমস্ত শর্তগুলি গৌণ, এত গুরুত্বপূর্ণ নয় They এগুলি অতিরিক্ত if() {break}বিবৃতি হিসাবে লেখা যেতে পারে ।

while(true) প্রায়শই বিভ্রান্তিকর এবং কম পঠনযোগ্য।

আমি মনে করি যে এই নিয়মগুলি 100% কেস কভার করে না তবে সম্ভবত এর মধ্যে কেবল 98% রয়েছে।


ভাল বলেছ. এটি এর সাথে লুপের জন্য করণ ব্যবহার করার মতো: যখন (সত্য) {i ++; ...}} আপনি 'স্বাক্ষর' না দিয়ে লুপের অভ্যন্তরে লুপ অবস্থার কবর দিচ্ছেন।
কিংবদন্তি লেন্থথ

3

কেন ব্যবহার করবেন না সে সম্পর্কে জবাব দেওয়ার প্রয়োজন নেই, যদিও while (true)আমি সবসময় এই কমিক এবং তার সহকার লেখকের বক্তব্যকে একটি করণীয় পরিবর্তে কেন করণীয় তা সম্পর্কে একটি সংক্ষিপ্ত ব্যাখ্যা পেয়েছি ।

আপনার প্রশ্নের সাথে: এখানে কোনও সহজাত সমস্যা নেই

while(true) {
   do_stuff();
   if(exit_time) {
      break;
   }
}

... আপনি যদি জানেন যে আপনি কী করছেন এবং তা নিশ্চিত করছেন যে এটি exit_timeকোনও সময়ে মূল্যায়ন করবে true

শিক্ষকরা আপনাকে ব্যবহার থেকে নিরুৎসাহিত করেছেন while(true)কারণ যতক্ষণ না আপনি যখন ঠিক তেমন জানেন যে আপনি কী করছেন তবে এটি একটি জটিল ভুল করার সহজ উপায় mistake


আমি মনে করি সেটিং exit_time = false; while(!exit_time) { execute_stuff(); }এবং do { execute_stuff(); } while(! exit_time );এ দুটি if( condition ) { break; }দিয়ে একটি লুপ শেষে একটি থাকার চেয়ে আরও পরিষ্কার while(true)। ব্রেকগুলি লুপগুলির জন্য শর্ট সার্কিট - লুপের মাঝখানে শর্ট সার্কিট হিসাবে ব্যবহৃত হলে পুরোপুরি সূক্ষ্ম হয় তবে লুপের শেষে বিরতি থাকার সময় আপনার বিবৃতিতে একটি অবস্থার মূল্যায়ন করা উচিত।
ডাঃ জিম্বোব

সেই কমিকের ক্ষেত্রে: যখন-যখন করা যা করতে পারে তখন সমস্ত কিছু করতে পারে না, যখন-তখন কখনও কখনও করণীয় যখন আরও কিছু করতে পারে তখনও এটি করা ভাল doing
থেরোট

3

কখন লুপ শেষ হবে তা নির্দেশ করতে আপনি কেবল বুলিয়ান পতাকা ব্যবহার করতে পারেন। Breakএবং go toসফ্টওয়্যার বজায় রাখা শক্ত হওয়ার কারণগুলি ছিল - সফ্টওয়্যার-সংকট (টিএম) - এবং এড়ানো উচিত, এবং খুব সহজেই হতে পারে।

আপনি যদি ব্যবহারিক হন বা না হন এটি একটি প্রশ্ন। ব্যবহারিক কোডারগুলি কেবল সেই সাধারণ পরিস্থিতিতে বিরতি ব্যবহার করতে পারে।

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


8
কারণ বুলিয়ান পতাকা রাখা সম্ভবত কোনও পরিষ্কার নয়, এবং আমার অভিজ্ঞতায় এটি আরও কম পরিষ্কার হতে পারে ?
জন স্কেটি

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

4
একটি দুল চালান যা তারপরে আমার if (running)লুপের মধ্যে একটি থাকা প্রয়োজন , বাকী সমস্ত কোডটি ইনডেন্টিং করে যখন আমি চাই সমস্ত লুপ থেকে বেরিয়ে আসার জন্য একটি সাধারণ ব্রেক স্টেটমেন্টের চেয়ে স্পষ্টভাবে আমার কাছে কম স্পষ্ট হয় যা ঠিক কী করতে চায় তা বলে। আপনি বিরতিটিকে অজস্র অভ্যাস হিসাবে বিবেচনা করার বিষয়টি বিবেচনা করছেন বলে মনে করছেন - আমি এটিকে এমন মনে করি না।
জন স্কিটি

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

3
আপনি ধরে নিচ্ছেন যে ছাড়বেন কিনা তা নির্ধারণ করার পরে লুপের মধ্যে আপনাকে কিছু করার দরকার নেই। উদাহরণস্বরূপ, ওপি-র পরিস্থিতিতে তিনি ছাড়ছেন না তবে তাকে আরও ইনপুট চাইতে হবে।
জন স্কিটে

3

আমি দুর্ভাগ্য হতে পারে। অথবা আমার কাছে কেবল একটি অভিজ্ঞতার অভাব রয়েছে। কিন্তু প্রত্যেক বার আমি সঙ্গে তার আচরণ রিকল while(true)থাকার breakভিতরে, সম্ভব ছিল কোড প্রয়োগের উন্নত করতে এক্সট্র্যাক্ট পদ্ধতি থেকে যখন-ব্লক যা রাখা, while(true)কিন্তু (কাকতালীয়?) রুপান্তরিত সব breakমধ্যে গুলি returnগুলি।

আমার অভিজ্ঞতায় while(true)বিরতি ছাড়াই (অর্থাত্ রিটার্ন বা নিক্ষেপ সহ) বেশ আরামদায়ক এবং সহজেই বোঝা যায়।


  void handleInput() {
      while (true) {
          final Input input = getSomeInput();
          if (input == null) {
              throw new BadInputException("can't handle null input");
          }
          if (input.isPoisonPill()) {
              return;
          }
          doSomething(input);
      }
  }

3

আমি মনে করি হ্যাঁ এটি বেশ খারাপ ... বা কমপক্ষে, অনেক বিকাশকারীদের পক্ষে। এটি বিকাশকারীদের লক্ষণাত্মক যা তাদের লুপের অবস্থার কথা চিন্তা করে না। ফলস্বরূপ ত্রুটির প্রবণতা রয়েছে।


2

সঙ্গে কোন প্রধান সমস্যা আছে while(true)সঙ্গে breakবিবৃতি, কিন্তু কিছু তার সামান্য কোড পাঠযোগ্যতা কমে যায় মনে হতে পারে। ভেরিয়েবলকে অর্থপূর্ণ নাম দেওয়ার চেষ্টা করুন, যথাযথ স্থানে এক্সপ্রেশন মূল্যায়ন করুন।

আপনার উদাহরণস্বরূপ, এরকম কিছু করা আরও পরিষ্কার মনে হচ্ছে:

do {
   input = get_input();
   valid = check_input_validity(input);    
} while(! valid)

এটি বিশেষত সত্য যদি লুপটি দীর্ঘ হয়ে যায় - আপনি আরও জানেন যে অতিরিক্ত পুনরাবৃত্তি ঘটছে কিনা তা পরীক্ষা করে দেখতে হবে। সমস্ত ভেরিয়েবল / ফাংশনগুলির অ্যাবস্ট্রাকশন স্তরে উপযুক্ত নাম রয়েছে। while(true)বিবৃতি যে আপনি বলুন যে প্রক্রিয়াকরণ জায়গা তোমার চিন্তা ভাবনা নয়।

লুপের মাধ্যমে আপনি দ্বিতীয়বার বিভিন্ন আউটপুট চান। কিছুটা এইরকম

input = get_input();
while(input_is_not_valid(input)) {
    disp_msg_invalid_input();
    input = get_input();
}

আমার কাছে তখন আরও পঠনযোগ্য বলে মনে হচ্ছে

do {
    input = get_input();
    if (input_is_valid(input)) {
        break;
    }
    disp_msg_invalid_input();
} while(true);

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


1

আমি অনুরূপ কিছু ব্যবহার করি, তবে আমার প্রচুর কার্যক্রমে বিপরীত যুক্তি সহ।

DWORD dwError = ERROR_SUCCESS;

do
{
    if ( (dwError = SomeFunction()) != ERROR_SUCCESS )
    {
         /* handle error */
         continue;
    }

    if ( (dwError = SomeOtherFunction()) != ERROR_SUCCESS )
    {
         /* handle error */
         continue;
    }
}
while ( 0 );

if ( dwError != ERROR_SUCCESS )
{
    /* resource cleanup */
}

1

এটি আরও একটি নান্দনিকতার জিনিস, কোড পড়ার পক্ষে আরও সহজ যেখানে আপনি স্পষ্টভাবে জানেন যে লুপটির ঘোষণায় লুপটি কেন থামবে।


1

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


1

আমার কাছে সমস্যা হ'ল পাঠযোগ্যতা।

সত্যিকারের শর্তের সাথে বিবৃতি আপনাকে লুপ সম্পর্কে কিছুই বলে না। এটি বোঝার কাজটিকে আরও অনেক কঠিন করে তোলে।

এই দুটি স্নিপেটগুলির মধ্যে বোঝা কী সহজ হবে?

do {
  // Imagine a nice chunk of code here
} while(true);

do {
  // Imagine a nice chunk of code here
} while(price < priceAllowedForDiscount);

0

আমার অনুমান যে আপনার শিক্ষকের বিরতি ব্যবহার করা ফল পাওয়ার জন্য গাছের ডাল ভাঙার মতো, অন্য কিছু কৌশল ব্যবহার করুন (শাখাটি ধনুক করুন) যাতে আপনি ফল পান এবং ডালটি এখনও বেঁচে থাকবে :)


0

1) কিছুই সঙ্গে ভুল নেই do -while(true)

2) আপনার শিক্ষক ভুল।

NSFS !!:

৩) বেশিরভাগ শিক্ষকই প্রোগ্রামার না হয়ে শিক্ষক।


@ কনেল আপনার শিক্ষকের কথা শুনে অপেক্ষা করুন!
পেসারিয়ার

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

আপনার চুক্তিটি দেখানোর জন্য @ পোস্টটি আমার পোস্ট করুন
পেসারিয়ার

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

@ ফিলিপ-এফকু ওয়া বাহ ~ শীতল করুন এটি ঠান্ডা করুন!
পেসারিয়ার

0

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

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