GOTO এখনও ক্ষতিকারক হিসাবে বিবেচিত? [বন্ধ]


282

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

কোন পরিস্থিতিতে গোটো ব্যবহারের পরোয়ানা? কখন এড়ানো ভাল?

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


ডিজকস্ট্রা নিজেই সেই খেতাব নিয়ে আফসোস করেছিলেন, যার জন্য তিনি দায়বদ্ধ ছিলেন না। EWD1308 (এছাড়াও এখানে। পিডিএফ) শেষে তিনি লিখেছেন:

অবশেষে রেকর্ডের জন্য একটি ছোট গল্প। ১৯68৮ সালে, এসিএমের যোগাযোগগুলি " গোটো স্টেটমেন্টটি ক্ষতিকারক বলে বিবেচিত " শিরোনামে আমার একটি লেখা প্রকাশ করেছিল , যা পরবর্তী বছরগুলিতে প্রায়শই উল্লেখ করা হত, আফসোস, তবে প্রায়শই এমন লেখক যারা এর চেয়ে বেশি কিছু দেখেননি by শিরোনাম, যা একটি টেমপ্লেট হয়ে আমার খ্যাতির মূল ভিত্তি হয়ে দাঁড়িয়েছিল: আমরা "এক্সকে ক্ষতিকারক বলে বিবেচিত" শিরোনামে "ধর্ষণক্ষেত্রে ক্ষতিকারক বলে বিবেচিত" শীর্ষক এক ধরণের শিরোনামের অধীনে সমস্ত প্রবন্ধ দেখতে পাব। তবে কি হয়েছে? " গোটো স্টেটমেন্টের বিরুদ্ধে মামলা " শিরোনামে একটি কাগজ জমা দিয়েছিলাম", যা, এর প্রকাশনার গতি বাড়ানোর জন্য সম্পাদক একটি" সম্পাদককে চিঠি "হিসাবে পরিবর্তিত হয়েছিল এবং প্রক্রিয়াটিতে তিনি এটিকে তার নিজের আবিষ্কারের একটি নতুন উপাধি দিয়েছিলেন! সম্পাদক ছিলেন নিক্লাউস ওয়ার্থ।

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

ডোনাল্ড ই নুথ: আমি বিশ্বাস করি যে এই ধরণের দৃষ্টিভঙ্গি উপস্থাপনের দ্বারা আমি বাস্তবে ডিজকস্ট্রের ধারণার সাথে তীব্রভাবে একমত নই, যেহেতু তিনি সম্প্রতি লিখেছিলেন: "দয়া করে বিশ্বাস করার ফাঁদে পড়বেন না যে আমি [সম্পর্কে ভয়ঙ্কর মতবাদী বিবৃতিতে যান]। আমার অস্বস্তিকর অনুভূতি আছে যে অন্যরা এ থেকে ধর্ম তৈরি করছে, যেন প্রোগ্রামিংয়ের ধারণাগত সমস্যাগুলি একক কৌতুক দ্বারা সমাধান করা যায়, কোডিং শৃঙ্খলার একটি সাধারণ ফর্ম দিয়ে! "


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

25
গোটোস স্পষ্টতা যুক্ত করলে তারা ভাল হয়। আপনার যদি দীর্ঘ নেস্টেড লুপ থাকে তবে "ব্রেক" ভেরিয়েবল সেট করা এবং আপনি বের না হওয়া অবধি ব্রেক করার চেয়ে এটির বাইরে চলে যাওয়া ভাল।
simendsjo

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

7
আমি আপনাকে পরামর্শ দিচ্ছি আপনাকে ট্যাগ করেছে নয় হাজার এবং এক থ্রেড পড়তে যান goto
ম্যাটি ভির্ককুনেন

5
ব্যবহারের চেয়ে স্পষ্টত আরও খারাপ একটি বিষয় রয়েছে goto: এ বাস্তবায়নের জন্য কাঠামোগত প্রোগ্রামিং সরঞ্জামগুলি একসাথে হ্যাকিং goto

উত্তর:


184

নিম্নলিখিত বিবৃতিগুলি সাধারণীকরণ; যদিও সর্বদা ব্যতিক্রম প্রার্থনা করা সম্ভব হয়, তবে এটি সাধারণত (আমার অভিজ্ঞতা এবং নম্র মতামত) ঝুঁকিগুলির পক্ষে উপযুক্ত নয়।

  1. মেমোরি ঠিকানাগুলির সীমাহীন ব্যবহার (GOTO বা কাঁচা পয়েন্টার) সহজেই এড়ানো যায় এমন ভুল করার জন্য অনেকগুলি সুযোগ সরবরাহ করে।
  2. কোডে একটি নির্দিষ্ট "অবস্থান" পৌঁছানোর আরও বেশি উপায় রয়েছে, সিস্টেমের অবস্থা সেই সময়ে কী হবে সে সম্পর্কে যত কম আত্মবিশ্বাসী হতে পারে। (নিচে দেখ.)
  3. স্ট্রাকচার্ড প্রোগ্রামিং আইএমএইচও "জিওটিও এড়ানো" সম্পর্কে কম এবং কোডের কাঠামোর সাথে ডেটার কাঠামোর সাথে মেলে তৈরি করা সম্পর্কে আরও কম। উদাহরণস্বরূপ, পুনরাবৃত্তি করা ডেটা স্ট্রাকচার (যেমন অ্যারে, সিক্যুয়াল ফাইল ইত্যাদি) কোডটির পুনরাবৃত্ত একক দ্বারা প্রাকৃতিকভাবে প্রক্রিয়াজাত করা হয়। অন্তর্নির্মিত কাঠামো (যেমন, যখন পর্যন্ত, প্রত্যেকের জন্য, ইত্যাদি) থাকার ফলে প্রোগ্রামারকে একই ক্লাশযুক্ত কোড নিদর্শনগুলি পুনরাবৃত্তি করার টেডিয়াম এড়াতে দেয়।
  4. এমনকি যদি GOTO নিম্ন-স্তরের বাস্তবায়ন বিশদ হয় (সর্বদা ক্ষেত্রে হয় না!) এটি প্রোগ্রামারের ভাবা উচিত এমন স্তরের নীচে। কতজন প্রোগ্রামার কাঁচা বাইনারিতে তাদের ব্যক্তিগত চেকবুকগুলিকে ভারসাম্যপূর্ণ করে? ডিস্কের কোন সেক্টরে একটি নির্দিষ্ট রেকর্ড রয়েছে তা সম্পর্কে কতজন প্রোগ্রামাররা চিন্তিত হন (কেবলমাত্র কোনও ডাটাবেস ইঞ্জিনকে কী সরবরাহ করার পরিবর্তে (এবং যদি আমরা আমাদের সমস্ত প্রোগ্রাম সত্যই শারীরিক ডিস্ক সেক্টরের ক্ষেত্রে লিখি তবে কীভাবে কিছু ভুল হতে পারে))?

উপরের পাদটীকা:

পয়েন্ট 2 সম্পর্কিত, নিম্নলিখিত কোডটি বিবেচনা করুন:

a = b + 1
/* do something with a */

কোডে "কিছু" মুহুর্তে, আমরা উচ্চ আস্থা যে সঙ্গে রাষ্ট্র পারে aতার চেয়ে অনেক বেশী b। (হ্যাঁ, আমি আবদ্ধ না হওয়া পূর্ণসংখ্যার অতিরিক্ত প্রবাহের সম্ভাবনাটি এড়িয়ে যাচ্ছি Let's আসুন এর একটি সাধারণ উদাহরণকে ঘাড়ে না ফেলে)

অন্যদিকে, কোডটি যদি এভাবে পড়ে থাকে:

...
goto 10
...
a = b + 1
10: /* do something with a */
...
goto 10
...

10 লেবেল পাওয়ার উপায়গুলির বহুগুণ অর্থ হল যে আমাদের মধ্যে aএবং bসেই সময়ে সম্পর্কের বিষয়ে আত্মবিশ্বাসী হতে অনেক বেশি কঠোর পরিশ্রম করতে হবে । (আসলে, সাধারণ ক্ষেত্রে এটি অনস্বীকার্য!)

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

if (some condition) {
  action-1
} else {
  action-2
}

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


2
একটি ভাল পয়েন্ট। উচ্চ-স্তরের ভাষাগুলিতে গোটো বলতে আসলে কিছুই বোঝায় না (জাভায় পদ্ধতিগুলির মধ্যে ঝাঁপ দেওয়ার বিষয়টি বিবেচনা করুন)। হাস্কেল ফাংশনটিতে একটি একক অভিব্যক্তি থাকতে পারে; একটি গোটো দিয়ে এ থেকে লাফিয়ে দেখুন!
যান্ত্রিক শামুক 23

2
পোস্টস্ক্রিপ্ট আপনার পয়েন্ট 4 উদাহরণের মতো কাজ করে।
লুসার droog

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

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

gotoএকটি আধুনিক প্রোগ্রামিং ভাষায় (গো) স্ট্যাকওভারফ্লো . com/ a/ 11065563/3309046
নিশান্থস

245

এক্সকেসিডির গোটো কমিক

আমার এক সহকর্মী বলেছিলেন যে GOTO ব্যবহারের একমাত্র কারণ হ'ল যদি আপনি নিজেকে এতদূর ধরে প্রোগ্রাম করে থাকেন যে কেবল এটিই একমাত্র উপায়। অন্য কথায়, সময় আগে সঠিক নকশা এবং আপনার পরে কোনও GOTO ব্যবহার করার প্রয়োজন হবে না।

আমি ভেবেছিলাম এই কমিকটি সুন্দরভাবে ফুটিয়ে তুলেছে "আমি প্রোগ্রামটির প্রবাহকে পুনর্গঠন করতে পারি, বা তার পরিবর্তে একটি সামান্য 'GOTO' ব্যবহার করতে পারি" " আপনার ডিজাইনের দুর্বলতা থাকলে একটি গোটো দূর্বল উপায়। Velociraptors দুর্বল শিকার


41
গোটো একটি স্বেচ্ছাসেবী স্থান থেকে অন্য যথেচ্ছ স্পটে 'জাম্পিং' করতে পারে। ভেলোসিরাপটার কোথাও থেকে এখানে লাফিয়ে উঠল!
আরপট্টবী

29
আমি রসিকতাটিকে মোটেও মজাদার মনে করি না কারণ সকলেই জানেন যে মৃত্যুদন্ড কার্যকর করার আগে আপনাকেও লিঙ্ক করতে হবে।
কিনজল দীক্ষিত

31
আপনার সহকর্মী ভুল, এবং স্পষ্টতই নুথের কাগজটি পড়েন নি।
জিম বাল্টার

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

4
আপনি বুঝতে পারেন যে ডেল্ফি লাইব্রেরির উত্স কোডটিতে গোটো স্টেটমেন্ট রয়েছে। এবং এগুলি গোটোর উপযুক্ত ব্যবহার।
ডেভিড হেফারনান

131

কখনও কখনও একক ফাংশনের মধ্যে ব্যতিক্রম পরিচালনার বিকল্প হিসাবে GOTO ব্যবহার করা বৈধ:

if (f() == false) goto err_cleanup;
if (g() == false) goto err_cleanup;
if (h() == false) goto err_cleanup;

return;

err_cleanup:
...

COM কোডটি প্রায়শই প্রায়শই এই প্যাটার্নে পড়ে যায়।


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

48
@ বোবি: স্থানীয় ভেরিয়েবলগুলি পরিষ্কার করে দিলে এরর_ক্লানআপ কোডটিকে সাবরুটিনে স্থানান্তর করা শক্ত।
নিকি

4
আসলে, আমি এটিকে COM / VB6 এ ব্যবহার করেছি কারণ আমার কোনও বিকল্প ছিল না , কারণ এটি বিকল্প ছিল না। আজকাল আমি চেষ্টা / ধরা / শেষ পর্যন্ত কতটা খুশি।
রুই ক্রেভেরিও

10
@ ব্যবহারকারী 4891 আইডিম্যাটিক সি ++ উপায় try} ক্যাচ () {ক্লিনআপ চেষ্টা করে না; but, বরং, আরআইআইআই, যেখানে যে সংস্থানগুলি পরিষ্কার করা দরকার তা ধ্বংসকারীদের মধ্যে সম্পন্ন করা হয়। প্রতিটি কনস্ট্রাক্টর / ডেস্ট্রাক্টর হ'ল একটি রিসোর্স পরিচালনা করে।
ডেভিড স্টোন

5
গোটো ছাড়া সিতে এটি লেখার দুটি উপায় রয়েছে; এবং উভয়ই অনেক খাটো। হয়: যদি (f ()) যদি (g ()) যদি (h ()) সাফল্য ফিরে আসে; পরিষ্কার কর(); প্রত্যাবর্তন ব্যর্থতা; বা: যদি (f () && g () && h ()) সাফল্য ফিরে আসে; পরিষ্কার কর(); প্রত্যাবর্তন ব্যর্থতা;
এলএইচপি

124

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

for{
  for{
    for{
      for{
        for{
          if(stuff){
            GOTO ENDOFLOOPS;
          }
        }
      }
    }
  }
}

ENDOFLOOPS:

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

কোনও গতিবেগকারীরা আমাকে আক্রমণ করেনি।


83
"এটি একটি ফাংশনে রিফ্যাক্টর করুন এবং ফেরতের সাথে গোটো প্রতিস্থাপন করুন :)", এবং পার্থক্য কি? সত্যিই কি পার্থক্য? আবারও ফিরে যাব না? রিটার্নগুলি গোটো করার মতো কাঠামোগত প্রবাহকেও ব্রেক করে এবং এক্ষেত্রে তারা এটি একইভাবে করে (এমনকি যদি
গোটো অর্থের

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

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

31
@ লেপ্পি: প্রজন্ম যে বিদ্রোহ করেছিল gotoএবং আমাদের কাঠামোগত প্রোগ্রামিং দিয়েছে তাও একই কারণে প্রারম্ভিক রিটার্ন প্রত্যাখ্যান করেছে। কোডটি কতটা পঠনযোগ্য, প্রোগ্রামারটির অভিপ্রায়টি কতটা স্পষ্টভাবে প্রকাশ করেছে তা নেমে আসে। ম্যালিনযুক্ত কীওয়ার্ড ব্যবহার না করা ছাড়া অন্য কোনও উদ্দেশ্যে ফাংশন তৈরি করা খারাপ সংশ্লেষের ফলস্বরূপ: রোগ নিরাময়ের চেয়ে নিরাময় আরও খারাপ worse
মাড

21
@ বাটলবাটকাস: সত্যি কথা বলতে গেলে এটাই খারাপ, আরও খারাপ না হলে। কমপক্ষে একটি দিয়ে goto, কেউ স্পষ্টভাবে লক্ষ্য নির্দিষ্ট করতে পারে । সহ break 5;, (1) গন্তব্যটি খুঁজে পেতে আমাকে লুপ ক্লোজিং গণনা করতে হবে; এবং (2) লুপের কাঠামোটি যদি কখনও পরিবর্তিত হয় তবে গন্তব্যটি সঠিক রাখার জন্য এটির নম্বরটি পরিবর্তনের প্রয়োজন হতে পারে। আমি যদি এড়াতে যাচ্ছি goto, তবে লাভটি এমনভাবে ম্যানুয়ালি স্টাফগুলি না পেয়ে থাকা উচিত।
সিএইচও

93

আমরা ইতিমধ্যে এই আলোচনা ছিল এবং আমি আমার বক্তব্য দ্বারা দাঁড়ানো ।

তদুপরি, আমি উচ্চতর স্তরের ভাষার কাঠামোগুলিকে " gotoছদ্মবেশে" হিসাবে বর্ণনা করার কারণে আমি বিরক্ত হয়েছি কারণ তারা স্পষ্টভাবে বিন্দুটি পায়নি । উদাহরণ স্বরূপ:

এমনকি স্কিমের উন্নত ধারাবাহিকতা নিয়ন্ত্রণ কাঠামোটিকে একটি অত্যাধুনিক গোটো হিসাবে বর্ণনা করা যেতে পারে।

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

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


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

10
তাহলে গোটোর যথাযথ ব্যবহার কী? প্রতিটি ক্ষেত্রে কল্পনাপ্রসূত আরও ভাল সরঞ্জাম উপযুক্ত। এমনকি আপনার নাকাল পাথরটি আসলে আজকাল উচ্চ প্রযুক্তির সরঞ্জাম দ্বারা প্রতিস্থাপন করা হয়, এমনকি যদি সেগুলি এখনও শিলা দিয়ে তৈরি হয় । একটি কাঁচামাল এবং একটি সরঞ্জাম মধ্যে একটি বড় পার্থক্য আছে।
কনরাড রুডল্ফ

8
@jalf: এতে যান অবশ্যই আছে C # বিদ্যমান। দেখুন stackoverflow.com/questions/359436/...
জন স্কিট

51
আমি হতাশ হয়ে পড়েছি যাতে অনেকে এই পোস্টটি অনুমোদন করে। আপনার পোস্টটি কেবল কার্যকর বলে মনে হয়েছিল কারণ আপনি কখনই যুক্তি দেখিয়েছেন যে আপনি আসলে কী যুক্তি প্রদর্শন করছেন, তাই আপনি আপনার ত্রুটি লক্ষ্য করতে ব্যর্থ হন। আমাকে আপনার পুরো পোস্টটি প্যারাফ্রেজ করার অনুমতি দিন: "প্রতিটি পরিস্থিতিতে গোটো করার জন্য একটি সর্বোত্তম সরঞ্জাম রয়েছে, তাই গোটোস কখনই ব্যবহার করা উচিত নয়।" এটি একটি যৌক্তিক দ্বি-শর্তযুক্ত এবং যেমন আপনার সম্পূর্ণ পোস্টটি মূলত এই প্রশ্নটি ভিক্ষা করছে "আপনি কীভাবে জানেন যে প্রতিটি পরিস্থিতিতে গোটো করার জন্য একটি সর্বোত্তম সরঞ্জাম রয়েছে?"
স্টাইল সহ কোডিং

10
@ কোডিং: না, আপনি পোস্টিংয়ের সারাংশটি পুরোপুরি মিস করেছেন। এটি একটি বিচ্ছিন্ন, সম্পূর্ণ যুক্তির চেয়ে রিপোস্ট ছিল । আমি কেবল "পক্ষে" মূল যুক্তিতে অস্পষ্টতা দেখিয়েছি goto। আপনি ঠিক বলেছেন যেহেতু আমি gotoপ্রতি সেয়ার বিরুদ্ধে কোন যুক্তি দিচ্ছি না - আমার উদ্দেশ্য নেই - তাই কোনও প্রশ্ন-ভিক্ষা নেই।
কনরাড রুডলফ

91

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

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

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

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

ব্যতিক্রম বা ব্যতিক্রম-জাতীয় আচরণ বাস্তবায়নের জন্য setjmp / longjmp ভাল হতে পারে be সর্বজনীনভাবে প্রশংসিত না হলেও ব্যতিক্রমগুলি সাধারণত একটি "বৈধ" নিয়ন্ত্রণ কাঠামো হিসাবে বিবেচিত হয়।

সেটজ্যাম্প / লংজ্যাম্প হ'ল 'আরও বিপজ্জনক' এই দিক থেকে যে এগুলি সঠিকভাবে ব্যবহার করা শক্ত, কোনটি বোধগম্যভাবে বিবেচনা করবেন না।

খারাপ কোড লেখার ক্ষেত্রে এটি এমন কোনও ভাষা ছিল না যা আগে কখনও হয়নি, যেখানে এটি খারাপ কোড লিখতে খুব কমই কঠিন। - ডোনাল্ড নুথ

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

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


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

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

11
+1 স্টেট মেশিনে থাকা এই তীরগুলি অন্য কোনও নিয়ন্ত্রণ কাঠামোর চেয়ে আরও কাছাকাছি 'গোটো' করতে ম্যাপ করে। অবশ্যই, আপনি একটি লুপের অভ্যন্তরে একটি স্যুইচ ব্যবহার করতে পারেন - ঠিক যেমন আপনি অন্যান্য সমস্যার জন্য কিছু সময়ের পরিবর্তে গুচ্ছের গুচ্ছ ব্যবহার করতে পারেন তবে এটি সাধারণত একটি ধারণা; যা এই আলোচনার পুরো বিষয়টি।
এডমন্ড

2
আমি কি আপনাকে শেষ অনুচ্ছেদে উদ্ধৃতি দিতে পারি?
ক্রিস লুটজ

2
এবং, এখানে 2013, আমরা ইতিমধ্যে "পয়েন্টারগুলি ক্ষতিকারক হিসাবে বিবেচিত" পর্যায়ে আঘাত করেছি (এবং ইতিমধ্যে অতীত হয়ে গেছে)।
ইসিয়া মিডোস

68

ইন লিনাক্স: কার্নেল কোড সালে এতে যান ব্যবহার কার্নেল ফাঁদ, সেখানে লিনাস টোরভাল্ডস এবং একটি "নতুন লোক" লিনাক্স কোডে GOTOs ব্যবহার সম্পর্কে সঙ্গে একটি আলোচনা আছে। সেখানে খুব ভাল পয়েন্ট রয়েছে এবং লিনাস সেই সাধারণ অহংকার পরিহিত :)

কিছু অংশ:

লিনাস: "না, আপনি সিএস লোকেরা ব্রেইন ওয়াশ করেছেন যারা ভেবেছিলেন যে নিকলাস ওয়ার্থ আসলে তিনি কী বলছেন তা জানেন। তিনি করেননি। তার কোনও ফ্রিগিং ক্লু নেই।"

-

লিনাস: "আমি মনে করি গোটো ভাল আছে, এবং এগুলি প্রায়শই প্রচুর পরিমাণে ইনডেন্টেশনের চেয়ে বেশি পঠনযোগ্য।"

-

লিনাস: "অবশ্যই, পাস্কালের মতো নির্বোধ ভাষায় যেখানে লেবেলগুলি বর্ণনামূলক হতে পারে না, সেখানে গোটো খারাপ হতে পারে।"


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

5
কি দারুন. এটি পড়ার জন্য হতাশাব্যঞ্জক। আপনি লিনাস টোরভাল্ডসের মতো কোনও বড় ওএস লোক এটি বলার চেয়ে আরও ভাল জানেন। পাসক্যাল (পুরানো-স্কুল পাস্কেল, আধুনিক অবজেক্ট সংস্করণ নয়) Mac৮k সময়কালে ম্যাক ওএস ক্লাসিকটি রচিত ছিল এবং এটি ছিল তার সময়ের সবচেয়ে উন্নত অপারেটিং সিস্টেম।
ম্যাসন হুইলারের

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

30
লিনাস প্রস্থান স্থিতি পরিচালনা করার জন্য গোটোয়ের পক্ষে কেবল স্পষ্টতই (সেই আলোচনায় রিক ভ্যান রিলের মতোই) যুক্তি উপস্থাপন করে এবং সি এর বিকল্প নির্মাণগুলি যদি পরিবর্তিত ব্যবস্থার পরিবর্তে ব্যবহার করা হত তবে সে যে জটিলতা নিয়ে আসত সে ভিত্তিতে তিনি তা করেন।
চার্লস স্টুয়ার্ট

21
আইএমএইচও লিনাস এই বিষয়ে সঠিক। তার বক্তব্যটি হ'ল সিতে লিখিত কার্নেল কোড, যেটিকে ব্যতিক্রম হ্যান্ডলিংয়ের অনুরূপ কিছু বাস্তবায়ন করা দরকার, এটি একটি গোটো ব্যবহার করে সবচেয়ে স্পষ্ট এবং সহজভাবে লেখা হয়েছিল। বাগ্ধারা goto cleanup_and_exitএতে যান কয়েক "ভালো" ব্যবহার সম্পর্কে এখন বাকি আছে যে আমরা হয় for, whileএবং ifআমাদের নিয়ন্ত্রণ প্রবাহ পরিচালনা করতে। আরও দেখুন: প্রোগ্রামারস.স্ট্যাকেক্সেঞ্জিং.
com

50

সি-তে gotoকেবলমাত্র বর্তমান ফাংশনটির পরিসরের মধ্যে কাজ করে, যা কোনও সম্ভাব্য বাগগুলি স্থানীয়করণ করতে ঝোঁক। setjmpএবং longjmpএটি অনেক বেশি বিপজ্জনক, অ-স্থানীয়, জটিল এবং বাস্তবায়ন নির্ভর being বাস্তবে বাস্তবে, তারা অনেকগুলি অনিশ্চিত এবং অস্বাভাবিক many

আমি বিশ্বাস করি যে gotoসি এর বিপদটি খুব অতিরঞ্জিত। মনে রাখবেন যে মূল gotoযুক্তিগুলি পুরানো ফ্যাশন বেসিকের মতো ভাষার দিনগুলিতে ফিরে এসেছিল, যেখানে নতুনরা স্প্যাগেটি কোড লিখতেন:

3420 IF A > 2 THEN GOTO 1430

এখানে লিনাস এর যথাযথ ব্যবহারের বর্ণনা দেয় goto: http://www.kernel.org/doc/Docamentation/CodingStyle (chapter অধ্যায়)।


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

7
আপনি বিন্দুটি মিস করছেন ... তারপরেও আপনাকে স্প্যাগেটি লিখতে হয়নি ... আপনার জিওটিওগুলি সর্বদা শৃঙ্খলাবদ্ধভাবে ব্যবহার করা যেতে পারে
জোয়েলফ্যান

এটাও লক্ষণীয় যে setjmp/ / এর আচরণ longjmpকেবল তখনই নির্দিষ্ট করা হয়েছিল যখন সেগুলি একই ক্ষেত্রের মধ্যে অন্য স্থান থেকে কোনও স্কোপের মধ্যে কোনও স্থানে লাফানোর মাধ্যম হিসাবে ব্যবহৃত হয়েছিল। একবার যখন নিয়ন্ত্রণ setjmpকার্যকর করার সুযোগ ছেড়ে যায় , longjmpতখন তৈরির কাঠামোটিতে ব্যবহারের যে কোনও প্রচেষ্টা setjmpঅনির্ধারিত আচরণের ফলে ঘটবে।
সুপারক্যাট

9
বেসিকের কিছু সংস্করণ আপনাকে করতে দেবে GOTO A * 40 + B * 200 + 30। এটি কীভাবে খুব কার্যকর এবং খুব বিপজ্জনক ছিল তা দেখা মুশকিল নয়।
জন হান্না

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

48

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

gotoএকটি আধুনিক সি প্রোগ্রামে এর সংখ্যা গণনা করুন । এখন নম্বর যোগ break, continueএবং returnবিবৃতি। তদ্ব্যতীত, বার আপনি ব্যবহার নম্বর যোগ if, else, while, switchবা caseGOTO১৯৮68 সালে ডিজকস্ট্র যখন তাঁর চিঠিটি লিখেছিলেন আপনি ফরট্রান বা বেসিকে লিখতে থাকেন তবে আপনার প্রোগ্রামটি কতটি হতে পারে about

প্রোগ্রামিং ভাষাগুলির সময় নিয়ন্ত্রণ প্রবাহের অভাব ছিল। উদাহরণস্বরূপ, মূল ডার্টমাউথ বেসিক:

  • IFবিবৃতি ছিল না ELSE। আপনি যদি একটি চান, আপনি লিখতে হবে:

    100 IF NOT condition THEN GOTO 200
    ...stuff to do if condition is true...
    190 GOTO 300
    200 REM else
    ...stuff to do if condition is false...
    300 REM end if
    
  • এমনকি আপনার IFবিবৃতিতে একটির প্রয়োজন না ELSEথাকলেও এটি এখনও একটি একক লাইনে সীমাবদ্ধ ছিল, যা সাধারণত একটিতে থাকে GOTO

  • কোন DO...LOOPবক্তব্য ছিল না । নন- FORলুপগুলির জন্য, আপনাকে স্পষ্ট GOTOবা IF...GOTOশুরুতে ফিরে দিয়ে লুপটি শেষ করতে হয়েছিল।

  • ছিল না SELECT CASE। আপনি ব্যবহার করতে হবে ON...GOTO

সুতরাং, আপনি একটি সঙ্গে শেষ পর্যন্ত অনেক এর GOTOআপনার প্রোগ্রাম গুলি। এবং আপনি GOTOকোনও একক সাব্রোটিনের মধ্যে এর সীমাবদ্ধতার উপর নির্ভর করতে পারেন না (কারণ GOSUB...RETURNএটি সাববুটাইনগুলির যেমন একটি দুর্বল ধারণা ছিল), সুতরাং এই GOTOগুলি যে কোনও জায়গায় যেতে পারে । স্পষ্টতই, এটি নিয়ন্ত্রণ প্রবাহকে অনুসরণ করা শক্ত করে তোলে।

এখান থেকেই বিরোধী GOTOআন্দোলন এসেছে।


আরেকটি বিষয় লক্ষণীয় হ'ল কোড লেখার পছন্দের উপায়টি যদি কোনও লুপে কিছু কোড থাকে যা খুব কমই সম্পাদন করতে হয় 420 if (rare_condition) then 3000// 430 and onward: rest of loop and other main-line code// 3000 [code for rare condition]// হবে 3230 goto 430। কোডটি লেখার ফলে সাধারণ মেইন-লাইনের ক্ষেত্রে নেওয়া কোনও শাখা বা জাম্প এড়ানো যায় তবে এটি অনুসরণ করা শক্ত করে তোলে। সমাবেশের কোডে শাখা এড়ানো আরও খারাপ হতে পারে, যদি কিছু শাখা উদাঃ +/- 128 বাইটের মধ্যে সীমাবদ্ধ থাকে এবং কখনও কখনও পরিপূরক জোড়া না থাকে (যেমন "সিজেএন" বিদ্যমান তবে "সিজে" নয়)।
সুপারক্যাট

আমি একবার 8x51 এর জন্য কিছু কোড লিখেছিলাম যার মধ্যে একটি বাধা ছিল যা প্রতি 128 চক্রের মধ্যে একবার দৌড়ায়। আইএসআর এর সাধারণ ক্ষেত্রে ব্যয় করা প্রতিটি অতিরিক্ত চক্র মেইনলাইন কোডের প্রয়োগের গতি 1% এরও বেশি হ্রাস করবে (আমি মনে করি 128 এর মধ্যে 90 টি চক্র সাধারণত মেইন-লাইনের জন্য উপলব্ধ ছিল) এবং যে কোনও শাখা নির্দেশিকা দুটি চক্র গ্রহণ করতে পারে ( উভয় শাখা এবং পতনের মাধ্যমে ক্ষেত্রে)। কোডটির দুটি তুলনা ছিল - একটি যা সাধারণত সমান রিপোর্ট করবে; অন্যটি, সমান নয়। উভয় ক্ষেত্রে, বিরল-ক্ষেত্রে কোডটি 128 বাইটের বেশি দূরে ছিল। সুতরাং ...
সুপারক্যাট

cjne r0,expected_value,first_comp_springboard/.../ cjne r1,unexpected_value,second_comp_fallthrough// `ajmp second_comp_target` // first_comp_springboard: ajmp first_comp_target// second_comp_fallthrough: ...। খুব সুন্দর কোডিং প্যাটার্ন নয়, তবে যখন পৃথক চক্র গণনা করা হয়, তখন কেউ এ জাতীয় কাজ করে। অবশ্যই, 1960 এর দশকে, আজকের তুলনায় এই ধরনের অপটিমাইজেশনের স্তরগুলি আরও বেশি গুরুত্বপূর্ণ ছিল, বিশেষত যেহেতু আধুনিক সিপিইউগুলিতে প্রায়শই অদ্ভুত অপ্টিমাইজেশনের প্রয়োজন হয় এবং কেবলমাত্র ইন-টাইম সংকলন সিস্টেমগুলি সিপিইউগুলির জন্য অনুকূলিতকরণ কোড প্রয়োগ করতে সক্ষম হতে পারে যা বিদ্যমান ছিল না যখন প্রশ্নে কোড লেখা ছিল।
সুপারক্যাট

34

কিছু ক্ষেত্রে "রিয়েল" ব্যতিক্রম হ্যান্ডলিংয়ের জন্য এক ধরণের স্ট্যান্ড-ইন সরবরাহ করতে যেতে যান To বিবেচনা:

ptr = malloc(size);
if (!ptr) goto label_fail;
bytes_in = read(f_in,ptr,size);
if (bytes_in=<0) goto label_fail;
bytes_out = write(f_out,ptr,bytes_in);
if (bytes_out != bytes_in) goto label_fail;

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

success=false;
do {
    ptr = malloc(size);
    if (!ptr) break;
    bytes_in = read(f_in,ptr,size);
    if (count=<0) break;
    bytes_out = write(f_out,ptr,bytes_in);
    if (bytes_out != bytes_in) break;
    success = true;
} while (false);

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

সুতরাং, গল্পটির নৈতিকতা হল, গোটো ব্যবহার এড়াতে যদি আপনি নিজেকে সত্যিই বোকা কিছু মনে করেন তবে তা করবেন না।


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

5
@ ড্যানিয়েল অ্যালেনল্যাংডন: এই যে breakলুপের ভিতরে রয়েছে তা স্পষ্ট করে দেয় যে তারা লুপ থেকে বেরিয়ে আসে । এটি "তারা ঠিক কী করে" তা নয়, বাস্তবে, কোনও লুপ নেই! এর মধ্যে কোনও কিছুর পুনরাবৃত্তি করার সুযোগ নেই, তবে এটি শেষ অবধি পরিষ্কার নয়। আপনার এমন একটি "লুপ" রয়েছে যা কখনও কখনও একাধিকবার চলতে পারে না তার অর্থ নিয়ন্ত্রণ নিয়ন্ত্রণগুলি অপব্যবহার করা হচ্ছে। সঙ্গে gotoউদাহরণস্বরূপ, প্রোগ্রামার বলতে পারেন goto error_handler;। এটি আরও স্পষ্ট, এবং অনুসরণ করা আরও কম কঠিন। (Ctrl + F, "ত্রুটি_হ্যান্ডলার:" লক্ষ্যটি সন্ধান করতে "" with "দিয়ে এটি করার চেষ্টা করুন))
সিএইচও

1
আমি একবার এয়ার ট্র্যাফিক কন্ট্রোল সিস্টেমে আপনার দ্বিতীয় উদাহরণের মতো কোড দেখেছি - কারণ 'গোটো আমাদের অভিধানে নেই'।
কিড

30

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

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

নিবন্ধটিতে সমস্যার সম্পূর্ণ বিবরণ, ইতিহাস, উদাহরণ এবং পাল্টা উদাহরণ রয়েছে।


25

গোটো সহায়ক হিসাবে বিবেচিত।

আমি ১৯5৫ সালে প্রোগ্রামিং শুরু করি। ১৯ -০-এর দশকের প্রোগ্রামারগুলিতে "গোটো ক্ষতিকারক বলে বিবেচিত" শব্দগুলি কম-বেশি বলেছিল যে আধুনিক নিয়ন্ত্রণ কাঠামোযুক্ত নতুন প্রোগ্রামিং ভাষাগুলি চেষ্টা করার মতো ছিল। আমরা নতুন ভাষাগুলি চেষ্টা করেছিলাম। আমরা দ্রুত রূপান্তরিত করেছি। আমরা কখনই ফিরে যাইনি।

আমরা কখনই ফিরে যাইনি তবে আপনি যদি আরও কম বয়সী হন তবে আপনি সেখানে প্রথম স্থানে ছিলেন না।

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

যেগুলি স্লোগানগুলি বুঝতে পারে না তা খুব আলোকিত হয় না। এই জাতীয় স্লোগানগুলি ভুলে যাওয়া ভাল is এই ধরনের স্লোগান কোনও কাজে দেয় না।

এই বিশেষ স্লোগানটি "গোটো ক্ষতিকারক হিসাবে বিবেচিত," এর নিজস্ব অনাবৃত জীবন গ্রহণ করেছে।

অত্যাচার করা যাবে না? উত্তর: নিশ্চিত, তবে কি? কার্যত প্রতিটি প্রোগ্রামিং উপাদান অপব্যবহার করা যেতে পারে। boolউদাহরণস্বরূপ নম্ররা আমাদের মধ্যে যে কেউ বিশ্বাস করতে চায় তার চেয়ে প্রায়শই নির্যাতন করা হয়।

বিপরীতে, 1990 সাল থেকে গোটো আপত্তিজনক একক, প্রকৃত উদাহরণটি সাক্ষাত করতে আমি মনে করতে পারি না।

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

আজ গোটো সম্পর্কে সবচেয়ে খারাপ বিষয়টি এটি যথেষ্ট পরিমাণে ব্যবহৃত হয় না।


24

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

একটি জিনিস যা আমি আলোচিত দেখিনি তা হ'ল ফোর্টরান পাঠ্য বইয়ে এমন ধরণের কোড যা সঠিকভাবে দেখা যায় না taught ডিও লুপ এবং ওপেন-কোডেড সাবরুটাইনগুলির বর্ধিত পরিসরের মতো জিনিসগুলি (মনে রাখবেন, এটি ফোরট্রান II, বা ফোর্টরান চতুর্থ বা ফোর্টরান - 66 হবে - ফোর্টরান or 77 বা 90 নয়)। কমপক্ষে একটি সুযোগ রয়েছে যে সিন্টেক্সিক বিশদটি সঠিক নয়, তবে ধারণাগুলি যথেষ্ট পরিমাণে সঠিক হওয়া উচিত। প্রতিটি ক্ষেত্রে স্নিপেটগুলি একটি ফাংশনের অভ্যন্তরে থাকে।

নোট করুন যে কর্নিগান অ্যান্ড প্লুজারের ' দ্য এলিমেন্টস অফ প্রোগ্রামিং স্টাইল, ২ য় এডন ' বইয়ের দুর্দান্ত কিন্তু তারিখের (এবং মুদ্রণের বাইরে) তার যুগের পাঠ্য বইয়ের প্রোগ্রামিং (70-এর দশকের শেষের দিকে) থেকে জিওটিও-র অপব্যবহারের কিছু বাস্তব জীবনের উদাহরণ রয়েছে। নীচের উপাদানগুলি অবশ্য সেই বই থেকে নেই।

ডিও লুপের জন্য বর্ধিত ব্যাপ্তি

       do 10 i = 1,30
           ...blah...
           ...blah...
           if (k.gt.4) goto 37
91         ...blah...
           ...blah...
10     continue
       ...blah...
       return
37     ...some computation...
       goto 91

এই ধরণের বাজে কথাগুলির একটি কারণ ছিল পুরানো ফ্যাশনযুক্ত পাঞ্চ কার্ড। আপনি খেয়াল করতে পারেন যে লেবেলগুলি (দুর্দান্তভাবে ক্রম ছাড়িয়েছিল কারণ এটি প্রচলিত শৈলী ছিল!) কলাম 1 এ রয়েছে (প্রকৃতপক্ষে, তাদের কলাম 1-5 হতে হবে) এবং কোডটি 7-72 ​​কলামে ছিল (6 কলামের ধারাবাহিকতা ছিল চিহ্নিতকারী কলাম)। -৩-৮০ কলামগুলিকে একটি সিকোয়েন্স নম্বর দেওয়া হবে এবং এমন মেশিনগুলি ছিল যা পাঞ্চ কার্ড ডেকগুলি সিক্যুয়েন্স নম্বর ক্রম অনুসারে বাছাই করে। যদি আপনার প্রোগ্রামটি সিকোয়েন্সড কার্ডগুলিতে থাকে এবং একটি লুপের মাঝখানে কয়েকটি কার্ড (লাইন) যুক্ত করার প্রয়োজন হয় তবে আপনাকে সেই অতিরিক্ত লাইনের পরে সমস্ত কিছু পুনরায় চালু করতে হবে। তবে, আপনি যদি গোটো স্টাফের সাথে একটি কার্ড প্রতিস্থাপন করেন তবে আপনি সমস্ত কার্ডের সন্ধান করা এড়াতে পারবেন - আপনি কেবল নতুন ক্রম সংখ্যার সাহায্যে রুটিনের শেষে নতুন কার্ডগুলিতে টোকা দিয়েছেন। এটি 'গ্রিন কম্পিউটিং'-এ প্রথম প্রচেষ্টা হিসাবে বিবেচনা করুন

ওহ, আপনি এও খেয়াল করতে পারেন যে আমি প্রতারণা করছি এবং চেঁচামেচি করছি না - ফোর্টরান চতুর্থটি সমস্ত উচ্চ-মামলায় সাধারণত লেখা হয়েছিল।

ওপেন-কোডেড সাবরুটাইন

       ...blah...
       i = 1
       goto 76
123    ...blah...
       ...blah...
       i = 2
       goto 76
79     ...blah...
       ...blah...
       goto 54
       ...blah...
12     continue
       return
76     ...calculate something...
       ...blah...
       goto (123, 79) i
54     ...more calculation...
       goto 12

76 এবং 54 লেবেলগুলির মধ্যে গোটো গণিত গোটোর একটি সংস্করণ। যদি ভেরিয়েবলের মান 1 হয় তবে তালিকার প্রথম লেবেল (123) যাও; যদি এর মান 2 হয়, দ্বিতীয়টি গোটো, ইত্যাদি। গণনা গোটো থেকে 76 পর্যন্ত খণ্ডটি হ'ল ওপেন-কোডেড সাবরুটাইন। এটি একটি সাববুটিনের মতো সম্পাদিত কোডের এক টুকরো ছিল, তবে কোনও ফাংশনের মূল অংশে এটি লিখিত ছিল। (ফোর্টরানের স্টেটমেন্ট ফাংশনও ছিল - যা এম্বেড করা ফাংশন যা একটি একক লাইনে লাগানো ছিল))

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

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


2
আপনি যদি goto'বুনোতে' ব্যবহার করে কিছু কোডের উদাহরণ দেখতে চান তবে প্রশ্নটি চেয়েছিল: ওয়ার্কিং বোস-হিব্বার্ড সাজান অ্যালগরিদম 1963 সালে প্রকাশিত কিছু (অ্যালগল 60) কোড দেখায় The মূল লেআউটটি আধুনিক কোডিং মানগুলির সাথে তুলনা করে না। স্পষ্ট বর্ণিত (অভিযুক্ত) কোডটি এখনও মোটামুটি অনির্বচনীয়। gotoবিবৃতি সেখানে কি তা বুঝতে (খুব) এক ধরনের হার্ড কি অ্যালগরিদম আপ হয় না।
জোনাথন লেফলার

1
পাঞ্চ কার্ডের কাছাকাছি কোনও কিছুর অভিজ্ঞতা না পেয়ে খুব অল্প বয়সী হওয়ায় পুনরায় খোঁচা দেওয়ার সমস্যাটি পড়ে এটি আলোকিত হয়েছিল। +1
কিউস - মণিকা

20

গোটো ক্ষতিকারক বলে বিবেচিত এমন কোনও জিনিস নেই ।

গোটো একটি সরঞ্জাম এবং সমস্ত সরঞ্জাম হিসাবে এটি ব্যবহার এবং অপব্যবহার করা যেতে পারে ।

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

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

সংকলকটির জন্য কেবলমাত্র আপনাকে কীওয়ার্ডটি কলঙ্কিত হয়েছিল তা সতর্ক করার জন্য সর্বোত্তম সমাধান হ'ল , এবং সতর্কতা থেকে মুক্তি পেতে আপনাকে বিবৃতিটির চারপাশে বেশ কয়েকটি প্রগা dire় নির্দেশাবলী পূরণ করতে হবে।

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


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

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

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

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

ঘটনাক্রমে, আমি এখানে যে মতামত বর্ণনা করছি তা মূলত আমার নয়, তবে ১৯67 from সালের পর থেকে ডিজকস্ট্রার মূল কাগজটির মূল অংশটি আমি মনে করি, তাঁর সম্পাদক "গোটো ক্ষতিকারক বলে বিবেচিত" দ্বারা পুনরায় শিরোনাম, এটি 50 এর জন্য এমন একটি উক্তিযুক্ত মেম হয়ে গেছে বছরগুলি অবিকল কারণ এটি এত বিপ্লবী, অন্তর্দৃষ্টিপূর্ণ এবং সর্বজনীনভাবে গৃহীত হয়েছিল।
জোনাথন হার্টলি

17

এটি কখনও ছিল না, যতক্ষণ আপনি নিজের জন্য চিন্তা করতে সক্ষম হয়েছিলেন।


17

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

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

সেটজ্যাম্প / লংজ্যাম্পের তাদের জায়গা রয়েছে - তবে সেই জায়গাটি এমন একটি যা আপনি সম্ভবত পরিদর্শন করবেন না তবে একবার খুব দীর্ঘ সময়ে।

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


15

আপনি যদি সি-তে কোনও ভিএম লিখছেন তবে দেখা যাচ্ছে যে (জিসিসি) এর মতো গণিত গোটো ব্যবহার করে:

char run(char *pc) {
    void *opcodes[3] = {&&op_inc, &&op_lda_direct, &&op_hlt};
    #define NEXT_INSTR(stride) goto *(opcodes[*(pc += stride)])
    NEXT_INSTR(0);
    op_inc:
    ++acc;
    NEXT_INSTR(1);
    op_lda_direct:
    acc = ram[++pc];
    NEXT_INSTR(1);
    op_hlt:
    return acc;
}

একটি লুপের মধ্যে প্রচলিত সুইচের চেয়ে অনেক দ্রুত কাজ করে।


কেবল সমস্যা, এটি মানক নয়, তাই না?
কলমারিয়াস

&&op_incঅবশ্যই সংকলন করে না, কারণ (বাম) &একটি মূল্য আশা করে, তবে (ডানদিকে) &একটি ফলমূল পাওয়া যায়।
ফ্রেডওভারফ্লো

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

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

14

কারণ gotoবিভ্রান্তিকর রূপক ব্যবহারের জন্য ব্যবহার করা যেতে পারে

Gotoউভয়ই একটি উচ্চ-স্তরের এবং নিম্ন-স্তরের নিয়ন্ত্রণের এক্সপ্রেশন এবং ফলস্বরূপ এটির বেশিরভাগ সমস্যার জন্য উপযুক্ত নকশার প্যাটার্ন উপযুক্ত নয়।

এটা লো-লেভেল করে একটি এতে যান একটি আদিম অপারেশন অর্থে যে কার্যকরী কিছু উচ্চতর whileবা foreachবা কিছু।

এটি অর্থে উচ্চ-স্তরের যে নির্দিষ্ট উপায়ে ব্যবহৃত হলে কাঠামোগত লুপগুলি ব্যতীত একটি নিরবচ্ছিন্ন ফ্যাশনে একটি কোড নির্ধারণ করে যা একটি স্পষ্ট অনুক্রমের মধ্যে কার্যকর হয় এবং এটি এটিকে যুক্তির টুকরোতে পরিবর্তন করে যেগুলি যথেষ্ট পরিমাণে goto, একটি দখল with যুক্তিটির ব্যাগ গতিশীলভাবে পুনরায় সংযুক্ত করা হচ্ছে।

সুতরাং, একটি প্রসাইক এবং একটি খারাপ দিক আছে goto

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

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

পরিশেষে, বিষয়টিকে সত্যই কভার করার জন্য আমাদের লক্ষ করা উচিত যে মূলত আলগোল ব্যতীত সমস্ত প্রাথমিক ভাষাগুলি তাদের সংস্করণগুলির সাপেক্ষে কেবলমাত্র একক বিবৃতি দিয়েছিল if-then-else। সুতরাং, শর্তাধীন ব্লক করার একমাত্র উপায় ছিল gotoএকটি বিপরীত শর্তসাপেক্ষ ব্যবহার করে এটির চারপাশে। পাগল, আমি জানি, কিন্তু আমি কিছু পুরানো চশমা পড়েছি। মনে রাখবেন যে প্রথম কম্পিউটারগুলি বাইনারি মেশিন কোডে প্রোগ্রাম করা হয়েছিল সুতরাং আমি মনে করি যে কোনও প্রকারের এইচএলএল একটি জীবনকাল ছিল; আমি অনুমান করি যে তারা এইচএলএল বৈশিষ্ট্যগুলি কীভাবে পেয়েছিল সে সম্পর্কে খুব পছন্দসই ছিল না।

আমি gotoপ্রতিটি প্রোগ্রামের মধ্যে একটি করে লেগে থাকি এমন সমস্ত কথা বলার পরে আমি "কেবল পিউরিস্টদের বিরক্ত করার জন্য" লিখেছিলাম ।


4
পিউরিস্টদের বিরক্ত করার জন্য +1! :-)
লুমি

10

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

আমি খুঁজে পেয়েছি কোডের একটি ছোট উদাহরণ এখানে।

  YORN = ''
  LOOP
  UNTIL YORN = 'Y' OR YORN = 'N' DO
     CRT 'Is this correct? (Y/N) : ':
     INPUT YORN
  REPEAT
  IF YORN = 'N' THEN
     CRT 'Aborted!'
     STOP
  END

----------------------- বা ----------------------

10:  CRT 'Is this Correct (Y)es/(N)o ':

     INPUT YORN

     IF YORN='N' THEN
        CRT 'Aborted!'
        STOP
     ENDIF
     IF YORN<>'Y' THEN GOTO 10

3
সিআরটি করুন 'এটা কি সঠিক? (Y / N): ': ইনপুট ইয়র্ক অব ইয়ার অব ইয়ার্ন =' ই 'বা ইয়র্ন =' এন '; ইত্যাদি
joel.neely

5
প্রকৃতপক্ষে, তবে আরও গুরুত্বপূর্ণ, একটি বাস্তব প্রোগ্রামার জানে কখন একটি ব্যবহার না করা goto- এবং কেন তা জানে । নিষিদ্ধ ভাষা নির্মাণ এড়ানো কারণ $ প্রোগ্রামিং_গুরু তাই বলেছিলেন, এটি কার্গো-কাল্ট প্রোগ্রামিংয়ের খুব সংজ্ঞা।
পিসকভোর

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

9

"এই লিঙ্কে http://kerneltrap.org/node/553/2131 "

কৌতুকজনকভাবে, গেটোকে বাদ দিয়ে একটি বাগ প্রবর্তিত: স্পিনলক কল বাদ দেওয়া হয়েছিল।


'গোটোকে বাদ দেওয়ার জন্য একটি বাগ প্রবর্তিত হয়েছে' এর জন্য +1
কেইইডি

7

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


6

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

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

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

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

-Adam


5

একটি আধুনিক গোটো ব্যবহার হ'ল সি # সংকলক দ্বারা ফলন ফেরতের মাধ্যমে সংজ্ঞায়িত গণকের জন্য রাষ্ট্রীয় মেশিন তৈরি করা হয়।

গোটো এমন একটি বিষয় যা প্রোগ্রামার দ্বারা নয় সংকলকগণের দ্বারা ব্যবহার করা উচিত।


5
সংকলকগুলি হু হু হু হু ইয়ার?
চালনা

10
সংকলকগণ অবশ্যই!
Seiti

3
আমি মনে করি তার অর্থ "গোটো এমন একটি জিনিস যা কেবলমাত্র একটি সংকলক দ্বারা নির্গত কোড দ্বারা ব্যবহার করা উচিত"।
সাইমন বুচান

এটি বিরুদ্ধে মামলা goto। যেখানে আমরা gotoএকটি গণক কার্যকর করতে হাতে কোডেড কোনও রাজ্য-মেশিন ব্যবহার করতে পারি, আমরা কেবল yieldপরিবর্তে ব্যবহার করতে পারি ।
জন হান্না

গেটো স্টেটমেন্টের সাথে স্যুইচ করতে ডিফল্ট কেস কম্পাইল করে অনেক স্ট্রিং (যদি-অন্যথায় সংকলন রোধ করতে) স্যুইচ করুন।
এমকাজেম আখগারি

5

সি এবং সি ++ (অন্যান্য অপরাধীদের মধ্যে) বিরতিতে লেবেল বিরতি এবং অবিরত না হওয়া পর্যন্ত গোটোর ভূমিকা থাকবে।


সুতরাং লেবেল বিরতি বা চালিয়ে যাওয়া কীভাবে আলাদা হবে?
ম্যাথু হোয়াইট

3
তারা নিয়ন্ত্রণ প্রবাহে সম্পূর্ণ স্বেচ্ছাচারিত লাফের অনুমতি দেয় না।
ড্রিপিজা 21

5

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

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

request something
wait for it to be done
while some condition
    request something
    wait for it
    if one response
        while another condition
            request something
            wait for it
            do something
        endwhile
        request one more thing
        wait for it
    else if some other response
        ... some other similar sequence ...
    ... etc, etc.
endwhile

আমি নিশ্চিত যে এটি নতুন নয়, তবে আমি সি (++) এ যেভাবে পরিচালনা করেছি তা ছিল কিছু ম্যাক্রো সংজ্ঞায়িত করা:

#define WAIT(n) do{state=(n); enque(this); return; L##n:;}while(0)
#define DONE state = -1

#define DISPATCH0 if state < 0) return;
#define DISPATCH1 if(state==1) goto L1; DISPATCH0
#define DISPATCH2 if(state==2) goto L2; DISPATCH1
#define DISPATCH3 if(state==3) goto L3; DISPATCH2
#define DISPATCH4 if(state==4) goto L4; DISPATCH3
... as needed ...

তারপরে (ধরে নেওয়া রাষ্ট্র প্রাথমিকভাবে 0 হয়) কাঠামোগত রাষ্ট্রের মেশিনটি উপরের কাঠামোগত কোডে পরিণত হয়:

{
    DISPATCH4; // or as high a number as needed
    request something;
    WAIT(1); // each WAIT has a different number
    while (some condition){
        request something;
        WAIT(2);
        if (one response){
            while (another condition){
                request something;
                WAIT(3);
                do something;
            }
            request one more thing;
            WAIT(4);
        }
        else if (some other response){
            ... some other similar sequence ...
        }
        ... etc, etc.
    }
    DONE;
}

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

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


1
ভয়ের বাইরে ভাষার বৈশিষ্ট্য এড়ানো মস্তিষ্কের ক্ষতির লক্ষণ। এটি জাহান্নামের চেয়েও নিখুঁত।
ভেক্টর গর্গোথ

4

আমি এড়াচ্ছি যেহেতু কোনও সহকর্মী / ম্যানেজার নিঃসন্দেহে কোনও কোড পর্যালোচনায় বা এটিতে যখন হোঁচট খায় তখন এর ব্যবহার নিয়ে প্রশ্ন করবে। যদিও আমি মনে করি এটির ব্যবহার রয়েছে (উদাহরণস্বরূপ ত্রুটি হ্যান্ডলিং কেস) - আপনি অন্য কোনও বিকাশকারীকে চালিয়ে যাবেন যার সাথে এটির কোনও ধরণের সমস্যা রয়েছে।

এটা মূল্য নয়।


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

আমার আরও ভাল সমাধান রয়েছে: আপনি কোড 'ডো' in ...} এর সময় (0) 'তে পপ আউট করতে চান এমন কোডের অংশটি মুড়িয়ে দিন;' লুপ. এইভাবে, আপনি চেষ্টা / ক্যাচ লুপের ওভারহেড ছাড়াই গোটো হিসাবে একইভাবে ঝাঁপিয়ে পড়তে পারেন (আমি সি # সম্পর্কে জানি না, তবে সি ++ এ চেষ্টা কম দামের এবং ক্যাচটি উচ্চ ব্যয়বহুল, তাই দেখে মনে হয়) একটি ব্যতিক্রম ছোঁড়া মাত্রাতিরিক্ত যেখানে একটি সাধারণ লাফ যথেষ্ট হবে)।
জিম ডোভী

10
জিম, এর সাথে সমস্যাটি হ'ল এটি একটি গোটো অর্জনের বোকামি রাউন্ড আউট উপায় ছাড়া আর কিছুই নয়।
স্টাইল সহ কোডিং

4

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

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

SomeObject someObject;    

if (someObject.IsComplex())    // this test is trivial
{
    // begin slow calculations here
    if (result of calculations)
    {
        // just discovered that I could use the fast calculation !
        goto Fast_Calculations;
    }
    // do the rest of the slow calculations here
    return;
}

if (someObject.IsmediumComplex())    // this test is slightly less trivial
{
    Fast_Calculations:
    // Do fast calculations
    return;
}

// object is simple, no calculations needed.

এটি রিয়েলটাইম ইউআই কোডের একটি গতি সমালোচনামূলক অংশ ছিল, তাই আমি আন্তরিকভাবে মনে করি যে এখানে কোনও গোটো ন্যায়সঙ্গত ছিল।

হুগো


নন-গোটো উপায়টি হ'ল একটি দ্রুত_ গণনার ফাংশন ব্যবহার করা হবে যা কিছু ওভারহেড দেয়। বেশিরভাগ পরিস্থিতিতে সম্ভবত লক্ষণীয় নয়, তবে আপনি যেমন বলেছিলেন এটি গতি-সমালোচনামূলক ছিল।
কাইল ক্রোনিন

1
ভাল যে খুব কমই অবাক হয়। সমস্ত কোড যা পুরোপুরি উন্মাদ পারফরম্যান্স নির্দেশিকা রয়েছে সবসময় সমস্ত সেরা-অনুশীলনগুলি ভেঙে দেবে। সেরা অনুশীলনগুলি পুনঃসৌ .়তা এবং রক্ষণাবেক্ষণের জন্য, 10 টি আরও বেশি মিলি সেকেন্ড আটকানোর জন্য বা 5 বাইটে আরও বেশি র্যাম সংরক্ষণের জন্য নয়।
জনাথন

1
@ জোনাথন উইসনোস্কি, গোটোর বৈধ ব্যবহারগুলি যেখানে আমরা যাচ্ছি তার উপর নজর রাখার জন্য ইঁদুরের বাসাতে ইঁদুরের বাসা বাঁধে পাগল পরিমাণের স্প্যাগেটি কোডকে দূর করে।
ভনব্রান্ড

4

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

আমি ব্যক্তিগতভাবে এটি কখনই স্পষ্টভাবে ব্যবহার করি না, কখনও প্রয়োজন হয় না।


4

আমি এখানে কোন উত্তর থেকে দেখতে পাইনি যে একটি 'গোটো' সমাধান প্রায়শই আরও কার্যকর সমাধান প্রায়শই উল্লিখিত কাঠামোগত প্রোগ্রামিং সমাধানগুলির একটির চেয়ে ।

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

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

এখন কোড স্পেস, স্ট্যাকের ব্যবহার এবং এক্সিকিউশন সময় অনেক প্রোগ্রামারদের কাছে অনেক পরিস্থিতিতে যথেষ্ট পরিমাণে বিবেচিত হতে পারে না, তবে যখন আপনি এমবেডেড পরিবেশে কাজ করছেন কেবলমাত্র 2KB কোড স্পেস সহ, 50 টি বাইট অতিরিক্ত নির্দেশাবলীর স্পষ্টভাবে সংজ্ঞায়িত না করার জন্য 'গেটো' কেবল হাস্যকর, এবং এটি এতটা বিরল পরিস্থিতি নয় যা অনেক উচ্চ-স্তরের প্রোগ্রামার বিশ্বাস করে।

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


3

আপনি এটি গভীরভাবে নেস্টেড লুপ থেকে বিরতির জন্য ব্যবহার করতে পারেন তবে বেশিরভাগ সময় আপনার কোডটি গভীরভাবে নেস্ট করা লুপগুলি ছাড়াই ক্লিনার হওয়ার জন্য রিফ্যাক্টর করা যেতে পারে।

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