এখনও কেউ # সি তে [গোটো] ব্যবহার করে এবং যদি তাই হয় কেন? [বন্ধ]


104

আমি ভাবছিলাম যে কেউ এখনও সি # তে "গোটো" কীওয়ার্ড সিনট্যাক্স ব্যবহার করে কিনা এবং এর সম্ভাব্য কারণগুলি কী কী তা করার আছে।

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

গোটো কীওয়ার্ড সংজ্ঞা


3
"স্থির" মানে কি? লোকেরা কি সমস্ত সময় [সি #] সময় ব্যবহার করত?
ম্যাসিফ

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

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

2
আমি gotoএকটি লুপ ভাঙতে এবং নির্দিষ্ট শর্ত অনুযায়ী বিবৃতি শুরু করতে ফিরে যেতে ব্যবহার করি
নিতিন সাওয়ান্ত

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

উত্তর:


93

কিছু (বিরল) কেস রয়েছে যেখানে গোটো আসলে পাঠযোগ্যতার উন্নতি করতে পারে। প্রকৃতপক্ষে, আপনি যে ডকুমেন্টেশনের সাথে লিঙ্ক করেছেন তার দুটি উদাহরণের তালিকা রয়েছে:

গোটোর একটি সাধারণ ব্যবহার হ'ল একটি স্যুইচ বিবৃতিতে একটি নির্দিষ্ট স্যুইচ-কেস লেবেল বা ডিফল্ট লেবেলে নিয়ন্ত্রণ স্থানান্তর করা।

গোটো স্টেটমেন্টটি গভীরভাবে নেস্ট করা লুপগুলি থেকে বেরিয়ে আসার জন্যও দরকারী।

দ্বিতীয়টির জন্য এখানে একটি উদাহরণ রয়েছে:

for (...) {
    for (...) {
        ...
        if (something)
            goto end_of_loop;
    }
}

end_of_loop:

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


47
সাধারণত আমি একটি পৃথক পদ্ধতিতে লুপগুলি রাখার জন্য এটি রিফ্যাক্টর চেষ্টা করতাম যা থেকে আমি ফিরে আসতে পারি ...
জন স্কিইট

2
@ হেইনজি - আমি নিশ্চয়তা পাচ্ছি না। জনের মতোই, এটি যদি "ওয়্যারেন্টেড" হয়, কোডটি পুনঃসংশ্লিষ্ট হওয়ার জন্য অনুরোধ করছে।
মনোজাল্ড

29
বিরতি লেবেলযুক্ত, গোটো বলার আরও দীর্ঘ পথ কারণ এটি একই ফ্রিকাকিন কাজটি করে ....
যিশু রামোস

20
@ জেসুস তবে গোটো দিয়ে আপনি যে কোনও জায়গায় যেতে পারেন। লেবেলযুক্ত বিরতি নিশ্চিত করে যে আপনি লুপের ঠিক বাইরে যাচ্ছেন।
মিহসাতে

1
যদি না আপনি দুঃসাহসিক হয়ে ওঠেন এবং কোনও ঠিকানা দিয়ে গোটো ব্যবহার না করে (আমি এর আগে এটি দেখেছি) তবে সমস্যাটি প্রশমিত হবে। এবং আমি সন্দেহ করি যে কেউ আপনার সি # এবং জাভা কোডে গেটো স্টেটমেন্টগুলি কাজে লাগানোর জন্য ডিটোর হুক ব্যবহার করছে।
যীশু রামোস

65

আমি এই অংশটি মনে আছে

switch (a)     
{ 
    case 3: 
        b = 7;
        // We want to drop through into case 4, but C# doesn't let us
    case 4: 
        c = 3;
        break; 
    default: 
        b = 2;
        c = 4;
        break; 
}

এই মত কিছু

switch (a)     
{
    case 3: 
        b = 7;
        goto case 4;    
    case 4: 
        c = 3;
        break;     
    default: 
        b = 2;
        c = 4;
        break;
}

পড়ুন এই


17
আমি এটি এখনও ব্যবহার করার সবচেয়ে বৈধ কারণ হিসাবে দেখছি [গোটো]। কমপক্ষে এই দৃশ্যে এটি প্রোগ্রামারদের অজানা যে পাঠ্যতা একে অপরের মধ্যে বিরতি বিবৃতি ছাড়াই পড়তে পারা যায় increases
ব্রায়ান স্কট

11
@ ব্রায়ান স্কট, ভি 4 ভেন্ডেটা। আমি ভুল না হলে প্রথম বিবৃতিটি সি # তে সংকলন করে না। এটি প্রোগ্রামারের বুঝতে সাহায্য করবে।
জোডরেল

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

23

সি # 5 এ অ্যাসিঙ্ক পদ্ধতি ব্যবহার করার সময় সংকলকটি আপনার জন্য যে ধরণের কোড তৈরি করে তা দেখানোর জন্য আমি এডুয়াসেঙ্কে এটি ব্যাপকভাবে ব্যবহার করি You আপনি পুনরায় ব্লকগুলিতে একই জিনিস দেখতে পাবেন।

"সাধারণ" কোডে যদিও, আমি এটি ব্যবহারের শেষ সময়টি মনে করতে পারি না ...


1
আপনি কেন এই পদ্ধতির পছন্দ বা এটি কেবল ব্যক্তিগত পছন্দ হিসাবে একটি ছোট উদাহরণ সরবরাহ করতে পারেন?
ব্রায়ান স্কট

1
@ ব্রায়ান: আপনি কী বোঝাতে চেয়েছেন তা আসলে পরিষ্কার নয়। এডুয়েস্যান্স সংকলকটি আপনার জন্য যা করে তার সমতুল্য সি # কোডটি দেখায় - এবং এটি এমন কোড উত্পন্ন করে যা কার্যকরভাবে কার্যকরভাবে ব্যবহার করে ...
জন স্কিটি

9

গেটো অনেকগুলি লুপগুলি ভেঙে ফেলার জন্য দুর্দান্ত যেখানে বিরতি ভাল কাজ করবে না (ত্রুটির শর্তে বলুন), এবং ক্রেজেন যেমন বলেছিলেন গেটো সংকলক দ্বারা সুইচ স্টেটমেন্ট এবং অন্যান্য কিছু জিনিস উত্পন্ন করতে ব্যবহৃত হয়।


7
অবশ্যই "ব্রেক" / "চালিয়ে যাওয়া" হ'ল ল্যাপ ম্যানেজমেন্টের চেয়ে আরও ভাল পদ্ধতির পরিবর্তে কোড সম্পাদককে পরবর্তী কোডটি কোথায় ঘটে তা বোঝার চেষ্টা করে উত্স কোডের চারপাশে ঝাঁপিয়ে পড়া প্রয়োজন?
ব্রায়ান স্কট

6
যদি আপনি নেস্ট লুপ করেন না Not
যিশু রামোস

1
ঠিক আছে, আমি এটি একটি বৈধ দৃশ্য হিসাবে দেখতে পারি।
ব্রায়ান স্কট

1
একটি ত্রুটি অবস্থায়, আপনার একটি ব্যতিক্রম ছোঁড়া বিবেচনা করা উচিত।
জোডরেল

6
আপনি যদি কোনও ব্যতিক্রম ছাড়াই অভ্যন্তরীণভাবে ত্রুটিটি পরিচালনা করতে চান তবে এটি করার একটি বৈধ উপায়।
যিশু রামোস

8

আমি কখনও ব্যবহারের কথা মনে নেই goto। তবে এটি সম্ভবত চিরকালীন লুপের অভিপ্রায়কে উন্নত করে যা আপনি কখনই প্রস্থান করতে চান না (না break, তবে আপনি এখনও returnবা পারেন throw):

forever: {
  // ...
  goto forever;
}

তারপরে আবারও, একটি while (true)সাধারণের যথেষ্ট হওয়া উচিত ...

এছাড়াও, আপনি এমন অবস্থায় ব্যবহার করতে পারেন যেখানে আপনি লুপের মাঝখানে শুরু করতে কোনও লুপের প্রথম পুনরাবৃত্তিটি চান: উদাহরণের জন্য এখানে দেখুন ।


লিঙ্ক উত্তর একজন "আকর্ষণীয়" ব্যবহার রয়েছে goto.. এবং while(true) {..}একটি আকর্ষণীয় ব্যবহার নয় ..
user2864740

5

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

দেখুন স্বয়ংক্রিয়ভাবে তৈরি রাষ্ট্র মেশিন: পুনরাবৃত্তি ব্লক বাস্তবায়ন বিবরণ উপর কেন / কিভাবে সি শার্প কম্পাইলার হ্যান্ডলগুলি এই কিছু আরো বিস্তারিত জানার জন্য।

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

প্রোগ্রামিং ইতিহাসের ক্লাসিক টুকরোর বিরুদ্ধে যুক্তির জন্য ক্ষতিকারকgoto হিসাবে বিবেচিত গো টু বিবৃতি দেখুন ।


4
এটি বোকামি: অন্যান্য উত্তরগুলির দ্বারা চিত্রিত হিসাবে বেশ কয়েকটি ক্ষেত্রে গোটো কার্যকর ছিল। হয় আপনি এগুলি স্পষ্টভাবে রুবুট করুন, বা কেবল "এটি ভুল" বলা ভাল, ভুল wrong
o0 '

@Lohoris আমি এটা কেনার নই - প্রত্যেক উদাহরণ আমি দেখেছি যেখানে এতে যান (এখানে উত্তর সহ) "পাঠযোগ্যতা উন্নতি" হবে পর্যন্ত আরো ভালো পঠনযোগ্য কিছু সহজ refactoring পরে।
জাস্টিন

3
@ জাস্টিন না, কখনও কখনও নেস্টেড লুপগুলি কিছু করার খুব প্রাকৃতিক উপায়, উদাহরণস্বরূপ যদি আপনি অ্যারের অ্যারেটি অনুসরণ করেন।
o0 '

6
@ জাস্টিন এটি কোনও কার্যক্রমে রাখার জন্য এটি সবসময় পরিষ্কার নয়। আপনি ধর্মীয়ভাবে ঘৃণা করার কিছু এড়ানোর জন্য আপনি কোনও কিছু (একটি অনুষ্ঠান) জোর করছেন (গোটো ব্যবহার করে)। কিছু ভুল করার স্পষ্ট ইঙ্গিত।
o0 '

3
@ জাস্টিন ফাংশন কলগুলির ওভারহেড রয়েছে। gotoনা. কিছু বিবেচনা করার।
ড্যান বেচার্ড

2

প্রসেসর কমপক্ষে একটি লাফ নির্দেশ প্রয়োগ করে এবং আমি নিশ্চিত যে প্রচুর পরিমাণে স্টেটমেন্টগুলি তাদের প্রয়োগ বা ব্যাখ্যার ক্ষেত্রে ব্যবহার করে in

তৃতীয় বা চতুর্থ প্রজন্মের ল্যাঙ্গেজটি ব্যবহার করার একটি ভাল জিনিস হ'ল এই শারীরিক বিবরণটি আমাদের থেকে দূরে সরিয়ে দেওয়া হয়। যদিও আমরা ফাঁসী বিমূর্তির আইনটি সম্পর্কে আমাদের সচেতন হওয়া উচিত বলে আমি মনে করি যে আমাদের সরঞ্জামগুলি যেমন সেগুলি লক্ষ্য করা যায় তেমন ব্যবহার করা উচিত ( দুঃখিত )। যদি আমি কোড লিখতে এবং gotoএকটি ভাল ধারণা মত মনে হয়, এটি সময় চুল্লী সময় হবে। কাঠামোগত ভাষার উদ্দেশ্য হ'ল এই "জাম্প" এড়ানো এবং আমাদের ইঞ্জিনিয়ারিংয়ে একটি যৌক্তিক প্রবাহ তৈরি করা।

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

যদি কেউ এর ব্যবহারের প্রস্তাব দিতে পারে goto দিতে পারে তবে রিফ্যাক্টরিংয়ের চেয়ে ভাল মনে হচ্ছে আমি সানন্দে আমার উত্তর প্রত্যাহার করব।

আমি আশা করি এখানে " বাইকের শেড " এ যাওয়ার জন্য আমি দোষী নই । ভালো লেগেছে Kragen বলছেন, কি জন্য ভাল যথেষ্ট Dijkstra আমার জন্য ভাল যথেষ্ট।


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

-6

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


10
লুপটির কার্যকারিতা চালিয়ে যাওয়ার কোনও মানে না থাকলে আপনি একটি লুপ থেকে বেরিয়ে যেতে চাইবেন। অন্যথায় আপনি অকারণে দীর্ঘতর লুপগুলিতে আরও প্রসেসিং সময় নষ্ট করবেন।
Skuld

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