"কেবলমাত্র এক ফেরত" ধারণাটি এসেছে কোথা থেকে?


1056

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

if (condition)
   return 42;
else
   return 97;

" এটি কুরুচিপূর্ণ, আপনাকে একটি স্থানীয় ভেরিয়েবল ব্যবহার করতে হবে! "

int result;
if (condition)
   result = 42;
else
   result = 97;
return result;

এই 50% কোড ব্লোট কীভাবে প্রোগ্রামটিকে বুঝতে সহজতর করে? ব্যক্তিগতভাবে, আমি এটি আরও শক্তিশালী বলে মনে করি, কারণ রাষ্ট্রীয় স্থানটি কেবলমাত্র আরও একটি পরিবর্তনশীল দ্বারা বৃদ্ধি পেয়েছিল যা সহজেই প্রতিরোধ করা যেতে পারে।

অবশ্যই, সাধারণত আমি কেবল লিখতাম:

return (condition) ? 42 : 97;

তবে অনেক প্রোগ্রামার শর্তসাপেক্ষ অপারেটরটি বন্ধ করে দেয় এবং দীর্ঘ ফর্মটি পছন্দ করে।

"একমাত্র রিটার্ন কেবল" এই ধারণাটি কোথা থেকে এসেছে? এই সম্মেলনটি কেন আসার কোনও reasonতিহাসিক কারণ আছে?


2
এটি কিছুটা গার্ড ক্লজ রিফ্যাক্টরিংয়ের সাথে সংযুক্ত। stackoverflow.com/a/8493256/679340 গার্ড ক্লজটি আপনার পদ্ধতির শুরুতে রিটার্ন যুক্ত করবে। এবং এটি কোডটিকে আমার মতে অনেক পরিষ্কার করে তোলে।
পাইটর পেরাক

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

3
আমি মনে করি উদাহরণটি একটি সহজ যথেষ্ট ক্ষেত্রে যেখানে আমার একরকম বা অন্যরকমের বিষয়ে দৃ opinion় মতামত থাকবে না। একক-এন্ট্রি-একক-প্রস্থান আদর্শ হ'ল 15 রিটার্ন স্টেটমেন্ট এবং আরও দুটি শাখার মতো পাগল পরিস্থিতি থেকে দূরে গাইড করার জন্য যা একেবারেই ফিরে আসে না!
mendota

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

3
আপনার শর্তটি সম্পূর্ণ মুছে ফেলা উচিত। উত্তরটি 42.
16

উত্তর:


1120

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

"একক প্রবেশ" এর অর্থ "ফাংশনগুলির জন্য বিকল্প প্রবেশ পয়েন্ট তৈরি করবেন না"। অ্যাসেম্বলি ভাষায়, অবশ্যই, কোনও নির্দেশে কোনও ফাংশন প্রবেশ করা সম্ভব। ফরটারান ENTRYবিবৃতি সহ ফাংশনে একাধিক এন্ট্রি সমর্থন করেছে :

      SUBROUTINE S(X, Y)
      R = SQRT(X*X + Y*Y)
C ALTERNATE ENTRY USED WHEN R IS ALREADY KNOWN
      ENTRY S2(R)
      ...
      RETURN
      END

C USAGE
      CALL S(3,4)
C ALTERNATE USAGE
      CALL S2(5)

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

C SUBROUTINE WITH ALTERNATE RETURN.  THE '*' IS A PLACE HOLDER FOR THE ERROR RETURN
      SUBROUTINE QSOLVE(A, B, C, X1, X2, *)
      DISCR = B*B - 4*A*C
C NO SOLUTIONS, RETURN TO ERROR HANDLING LOCATION
      IF DISCR .LT. 0 RETURN 1
      SD = SQRT(DISCR)
      DENOM = 2*A
      X1 = (-B + SD) / DENOM
      X2 = (-B - SD) / DENOM
      RETURN
      END

C USE OF ALTERNATE RETURN
      CALL QSOLVE(1, 0, 1, X1, X2, *99)
C SOLUTION FOUND
      ...
C QSOLVE RETURNS HERE IF NO SOLUTIONS
99    PRINT 'NO SOLUTIONS'

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


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

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

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

3
তাহলে কি ব্যতিক্রমগুলি সিঙ্গেল প্রস্থানটির এই ব্যাখ্যাটি লঙ্ঘন করে? (বা তাদের আরও আদিম কাজিন setjmp/longjmp,?)
ম্যাসন হুইলারের

2
যদিও অপ একক রিটার্নের বর্তমান ব্যাখ্যা সম্পর্কে জিজ্ঞাসা করেছে, এই উত্তরটি সবচেয়ে historicalতিহাসিক শিকড় সহ একটি। নিয়ম হিসাবে একক রিটার্ন ব্যবহার করার কোনও অর্থ নেই , যদি না আপনি চান নিজের ভাষা ভিবি (না। নেট) এর দুর্দান্ততার সাথে মেলে না। শুধু মনে রাখবেন নন-শর্ট-সার্কিট বুলিয়ান যুক্তিও ব্যবহার করুন।
acelent

912

সিঙ্গল এন্ট্রি, একক প্রস্থান (এসইএসই) এর এই ধারণাটি সি এবং অ্যাসেমব্লির মতো সুস্পষ্ট সংস্থান ব্যবস্থাপনার ভাষা থেকে আসে । সি তে, এর মতো কোডগুলি সংস্থানগুলি ফাঁস করবে:

void f()
{
  resource res = acquire_resource();  // think malloc()
  if( f1(res) )
    return; // leaks res
  f2(res);
  release_resource(res);  // think free()
}

এই জাতীয় ভাষায়, আপনার কাছে মূলত তিনটি বিকল্প রয়েছে:

  • ক্লিনআপ কোডটি প্রতিলিপি করুন।
    বিতৃষ্ণা। অপ্রয়োজনীয়তা সবসময়ই খারাপ।

  • gotoক্লিনআপ কোডে লাফ দিতে একটি ব্যবহার করুন ।
    এটির জন্য ক্লিনআপ কোডটি ফাংশনের শেষ জিনিস হতে হবে। (এবং এ কারণেই কেউ কেউ যুক্তি দেয় যে gotoএর নিজস্ব জায়গা আছে And এবং এটি প্রকৃতপক্ষে - সি তে রয়েছে)

  • একটি স্থানীয় ভেরিয়েবল প্রবর্তন করুন এবং এটির মাধ্যমে নিয়ন্ত্রণ প্রবাহকে হেরফের করুন।
    অসুবিধা (মনে করে যে, নিয়ন্ত্রণ প্রবাহ সিনট্যাক্স মাধ্যমে কাজে ব্যবহৃত হয় break, return, if, while) অনেক নিয়ন্ত্রণ প্রবাহ ভেরিয়েবল রাষ্ট্র মাধ্যমে কাজে ব্যবহৃত (কারণ যারা ভেরিয়েবল কোন রাষ্ট্র আছে যখন আপনি অ্যালগরিদম তাকান) তুলনায় অনুসরণ করা সহজ।

সমাবেশে এটি এমনকি অদ্ভুত, কারণ আপনি যখন কোনও ফাংশনটি কল করবেন তখন আপনি কোনও ফাংশনের যে কোনও ঠিকানায় ঝাঁপিয়ে পড়তে পারবেন, যার কার্যকরভাবে বোঝা যাচ্ছে যে কোনও ফাংশনে আপনার প্রায় সীমাহীন এন্ট্রি পয়েন্ট রয়েছে। (কখনও কখনও এটি সহায়ক হয় Such সি -++ তে একাধিক-উত্তরাধিকারের পরিস্থিতিগুলিতে ফাংশনগুলি thisকল করার জন্য পয়েন্টার অ্যাডজাস্টমেন্টটি কার্যকর করার জন্য সংকলকগণের জন্য এই অংশগুলি একটি সাধারণ কৌশল virtual))

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


যাইহোক, যখন কোনও ভাষা ব্যতিক্রম বৈশিষ্ট্যযুক্ত, (প্রায়) কোনও ফাংশন অকাল আগে (প্রায়) যে কোনও বিন্দুতে উপস্থিত হতে পারে, সুতরাং আপনাকে যেকোনোভাবে অকাল ফেরতের ব্যবস্থা করতে হবে make (আমি মনে করি finallyমূলত জাভাতে এবং using(বাস্তবায়নের সময় IDisposable, finallyঅন্যথায়) সি #; সি ++ এর পরিবর্তে আরআইআই নিয়োগ করে )) একবার আপনি এটি সম্পন্ন করার পরে, আপনি প্রাথমিক পর্যায়ে বক্তব্য দেওয়ার কারণে নিজেকে পরিষ্কার করতে ব্যর্থ হতে পারবেন নাreturn , তবে সম্ভবত কি এসইএসই-র পক্ষে শক্তিশালী যুক্তি অদৃশ্য হয়ে গেছে।

যা পাঠযোগ্যতা ছেড়ে দেয়। অবশ্যই, অর্ধ ডজন returnবিবৃতি সহ একটি 200 এলওসি ফাংশন এলোমেলোভাবে এর উপরে ছিটানো ভাল প্রোগ্রামিং স্টাইল নয় এবং পঠনযোগ্য কোডের জন্য তৈরি করে না। তবে এই জাতীয় ফাংশনটি অকালপূর্ব রিটার্ন ব্যতীত বুঝতে সহজ হবে না।

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


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

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


52
ঠিক। জাভাতে, ক্লিনআপ কোডটি এমন finallyক্লজগুলির অন্তর্ভুক্ত যেখানে প্রাথমিক returnবা ব্যতিক্রম নির্বিশেষে এটি কার্যকর করা হয় ।
dan04

15
@ dan04 জাভা in এ আপনার এমনকি finallyবেশিরভাগ সময় প্রয়োজন হয় না ।
আর মার্টিনহো ফার্নান্দেস

93
@ স্টিভেন: অবশ্যই আপনি এটি প্রদর্শন করতে পারেন! প্রকৃতপক্ষে, আপনি কোনও বৈশিষ্ট্য সহ সংশ্লেষিত এবং জটিল কোডটি দেখতে পারেন যা কোডকে আরও সহজ এবং বোঝার পক্ষে সহজ করে দেখাতে পারে। সব কিছু আপত্তিজনক হতে পারে। বিন্দুটি কোডটি লিখতে হয় যাতে এটি বোঝা সহজ হয় এবং এর মধ্যে যখন SESE কে উইন্ডো থেকে ছুঁড়ে ফেলাতে জড়িত থাকে, তবে তা হ'ল এবং পুরানো অভ্যাসগুলিকে নষ্ট করা যা বিভিন্ন ভাষায় প্রয়োগ হয়। তবে আমি ভেরিয়েবলগুলি দ্বারা সম্পাদন নিয়ন্ত্রণ করতে দ্বিধা করব না যদি আমি মনে করি এটি কোডটি পড়া সহজ করে তোলে। এটি ঠিক যে আমি প্রায় দুই দশকে এই জাতীয় কোডটি দেখেছি মনে করতে পারি না।
sbi

21
@ কার্ল: প্রকৃতপক্ষে, এটি জাভার মতো জিসি ভাষার একটি গুরুতর ঘাটতি যে তারা একটি সংস্থান পরিষ্কার করতে আপনাকে মুক্তি দেয়, তবে অন্য সমস্তগুলির সাথে ব্যর্থ হয়। (সি ++ ব্যবহার সব সম্পদের জন্য এই সমস্যা solves RAII ।) কিন্তু আমি এমনকি শুধুমাত্র মেমরি কথা বলছি না হয়েছিল (আমি শুধুমাত্র করা malloc()এবং free()একটি উদাহরণ হিসাবে একটি মন্তব্য মধ্যে), আমি সাধারণভাবে সংস্থান সম্পর্কে কথা বলা হয়েছিল। আমিও জিসি বোঝাচ্ছিলাম না যে এই সমস্যাগুলি সমাধান হবে। (আমি সি ++ উল্লেখ করেছি, যার বাক্সের বাইরে জিসি নেই)) আমি যা বুঝতে পারি তা থেকে জাভাতে finallyএই সমস্যাটি সমাধান করার জন্য ব্যবহৃত হয়।
এসবিআই

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

81

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

  int function() {
     if (bidi) { print("return 1"); return 1; }
     for (int i = 0; i < n; i++) {
       if (vidi) { print("return 2"); return 2;}
     }
     print("return 3");
     return 3;
  }

অন্যদিকে, আপনি function()যে কলগুলিতে _function()এবং এর ফলে লগগুলিতে এটি রিফ্যাক্টর করতে পারেন ।


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

3
অনুরূপ কারণে, ফাংশনটি প্রসারিত করা (যুক্ত করা) সহজ করে তোলে, কারণ প্রতিটি রিটার্নের আগে আপনার নতুন কার্যকারিতা সন্নিবেশ করতে হবে না। বলুন, উদাহরণস্বরূপ, ফাংশন কলের ফলাফলের সাথে আপনাকে একটি লগ আপডেট করতে হবে।
জেফসাহোল

63
থাকলে আমি সত্যি যে কোড বজায় রাখার থাকতাম, আমার বরং একটি বুদ্ধিমানের-সংজ্ঞায়িত আছে চাই _function(), সঙ্গে returnউপযুক্ত স্থানে s, এবং একটি লেফাফা নামে function()যে বিদেশী লগিং পরিচালনা চেয়ে একটি একক আছে function()আকুঁচিত যুক্তি দিয়ে সমস্ত আয় করতে একটি একক প্রস্থান মধ্যে মাপসই করা -পয়েন্টটি ঠিক তাই আমি এই বিন্দু আগে একটি অতিরিক্ত বিবৃতি canোকাতে পারেন।
রুখ

11
কিছু ডিবাগারগুলিতে (এমএসভিএস) আপনি শেষের বন্ধনী বন্ধের
ব্রেক

6
মুদ্রণ! = ডিবাগিং। এটা মোটেই তর্ক নয়।
পাইওটার পেরাক

53

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

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


6
সিটির আগের দিনগুলিতে নিবন্ধটি লেখা হয়েছিল যখন GOTO এর ভারী ব্যবহার হত। তারা শত্রু নয়, তবে এই উত্তরটি অবশ্যই সঠিক। একটি ফাংশন শেষে না একটি রিটার্ন বিবৃতি কার্যকরভাবে একটি লক্ষ্য।
ব্যবহারকারী 606723

31
সেই দিনগুলিতেও লেখাটি লেখা হয়েছিল যখন gotoআক্ষরিকভাবে যে কোনও জায়গায় যেতে পারত যেমন প্রক্রিয়া, ফাংশন, কল স্ট্যাক ইত্যাদির কোনও ধারণাকে বাইসাস করে অন্য কোনও ফাংশনের র্যান্ডম পয়েন্টে ডেকে আনা ইত্যাদি কোনও বুদ্ধিমান ভাষা এই দিনগুলিকে সোজা দিয়ে অনুমতি দেয় না goto। সি এর setjmp/ longjmpআমি একমাত্র আধা ব্যতিক্রমী কেস যা আমি সচেতন এবং এমনকি এটি উভয় প্রান্ত থেকে সহযোগিতা প্রয়োজন। (সেমি-ব্যঙ্গাত্মক যে আমি সেখানে "ব্যতিক্রমী" শব্দটি ব্যবহার করেছি, যদিও ব্যতিক্রমগুলি প্রায় একই জিনিসটিকে বিবেচনা করে ...) মূলত, নিবন্ধটি দীর্ঘকালীন একটি অনুশীলনকে নিরুৎসাহিত করে।
সিএওও

5
"এতে যান ক্ষতিকর বিবেচিত বিবৃতি" এর শেষ অনুচ্ছেদ থেকে: "এ [2] Guiseppe Jacopini এর (লজিক্যাল) superfluousness প্রমাণিত হয়েছে বলে বিবৃতি যেতে বলে মনে হয়। একটি অবাধ প্রবাহ চিত্র অনুবাদ করতে ব্যায়াম একটি jump- মধ্যে বেশী বা কম যান্ত্রিকভাবে তবে একটিও কম সুপারিশ করা উচিত নয় Then তারপরে ফলস্বরূপ প্রবাহ চিত্রটি মূল চিত্রের চেয়ে বেশি স্বচ্ছ হবে বলে আশা করা যায় না ""
হুগমগ

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

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

35

এটি ফওলারকে লিঙ্ক করা সর্বদা সহজ।

এসইএসই এর বিপরীতে যাওয়া প্রধান উদাহরণগুলির মধ্যে একটি হ'ল গার্ড ক্লজ:

গার্ড ক্লজ সহ নেস্টেড শর্তাধীন প্রতিস্থাপন করুন

সমস্ত বিশেষ ক্ষেত্রে গার্ড ক্লজ ব্যবহার করুন

double getPayAmount() {
    double result;
    if (_isDead) result = deadAmount();
    else {
        if (_isSeparated) result = separatedAmount();
        else {
            if (_isRetired) result = retiredAmount();
            else result = normalPayAmount();
        };
    }
return result;
};  

                                                                                                         http://www.refactoring.com/catalog/arrow.gif

double getPayAmount() {
    if (_isDead) return deadAmount();
    if (_isSeparated) return separatedAmount();
    if (_isRetired) return retiredAmount();
    return normalPayAmount();
};  

আরও তথ্যের জন্য রিফ্যাক্টরিংয়ের 250 পৃষ্ঠা দেখুন ...


11
অন্য একটি খারাপ উদাহরণ: এটি অন্য-আইপিএস সহ ঠিক সহজেই ঠিক করা যেতে পারে।
জ্যাক

1
আপনার উদাহরণটি ন্যায্য নয়, এটি সম্পর্কে: ডাবল getPayAmount () {ডাবল ret = স্বাভাবিক পে পেমেন্ট (); if (_isDead) ret = deadAmount (); if (_isSeparated) ret = splitAmount (); if (_isRemitted) ret = UsedAmount (); প্রত্যাবর্তন ret; };
চারবেল

6
@ চারবেল এটি একই জিনিস নয়। যদি _isSeparatedএবং _isRetiredউভয়ই সত্য হতে পারে (এবং কেন এটি সম্ভব হবে না?) আপনি ভুল পরিমাণটি ফেরত দিন।
এইচডিভি

2
@ কনঞ্চগ " নেস্টেড শর্তাদি গার্ডের ক্লজগুলির চেয়ে কার্যকর মৃত্যুর সময় সরবরাহ করবে " এটির মূলত একটি উদ্ধৃতি দেওয়া দরকার। আমার সন্দেহ আছে যে এটি নির্ভরযোগ্যভাবে সত্য। এই ক্ষেত্রে, উদাহরণস্বরূপ, প্রথমদিকে কীভাবে উত্পন্ন কোডের ক্ষেত্রে যৌক্তিক শর্ট সার্কিট থেকে অন্যরকম পরিবর্তন আসে? এমনকি যদি এটি গুরুত্বপূর্ণ হয় তবে আমি এমন একটি ক্ষেত্রে কল্পনাও করতে পারি না যেখানে পার্থক্য একটি অনন্য স্লাইভারের চেয়ে বেশি হবে be সুতরাং আপনি কোডটি কম পঠনযোগ্য করে অকাল অপটিমাইজেশন প্রয়োগ করছেন, আপনার কী ধারণা কিছুটা দ্রুত কোডের দিকে নিয়ে যায় সে সম্পর্কে কিছু অপ্রমাণিত তাত্ত্বিক পয়েন্টকে সন্তুষ্ট করার জন্য। আমরা এখানে এটি করি না
আন্ডারস্কোর_২৩

1
@ আসরে_আর, আপনি ঠিক বলেছেন। এটি সংকলকটির উপর অনেক বেশি নির্ভর করে তবে এটি আরও বেশি জায়গা নিতে পারে .. দুটি সিউডো-অ্যাসেম্বলির দিকে তাকান এবং গার্ড ক্লজগুলি উচ্চ স্তরের ভাষা থেকে কেন আসে তা সহজেই দেখা যায়। "এ" পরীক্ষা (1); শাখা_ফেলা শেষ; পরীক্ষা (2); শাখা_ফেলা শেষ; পরীক্ষা (3); শাখা_ফেলা শেষ; {কোড} শেষ: প্রত্যাবর্তন; "খ" পরীক্ষা (1); শাখা_ভোজ পরবর্তী 1; আসতে; পরের 1: পরীক্ষা (2); শাখা_ভোজ পরবর্তী 2; আসতে; পরের 2: পরীক্ষা (3); শাখা_ভোজ পরবর্তী 3; আসতে; পরের3: {কোড} ফিরে;
কোঞ্চোগ

11

কিছুক্ষণ আগে আমি এই বিষয়টিতে একটি ব্লগ পোস্ট লিখেছিলাম।

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

এই প্রশ্নটি স্ট্যাকওভারফ্লোতেও জিজ্ঞাসা করা হয়েছে


আরে, আমি আর এই লিঙ্কে পৌঁছতে পারি না। আপনি কি এমন কোনও সংস্করণ পেয়েছেন যা হোস্ট করা কোথাও এখনও অ্যাক্সেসযোগ্য?
নিক হার্টলি

হাই, কিউপিটি, ভাল স্পট আমি ব্লগ পোস্টটি ফিরিয়ে এনে উপরের ইউআরএল আপডেট করেছি। এটি এখন লিঙ্ক করা উচিত!
অ্যান্টনি

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

আপনি যদি দাবি করতে যাচ্ছেন যে এর সমর্থনে কোনও আনুষ্ঠানিক গবেষণা নেই, তবে এটির বিপরীতে যে কোনও লিঙ্ক তৈরি করা আপনার পক্ষে মঙ্গলজনক।
মেহরদাদ

মেহরদাদ, এর সমর্থনে যদি কোনও আনুষ্ঠানিক অধ্যয়ন হয়, তা দেখান। এখানেই শেষ. বিরুদ্ধে প্রমাণের উপর জোর দেওয়া প্রমাণের বোঝা সরিয়ে দেওয়া।
অ্যান্থনি

7

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

মুল বক্তব্যটি: আমার ধারণা যে কেউ নিখুঁত কোড লেখার ভান করে না। সুতরাং কোডটি নিয়মিতভাবে "উন্নত" এবং প্রসারিত করার জন্য রিফ্যাক্টরিংয়ের অধীনে। সুতরাং আমার লক্ষ্যটি হবে আমার কোডটিকে যতটা সম্ভব বন্ধুত্বপূর্ণ হিসাবে বন্ধুত্বপূর্ণ রাখা।

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


একই পরিবর্তনশীল ক্ষেত্রে প্রযোজ্য। প্রারম্ভিক রিটার্নের মতো নিয়ন্ত্রণ-প্রবাহ-নির্মাণ ব্যবহারের বিকল্প যা using
উত্সাহক

চলকগুলি বেশিরভাগ ক্ষেত্রে আপনার কোডটিকে টুকরো টুকরো করতে বাধা দেয় না যাতে বিদ্যমান নিয়ন্ত্রণ প্রবাহটি সংরক্ষণ করা হয়। "নিষ্কাশন পদ্ধতি" চেষ্টা করুন। IDE গুলি কেবল নিয়ন্ত্রণ প্রবাহের প্রাকস্রাইভং রিফ্যাক্টরিংগুলি সম্পাদন করতে সক্ষম হয় কারণ তারা আপনার লেখা থেকে শব্দার্থবিজ্ঞান অর্জন করতে সক্ষম হয় না।
oopexpert

5

একাধিক রিটার্ন স্টেটমেন্টগুলি একটি একক রিটার্নের স্টেটমেন্টের সাথে GOTO এর সমতুল্য এই বিষয়টি বিবেচনা করুন। ব্রেক স্টেটমেন্টের ক্ষেত্রেও একই ঘটনা। এইভাবে, আমার মতো কেউ কেউ সমস্ত লক্ষ্য এবং উদ্দেশ্যে তাদের গোটো বিবেচনা করে।

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

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

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

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


6
গোটোস প্রতিস্থাপনকারী সমস্ত কাঠামোগত কনস্ট্রাক্টসগুলি গোটোর শর্তাবলী কার্যকর করা হয়। যেমন লুপগুলি, "যদি" এবং "কেস"। এটি তাদের খারাপ করে না - বাস্তবে বিপরীত। এছাড়াও, এটি "উদ্দেশ্য এবং উদ্দেশ্য"।
অ্যান্টনি

স্পর্শ, কিন্তু এটি আমার বক্তব্যের চেয়ে আলাদা নয় ... এটি আমার ব্যাখ্যাটিকে কিছুটা ভুল করে। আচ্ছা ভালো.
ব্যবহারকারী 606723

GOTO সর্বদা ঠিক হওয়া উচিত যতক্ষণ না (1) লক্ষ্যটি একই পদ্ধতি বা ফাংশনের মধ্যে থাকে এবং (২) দিকটি কোডে এগিয়ে থাকে (কিছু কোড এড়িয়ে যায়) এবং (3) লক্ষ্যটি অন্য কোনও নেস্টেড কাঠামোর ভিতরে নেই (যেমন) যদি-কেসের মাঝখানে থেকে অন্য কেসের মাঝখানে যান)। আপনি যদি এই নিয়মগুলি অনুসরণ করেন তবে GOTO- এর সমস্ত অপব্যবহারের দৃষ্টিভঙ্গি এবং যৌক্তিকভাবেই শক্তিশালী কোডের গন্ধ রয়েছে।
মিক্কো রেন্টালাইনেন

3

Cyclomatic জটিলতা

সোনারক्यूबটি সাইক্লোমেটিক জটিলতা নির্ধারণের জন্য একাধিক রিটার্ন স্টেটমেন্ট ব্যবহার করতে দেখেছি। সুতরাং রিটার্নের বিবৃতি যত বেশি, তত চক্রযুক্ত জটিলতা

রিটার্ন টাইপ পরিবর্তন

একাধিক রিটার্ন মানে আমাদের ফিরতি প্রকার পরিবর্তন করার সিদ্ধান্ত নেওয়ার সময় আমাদের ফাংশনটির একাধিক জায়গায় পরিবর্তন করা দরকার।

একাধিক প্রস্থান

ফিরে আসা মানটির কারণ কী তা বোঝার জন্য শর্তাধীন বিবৃতিগুলির সাথে যৌক্তিকতার সাথে যুক্তিটি যত্ন সহকারে অধ্যয়ন করা প্রয়োজন কারণ এটি ডিবাগ করা আরও শক্ত।

রিফ্যাক্টর সলিউশন

একাধিক রিটার্ন স্টেটমেন্টের সমাধান হ'ল পলিমॉर्फিজমে তাদের প্রতিস্থাপন করা প্রয়োজনীয় বাস্তবায়ন অবজেক্টটি সমাধান করার পরে একটি একক রিটার্ন থাকে।


3
একাধিক স্থানে রিটার্ন মান নির্ধারণে একাধিক রিটার্ন থেকে সরানো চক্রবিজ্ঞানের জটিলতা দূর করে না, এটি কেবল প্রস্থানের অবস্থানটিকে এক করে দেয়। সাইক্লোমাটিক জটিলতা প্রদত্ত প্রসঙ্গে নির্দেশ করতে পারে এমন সমস্ত সমস্যা রয়ে গেছে। "এটি ডিবাগ করা কঠিন, যেহেতু প্রত্যাশিত মানটির কারণ কী তা বোঝার জন্য শর্তাধীন বিবৃতিগুলির সাথে যুক্তিটি যত্ন সহকারে অধ্যয়ন করা দরকার" আবারও, যুক্তিকে রিটার্নটি এক করে দিয়ে পরিবর্তন হয় না। এটি কীভাবে কাজ করে তা বোঝার জন্য আপনার যদি কোডটি সাবধানতার সাথে অধ্যয়ন করতে হয়, তবে এটি পুনরায় বন্ধ করা উচিত, পুরো স্টপ।
উইলডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.