এটি কি গোটো বক্তব্যকে ন্যায়সঙ্গত করে?


15

আমি এই প্রশ্নটি দ্বিতীয়বার আগে এসেছি, এবং আমি সেখান থেকে কিছু উপাদান টানছি: 'ব্রেক এন' কনস্ট্রাক্টের কোনও নাম আছে?

লুপের জন্য দ্বি-নেস্ট থেকে বেরিয়ে আসার জন্য প্রোগ্রামটিকে লোকদের নির্দেশ দেওয়ার জন্য এটি একটি অযথা জটিল উপায় বলে মনে হচ্ছে:

for (i = 0; i < 10; i++) {
    bool broken = false;
    for (j = 10; j > 0; j--) {
        if (j == i) {
            broken = true;
            break;
        }
    }
    if (broken)
        break;
}

আমি জানি পাঠ্যপুস্তকগুলি গোটো বিবৃতি শয়তান বলতে চাই এবং আমি এগুলি মোটেও পছন্দ করি না, তবে এটি কি নিয়মের ব্যতিক্রমকে ন্যায়সঙ্গত করে?

আমি এমন উত্তরগুলি সন্ধান করছি যা লুপগুলির জন্য n- নেস্টেড নিয়ে কাজ করে।

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


2
আপনি যদি অভ্যন্তরীণ লুপ শর্তটি লিখতে পারেন for (j = 10; j > 0 && !broken; j--)তবে আপনার break;বিবৃতিটির প্রয়োজন হবে না । আপনি যদি brokenবাহ্যিক লুপটি শুরু হওয়ার আগে ঘোষণাপত্রটি সরান , তবে যদি সে হিসাবে এটি লেখা যেতে পারে for (i = 0; i < 10 && !broken; i++)তবে আমি মনে করি কোনও break; প্রয়োজন নেই।
হতাশ

8
উদাহরণটি সি # - সি # রেফারেন্সের থেকে দেওয়া goto: গোটো (সি # রেফারেন্স) - "গোটো স্টেটমেন্টটি গভীরভাবে নেস্ট করা লুপগুলি থেকে বেরিয়ে আসতেও কার্যকর is"

ওএমজি, আমি কখনই জানতাম না সি # এর একটি গোটো স্টেটমেন্ট ছিল! স্ট্যাকএক্সচেঞ্জ এ আপনি যে জিনিসগুলি শিখেন। (আমি শেষ বারের মতো গেটো স্টেটমেন্টের সক্ষমতা চেয়েছিলাম মনে করতে পারছি না, এটি কখনও আসেনি বলে মনে হয়)।
জন উ

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

1
@ জোহানউইউ gotoআসলে সি # স্যুইচ-এ প্রথম মামলার কোনও কোড কার্যকর করার পরে অন্য ক্ষেত্রে পড়তে হবে। যদিও আমি গোটো ব্যবহার করেছি শুধুমাত্র এটি।
ড্যান লাইন্স

উত্তর:


33

গোপনে বিবৃতি দেয়ার আপাতর প্রয়োজনীয়তাটি আপনার কাছ থেকে লুপগুলির জন্য খারাপ শর্তাধীন অভিব্যক্তিগুলি বেছে নেওয়ার পরে উত্থাপিত

আপনি উল্লেখ করেছেন যে আপনি চেয়েছিলেন যে বহিরাগত লুপটি দীর্ঘকাল চলতে থাকবে i < 10এবং অন্তঃস্থলটি যতক্ষণ চলতে থাকবেj > 0

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

যদি আপনি লুপগুলি আপনার সত্যের উদ্দেশ্যগুলি শুরু করতে বলে থাকেন তবে বিরতি বা গোটো করার দরকার নেই।

bool alsoThis = true;
for (i = 0; i < 10 && alsoThis; i++)
{    
    for (j = 10; j > 0 && alsoThis; j--)
    {
        if (j == i)
        {
            alsoThis = false;
        }
    }
}

অন্যান্য উত্তরে আমার মন্তব্য দেখুন। iবাহ্যিক লুপের শেষে মূল কোডটি মুদ্রণ করে, সুতরাং ইনক্রিমেন্টকে সংক্ষিপ্ত-সার্কিট করা কোডকে 100% সমতুল্য দেখাতে গুরুত্বপূর্ণ। আমি আপনার উত্তরে কিছু ভুল বলছি না, আমি কেবল উল্লেখ করতে চেয়েছিলাম যে অবিলম্বে লুপটি ভাঙ্গা কোডের একটি গুরুত্বপূর্ণ বিষয়।
pswg

1
@pswg আমি ওপির iপ্রশ্নের বাইরের লুপের শেষে কোনও কোড মুদ্রণ দেখতে পাচ্ছি না ।
তুলাইনস কর্ডোভা

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

3
@pswg আমি অনুমান করি যে আপনি যদি সত্যিই সত্যই সত্যই কোনও গোটোকে ন্যায়সঙ্গত করতে চান তবে আপনি এমন একটি সমস্যা তৈরি করতে পারেন যা একটির প্রয়োজন, অন্যদিকে, আমি দুই দশক ধরে পেশাগতভাবে প্রোগ্রামিং করছি এবং এমন একটি আসল বিশ্বের সমস্যা নেই যা প্রয়োজন এক.
তুলাইনস কর্ডোভা

1
কোডটির উদ্দেশ্য একটি বৈধ ব্যবহারের কেস সরবরাহ করে নি goto(আমি নিশ্চিত যে আরও ভাল রয়েছে), এমনকি যদি এটি এমন কোনও প্রশ্ন উত্থাপন করে যা এটিকে ব্যবহার করে বলে মনে হয় তবে break(n)ভাষাগুলিতে যে মৌলিক ক্রিয়াটি বোঝায় না ' এটি সমর্থন করে না।
PSWg

34

এই উদাহরণস্বরূপ, আপনি কোডটি পৃথক রুটিনে রিফ্যাক্টর করতে পারেন এবং তারপরে কেবল returnঅভ্যন্তরীণ লুপ থেকে। এটি বাহ্যিক লুপটি ভেঙে দেওয়ার প্রয়োজনটিকে অস্বীকার করবে:

bool isBroken() {
    for (i = 0; i < 10; i++)
        for (j = 10; j > 0; j--)
            if (j == i) return true;

    return false;
}

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

2
কেবলমাত্র একটি পার্শ্ব নোট: মূল কোডে এটি iবাহ্যিক লুপের শেষে মুদ্রণ করে। সুতরাং যে সত্যিই প্রতিফলিত iএটি গুরুত্বপূর্ণ মান, এখানে return true;এবং return false;উভয় হওয়া উচিত return i;
PSWg

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

6

না, আমি মনে করি না যে gotoএটি প্রয়োজনীয়। আপনি যদি এটি লিখেন:

bool broken = false;
saved_i = 0;
for (i = 0; i < 10 && !broken; i++)
{
    broken = false;
    for (j = 10; j > 0 && !broken; j--)
    {
        if (j == i)
        {
            broken = true;
            saved_i = i;
        }
    }
}

রয়ে &&!brokenউভয় লুপ উপর আপনি উভয় লুপ যখন আউট বিরতি দেয় i==j

আমার কাছে, এই পদ্ধতির পছন্দ হয়। লুপ অবস্থার অত্যন্ত স্পষ্ট: i<10 && !broken

একটি কার্যকারী সংস্করণ এখানে দেখা যাবে: http://rextester.com/KFMH48414

কোড:

public static void main(String args[])
{
    int i=0;
    int j=0;
    boolean broken = false;
    for (i = 0; i < 10 && !broken; i++)
    {
        broken = false;
        for (j = 10; j > 0 && !broken; j--)
        {
            if (j == i)
            {
                broken = true;
                System.out.println("loop breaks when i==j=="+i);
            }
        }
    }
    System.out.println(i);
    System.out.println(j);
}

আউটপুট:

লুপ ব্রেক যখন আমি == জ == 1
2
0

কেন আপনি এমনকি ব্যবহার করবেন brokenআপনার প্রথম উদাহরণের এ সব ? কেবল অভ্যন্তরীণ লুপটিতে বিরতি ব্যবহার করুন। এছাড়াও, যদি আপনার অবশ্যই ব্যবহার brokenকরা হয় তবে এটিকে কেন লুপের বাইরে ঘোষণা করবেন? এটি লুপের ভিতরে ঘোষণা করুন iwhileলুপ হিসাবে , দয়া করে এটি ব্যবহার করবেন না। আমি সত্যই বলেছি যে এটি গোটো সংস্করণের চেয়ে কম পাঠযোগ্য হতে পারে ।
লুস্কুবাল

@ লুইসুবাল: নামের একটি পরিবর্তনশীল brokenব্যবহার করা হয়েছে কারণ আমি breakবিবৃতিটি ব্যবহার করতে পছন্দ করি না (সুইচ-কেস বাদে তবে এটি সম্পর্কে) about আপনি যখন সমস্ত লুপগুলি ভেঙে ফেলতে চান তবে বাইরের লুপের বাইরে এটি ঘোষণা করা হয় i==j। আপনি ঠিক বলেছেন, সাধারণভাবে, brokenকেবলমাত্র বাহিরের লুপের এটি ভেঙে যাওয়ার আগেই ঘোষণা করা দরকার।
হতাশ

আপনার আপডেটে, i==2লুপের শেষে। সাফল্যের শর্তটিও যদি ইনক্রিমেন্টের 100% সমতুল্য হয় তবে শর্ট সার্কিট করা উচিত break 2
PSWg

2
আমি ব্যক্তিগতভাবে broken = (j == i)if এবং এর চেয়ে বেশি পছন্দ করি , যদি ভাষা এটির অনুমতি দেয়, ভাঙা ঘোষণাটি বাইরের লুপের সূচনাতে ভিতরে রাখে। যদিও এই নির্দিষ্ট উদাহরণের জন্য এই জিনিসগুলি বলা শক্ত, কারণ পুরো লুপটি কোনও অপ-বিকল্প (এটি কোনও কিছুই দেয় না এবং এর কোনও পার্শ্ব প্রতিক্রিয়াও নেই) এবং যদি এটি কিছু করে তবে সম্ভবত এটি যদি সেই অভ্যন্তরে থাকে তবে (যদিও আমি এখনও broken = (j ==i); if broken { something(); }আরও ভাল পছন্দ করি) ব্যক্তিগতভাবে)
মার্টিজন

@ মার্তিজন আমার মূল কোডটিতে iএটি বাহ্যিক লুপটি শেষ হওয়ার পরে মুদ্রণ করে। অন্য কথায় একমাত্র সত্যিকারের গুরুত্বপূর্ণ চিন্তাভাবনা হ'ল বাইরের লুপটি যখন ঠিক ভেঙে যায়।
PSwg

3

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

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


2

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

আপনার ভবিষ্যত পর্যালোচক সম্পর্কে ভাবুন: s / তাকে ভাবতে হবে, "এই ব্যক্তিটি কি খারাপ কোডার বা এটি আসলে এমন কোনও ঘটনা যেখানে গোটোটির মূল্য ছিল? আমার নিজের জন্য এটি সিদ্ধান্ত নিতে বা এটি নিয়ে গবেষণা করতে আমাকে 5 মিনিট সময় নিতে দিন ইন্টারনেট। " আপনি যখন গোটো পুরোপুরি ব্যবহার করতে পারবেন না তখন কেন পৃথিবীতে আপনি আপনার ভবিষ্যতের কোডারের সাথে এমনটি করবেন?

সাধারণভাবে এই মানসিকতাটি সমস্ত "খারাপ" কোডের জন্য প্রযোজ্য এবং এমনকি এটি সংজ্ঞায়িতও করে: এটি যদি এখন কাজ করে এবং এই ক্ষেত্রে ভাল হয় তবে এটি সঠিক তা যাচাই করার জন্য প্রচেষ্টা তৈরি করে, যা এই যুগে একটি গোটো সর্বদা করবে, তারপরে না এটা কর.

বলা হচ্ছে, হ্যাঁ, আপনি কিছুটা কাঁটাছাছ তৈরি করেছেন। আপনি:

  • উভয় লুপগুলি ভেঙে ফেলার জন্য আরও জটিল নিয়ন্ত্রণ কাঠামো, যেমন বুলিয়ান পতাকা হিসাবে ব্যবহার করুন
  • আপনার অভ্যন্তরের লুপটি তার নিজস্ব রুটিনের ভিতরে রাখুন (সম্ভবত আদর্শ)
  • উভয় লুপগুলিকে একটি রুটিনে রাখুন এবং ভাঙ্গার পরিবর্তে ফিরে আসুন

আমার পক্ষে এমন একটি মামলা তৈরি করা খুব কঠিন যেখানে ডাবল-লুপটি এতটা সমন্বিত নয় যে এটি কোনওভাবেই তার নিজের রুটিন হওয়া উচিত নয়।

যাইহোক, আমি এটির সেরা আলোচনাটি হ'ল স্টিভ ম্যাককনেলের কোড সম্পূর্ণ । যদি আপনি এই সমস্যাগুলি সমালোচনামূলকভাবে চিন্তা করতে ভোগ করেন তবে আমি দৃ strongly়তার সাথে পড়ার এমনকি কভার-টু-কভারকে দৃ recommend়তার সাথে সুপারিশ করি।


1
কোড পড়া এবং বুঝতে আমাদের কাজের প্রোগ্রামাররা। আপনার কোডবেসের প্রকৃতি না হলে কেবল সরল কোড নয়। আছে, এবং সর্বদা বোধগম্য ব্যয়ের কারণে গোটো ব্যবহার করার বিরুদ্ধে সাধারণতার (নিয়ম নয়) ব্যতিক্রম হবে। যখনই সুবিধাটি ছাড়িয়ে যায় তখন ব্যয়টি যখন গোটো ব্যবহার করা উচিত; যেমনটি সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের সমস্ত কোডিং সিদ্ধান্তের ক্ষেত্রে।
ডায়েটবুদ্ধা

1
@ ডায়েটবুদ্ধা স্বীকৃত সফ্টওয়্যার কোডিং কনভেনশন লঙ্ঘন করার জন্য ব্যয় করতে পারে যেগুলি পর্যাপ্ত পরিমাণে বিবেচনায় নেওয়া উচিত। কোনও প্রোগ্রামে ব্যবহৃত নিয়ন্ত্রণ কাঠামোর বৈচিত্র্য বাড়ানোর জন্য ব্যয় হয় এমনকি এই পরিস্থিতিটির জন্য এই নিয়ন্ত্রণ কাঠামোটি উপযুক্ত উপযুক্ত হতে পারে। কোডের স্থিতিশীল বিশ্লেষণ ভাঙতে ব্যয় হয়। যদি এগুলি এখনও মূল্যবান হয় তবে আমি কে তর্ক করব।
djechlin

1

টিএলডি; ডিআর: নির্দিষ্টভাবে নেই, হ্যাঁ সাধারণভাবে

আপনি যে নির্দিষ্ট উদাহরণটি ব্যবহার করেছেন তার জন্য আমি অন্য কোনও কারণে একই কারণে না বলব। আপনি কোডটিকে সহজেই একটি সমতুল্য ভাল ফর্ম হিসাবে রিফ্যাক্টর করতে পারেন যা এর প্রয়োজনকে দূর করে goto

সাধারণভাবে এর বিপরীতে gotoহ'ল একটি সাধারণতা যা বোঝার প্রকৃতি gotoএবং এটির ব্যবহারের ব্যয়ের উপর ভিত্তি করে । সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের অংশ বাস্তবায়ন সিদ্ধান্ত গ্রহণ করছে। এই সিদ্ধান্তগুলির ন্যায়সঙ্গততা বেনিফিটগুলির বিরুদ্ধে ব্যয়কে ওজন করে এবং যখনই বেনিফিটগুলি ব্যয়কে ছাড়িয়ে যায় বাস্তবায়ন সমর্থনযোগ্য হয়। ব্যয় এবং সুবিধা উভয়ই বিভিন্ন মূল্যায়নের কারণে বিতর্ক দেখা দেয়।

মুল বক্তব্যটি হ'ল সর্বদা ব্যতিক্রম থাকবে যেখানে একটি gotoন্যায্য, তবে কেবলমাত্র কিছু মূল্যবোধের কারণে। করুণা অনেক প্রকৌশলী কেবল উদ্দেশ্যমূলক অজ্ঞতার কৌশলগুলি বাদ দেয় কারণ তারা এটি কেন বুঝতে সময় না দিয়ে ইন্টারনেটে পড়ে।


আপনি আরও আরও ব্যয়ের ব্যাখ্যা দিয়ে গেটো স্টেটমেন্টে কোনও নিবন্ধের প্রস্তাব দিতে পারেন?
Thys

-1

আমি মনে করি না যে এই মামলাটি একটি ব্যতিক্রমকে ন্যায়সঙ্গত করেছে, কারণ এটি এইভাবে লেখা যেতে পারে:

def outerLoop(){
    for (i = 0; i < 10; i++) {
        if( broken?(i) )
          return; // broken
    }
}

def broken?(i){
   for (j = 10; j > 0; j--) {
        if (j == i) {
            return true; // broken
        }
   }
   return false; // not broken
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.