/ রিটার্নে সেরা অনুশীলন


60

আমি ifবিবৃতি দিলে ফিরে আসার আরও ভাল উপায় কী বলে বিবেচিত হয় তা জানতে চাই ।

উদাহরণ 1:

public bool MyFunction()
{
   // Get some string for this example
   string myString = GetString();

   if (myString == null)
   {
      return false;
   }
   else
   {
      myString = "Name " + myString;
      // Do something more here...
      return true;
   }
}

উদাহরণ 2:

public bool MyFunction()
{
   // Get some string for this example
   string myString = GetString();

   if (myString == null)
   {
      return false;
   }

   myString = "Name " + myString;
   // Do something more here...
   return true;
}

আপনি উভয় উদাহরণে দেখতে পাবেন ফাংশনটি ফিরে আসবে true/falseতবে elseপ্রথম উদাহরণের মতো বিবৃতি দেওয়া কি ভাল ধারণা বা এটি না রাখাই ভাল?


7
আপনি যদি প্রথম 'যদি' তে কেবল ত্রুটিগুলি পরীক্ষা করে থাকেন, তবে আপনি আরও ভাল 'অন্য' অন্তর্ভুক্ত করবেন না কারণ ত্রুটিগুলি আসল যুক্তির অংশ হিসাবে ভাবা উচিত নয়।
Mert Akcakaya

2
পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে ফাংশনটি সম্পর্কে ব্যক্তিগতভাবে আমি আরও উদ্বিগ্ন হব, তবে আমার ধারণা এটি কেবল একটি খারাপভাবে নির্বাচিত উদাহরণ?
জে কে।


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

1
আপনি এখানে করতে চান এমন 'আরও কিছু করুন' কী? এটি আপনার ফাংশনটি কীভাবে ডিজাইন করবে তা পুরোপুরি পরিবর্তন করতে পারে।
বেনেডিক্ট

উত্তর:


81

উদাহরণ 2 গার্ড ব্লক হিসাবে পরিচিত। কিছু ভুল হয়ে গেলে (ভুল পরামিতি বা অবৈধ অবস্থা) খুব দ্রুত ব্যতিক্রম প্রত্যাবর্তন করা ভাল suited সাধারণ যুক্তি প্রবাহে উদাহরণ 1 ব্যবহার করা ভাল


+1 - একটি ভাল পার্থক্য এবং আমি কী উত্তর দিতে যাচ্ছি।
তেলস্তিন

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

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

2
+1 টি। অনুপযুক্তভাবে গার্ড ব্লকগুলি এড়ানো তীর কোডের কারণ হয়ে থাকে।
ব্রায়ান

উভয় উদাহরণ গার্ড ব্লক দেখায় না?
আর্নি

44

আমার ব্যক্তিগত শৈলী একক ব্যবহার করা ifপাহারা ব্লক জন্য, এবং if/ elseপ্রকৃত পদ্ধতি প্রক্রিয়াকরণ কোডে।

এই ক্ষেত্রে, আপনি এটি myString == nullপ্রহরী শর্ত হিসাবে ব্যবহার করছেন , তাই আমি একক ifপ্যাটার্ন ব্যবহার করার ঝোঁক চাই ।

কোডটি একটু বেশি জটিল বিবেচনা করুন:

উদাহরণ 1:

public bool MyFunction(myString: string){

    //guard block
    if (myString == null){
        return false;
    }
    else{
        //processing block
        myString = escapedString(myString);

        if (myString == "foo"){
            //some processing here
            return false;
        }
        else{
            myString = "Name " + myString;
            //other stuff
            return true;
        }
    }
}

উদাহরণ 2:

public bool MyFunction(myString: string){

    //guard block
    if (myString == null){
        return false;
    }

    //processing block
    myString = escapedString(myString);

    if (myString == "foo"){
        //some processing here
        return false;
    }
    else{
        myString = "Name " + myString;
        //other stuff
        return true;
    }
}

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

নোট করুন যে এটি একটি স্বতন্ত্র উদাহরণ এবং আপনি else ifএটি পরিষ্কার করার জন্য বিবৃতি ব্যবহার করতে পারেন তবে আমি গার্ড ব্লক এবং প্রকৃত ফাংশন প্রসেসিং কোডের মধ্যে পার্থক্য দেখাতে চাই ing

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


18
আপনি যদি দ্বিতীয়টি থেকে মুক্তি পান তবে উদাহরণ 2 পড়তে আরও সহজ হবে।
ব্রিডুম

18

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


কম ইনডেন্টেশনের জন্য +1। আপনার একাধিক চেক থাকলে এই ভঙ্গিটি আপত্তিকর
d.raev

15

আমার ব্যক্তিগত অনুশীলন নিম্নলিখিত:

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

উদাহরণ স্বরূপ:

public bool myFunction()
{
   // First parameter loading
   String myString = getString();

   // Location of "quick exits", see the second example
   // ...

   // declaration of external resources that MUST be released whatever happens
   // ...

   // the return variable (should think about giving it a default value or not) 
   // if you have no default value, declare it final! You will get compiler 
   // error when you try to set it multiple times or leave uninitialized!
   bool didSomething = false;

   try {
     if (myString != null)
     {
       myString = "Name " + myString;
       // Do something more here...

       didSomething = true;
     } else {
       // get other parameters and data
       if ( other conditions apply ) {
         // do something else
         didSomething = true;
       }
     }

     // Edit: previously forgot the most important advantage of this version
     // *** HOUSEKEEPING!!! ***

   } finally {

     // this is the common place to release all resources, reset all state variables

     // Yes, if you use try-finally, you will get here from any internal returns too.
     // As I said, it is only my taste that I like to have one, straightforward path 
     // leading here, and this works even if you don't use the try-finally version.

   }

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

উদাহরণ স্বরূপ:

public bool myFunction()
{
   String myString = getString();

   if (null == myString)
   {
     // there is nothing to do if myString is null
     return false;
   } 

   myString = "Name " + myString;
   // Do something more here...

   // not using return value variable now, because the operation is straightforward.
   // if the operation is complex, use the variable as the previous example.

   return true;
}

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

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


9
"আমি বেশ কয়েকটি প্রস্থান পয়েন্ট সহ ফাংশন পছন্দ করি না" এর জন্য +1
Corv1nus

@ লরানডকডেভস - একটি উদাহরণ যুক্ত করেছেন - আশা করি আপনার আপত্তি নেই।
ম্যাথু ফ্লিন

@ ম্যাথেজফ্লিন ভাল, আপনি যদি উত্তর না দিয়ে আমার পরামর্শের বিপরীত মনে করেন না ;-) আমি উদাহরণটি অবিরত রাখি, আমি আশা করি অবশেষে এটি আমাদের উভয়ের পক্ষে ভাল হবে :-)
লোরান্ড কেদভেস

@ ম্যাথেজফ্লিন (দুঃখিত, আমি কেবল একটি কাঁকড়া জারজ এবং আমি আমার মতামত পরিষ্কার করতে সাহায্য করার জন্য আপনাকে ধন্যবাদ জানাই। আমি আশা করি আপনি বর্তমান সংস্করণটি পছন্দ করবেন।)
লরানড কেদভেস

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

9

আমি যেখানে দু'বার কারণে গার্ড ব্লক নিয়োগ করতে পছন্দ করি সেখানে:

  1. কিছু নির্দিষ্ট শর্তের ভিত্তিতে তারা দ্রুত প্রস্থান করার অনুমতি দেয়।
  2. জটিলটির জন্য প্রয়োজনীয়তা অপসারণ করুন এবং পরে কোডে বিবৃতি দেওয়া থাকলে অপ্রয়োজনীয়।

সাধারণভাবে বলতে গেলে আমি এমন পদ্ধতিগুলি দেখতে পছন্দ করি যেখানে পদ্ধতির মূল কার্যকারিতা সুস্পষ্ট এবং ন্যূনতম। গার্ড ব্লকগুলি দৃশ্যত এটি ঘটতে সহায়তা করে।


5

আমি "ফল্ট থ্রু" পদ্ধতির পছন্দ করি:

public bool MyFunction()
{
   string myString = GetString();

   if (myString != null)
   {
     myString = "Name " + myString;
     return true;
    }
    return false;
}

ক্রিয়াটির একটি সুনির্দিষ্ট শর্ত রয়েছে, অন্য কোনও কিছুতে কেবল "ডিফল্ট থ্রু" রিটার্ন হয়।


1

আমার যদি একক থাকে তবে শর্তটি নিয়ে আমি খুব বেশি সময় ব্যয় করতে চাই না। তবে আমার যদি একাধিক প্রহরী শর্ত থাকে তবে আমি স্টাইল 2 পছন্দ করি

এই পিকচার। ধরে নিও যে পরীক্ষাগুলি জটিল এবং আপনি জটিলতা এড়াতে সত্যই এগুলিকে একটি-ওআরএড অবস্থায় বেঁধে রাখতে চান না:

//Style1
if (this1 != Right)
{ 
    return;
}
else if(this2 != right2)
{
    return;
}
else if(this3 != right2)
{
    return;
}
else
{
    //everything is right
    //do something
    return;
}

বনাম

//Style 2
if (this1 != Right)
{ 
   return;
}
if(this2 != right2)
{
    return;
}
if(this3 != right2)
{
    return;
}


//everything is right
//do something
return;

এখানে দুটি প্রধান সুবিধা রয়েছে

  1. আপনি কোডটি একটি একক ক্রিয়ায় দুটি ভিজ্যুয়াল লগক্যাল ব্লকে বিভক্ত করছেন: বৈধতার একটি উচ্চতর ব্লক (প্রহরী শর্তাদি) এবং চলমানযোগ্য কোডের একটি নিম্ন ব্লক।

  2. যদি আপনাকে একটি শর্ত যোগ করতে / সরাতে হয় তবে আপনি যদি পুরোপুরি অন্য কোনও মই থেকে গোলমাল করার সম্ভাবনা কমিয়ে দেন।

আর একটি ছোট্ট সুবিধা হ'ল যত্ন নেওয়ার জন্য আপনার কাছে কয়েকটি কম ধনুর্বন্ধনী রয়েছে।


0

এটি এমন বিষয় হওয়া উচিত যা ভাল শোনাচ্ছে।

If condition
  do something
else
  do somethingelse

নিজেকে তখন আরও ভাল প্রকাশ করে

if condition
  do something
do somethingelse

ছোট পদ্ধতির জন্য এটি একটি পার্থক্য অনেক বেশি করবে না, তবে বৃহত্তর যৌগিক পদ্ধতির জন্য এটি সঠিকভাবে পৃথক হবে না বলে এটি বুঝতে অসুবিধা হতে পারে


3
যদি কোনও পদ্ধতি এত দীর্ঘ হয় যে দ্বিতীয় রূপটি বোঝা শক্ত হয় তবে এটি খুব দীর্ঘ।
কেভিন cline

7
আপনার দুটি ক্ষেত্রে কেবলমাত্র সমতুল্য যদি do somethingকোনও রিটার্ন অন্তর্ভুক্ত থাকে । যদি তা না হয় তবে দ্বিতীয় কোডটি প্রিডিটকে do somethingelseনির্বিশেষে কার্যকর করবে ifযা প্রথম ব্লকটি কীভাবে কাজ করে না।
আদনান

ওপি তার উদাহরণগুলিতে যা ব্যাখ্যা করছিল তা তারা। ঠিক প্রশ্নের লাইনটি অনুসরণ করে
জোসে ভ্যালেন্টে

0

আমি 1 টি বিরক্তিকর উদাহরণটি পেয়েছি কারণ মান-ফেরতের ফাংশন শেষে অনুপস্থিত রিটার্ন স্টেটমেন্টটি তাত্ক্ষণিকভাবে "অপেক্ষা করুন, কিছু ভুল আছে" ট্রিগার করে fফ্লেগ। সুতরাং এই ক্ষেত্রে ক্ষেত্রে আমি উদাহরণ 2 সঙ্গে যেতে হবে।

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


0

যখন আপনার ifবিবৃতি সর্বদা ফিরে আসে তখন ফাংশনে অবশিষ্ট কোডটির জন্য অন্য কোনও ব্যবহার করার কোনও কারণ নেই। এটি করার ফলে অতিরিক্ত লাইন এবং অতিরিক্ত ইন্ডেন্টেশন যুক্ত হয়। অপ্রয়োজনীয় কোড যুক্ত করা পড়া পড়া আরও কঠিন করে তোলে এবং সবাই জানেন যে রিডিং কোডটি হার্ড


0

আপনার উদাহরণে, এটি elseস্পষ্টতই অপ্রয়োজনীয়, তবে ...

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

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


0

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

public bool MyFunction()
{
    bool result = false;

    string myString = GetString();

    if (myString != nil) {
        myString = "Name " + myString;

        result = true;
    }

    return result;
}

এই শৈলীর সাহায্যে আমি করতে পারি:

  1. এখনই দেখুন যে আমি কিছু ফিরিয়ে দিচ্ছি।

  2. মাত্র একটি ব্রেকপয়েন্ট সহ ফাংশনটির প্রতিটি অনুরোধের ফলাফলটি পান।


এটি কীভাবে আমি সমস্যার দিকে এগিয়ে যাব তার অনুরূপ। পার্থক্যটি হ'ল আমি মাইস্ট্রিং মূল্যায়ন ক্যাপচার করতে ফলাফল পরিবর্তনশীলটি ব্যবহার করব এবং এটির ফেরত মান হিসাবে ব্যবহার করব।
চক কনওয়ে

@ চককনওয়ে সম্মত, কিন্তু আমি ওপি-র প্রোটোটাইপের সাথে লেগে থাকার চেষ্টা করছিলাম।
কালেব

0

আমার ব্যক্তিগত স্টাইল যেতে ঝোঁক

function doQuery(string) {
    if (!query(string)) {
        query("ABORT");
        return false;
    } // else
    if(!anotherquery(string) {
        query("ABORT");
        return false;
    } // else
    return true;
}

elseপ্রোগ্রামটির প্রবাহ নির্দেশ করতে এবং এটিকে পঠনযোগ্য রাখতে মন্তব্যযুক্ত আউট স্টেটমেন্টগুলি ব্যবহার করে তবে প্রচুর পদক্ষেপের সাথে জড়িত থাকলে স্ক্রিন জুড়ে সহজেই পৌঁছতে পারে এমন বৃহত সূচকগুলি এড়ানো।


1
ব্যক্তিগতভাবে, আমি আশা করি যে আপনার কোডটি নিয়ে আমাকে আর কাজ করতে হবে না।
একটি সিভিএন

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

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

0

আমি লিখতাম

public bool SetUserId(int id)
{
   // Get user name from id
   string userName = GetNameById(id);

   if (userName != null)
   {
       // update local ID and userName
       _id = id;
       _userNameLabelText = "Name: " + userName;
   }

   return userName != null;
}

আমি এই স্টাইলটি পছন্দ করি কারণ এটি সর্বাধিক সুস্পষ্ট যে আমি ফিরে আসব userName != null


1
প্রশ্নটি হল আপনি কেন সেই স্টাইলটি পছন্দ করেন?
কালেব

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

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

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

1
@ আমি আপনার কোডের স্পিরিট পছন্দ করি। ব্যবহারকারীর নামটি দুবার মূল্যায়নের পরিবর্তে আমি প্রথম মূল্যায়নটি একটি ভেরিয়েবলের ক্যাপচার করব এবং তা ফিরিয়ে দেব।
চক কনওয়ে

-1

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

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

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

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


-1

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

পরে যদি কোডে অজান্তেই পরিচয় করানো হয় উদাহরণ 2 হিসাবে যা আউটপুটটিকে উল্লেখযোগ্যভাবে পরিবর্তন করেছে:

   if (myString == null)
   {
      return false;
   }

   //add some v1 update code here...
   myString = "And the winner is: ";
   //add some v2 update code here...
   //buried in v2 updates the following line was added
   myString = null;
   //add some v3 update code here...
   //Well technically this should not be hit because myString = null
   //but we already passed that logic
   myString = "Name " + myString;
   // Do something more here...
   return true;

আমি মনে করি elseঅবিলম্বে এই নালটি পরীক্ষা করার পরে ব্লকটি প্রোগ্রামার তৈরি করেছে যা ভবিষ্যতের সংস্করণগুলিতে বর্ধিত হয়েছে সমস্ত যুক্তিকে একসাথে যুক্ত করেছে কারণ এখন আমাদের যুক্তিগুলির একটি স্ট্রিং রয়েছে যা মূল নিয়মের জন্য অনিচ্ছাকৃত ছিল (মানটি হলে ফিরে আসে) খালি).

আমি কোডেপ্লেক্সের সি # গাইডলাইনগুলির কয়েকটিতে এটিতে আমার বিশ্বাসকে প্রচুর পরিমাণে ndণ দিই (এর সাথে এখানে লিঙ্ক করুন: http://csharpguidlines.codeplex.com/ ) যা নিম্নলিখিতটি জানিয়েছে:

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

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


উদাহরণস্বরূপ অন্য দু'জনকে কীভাবে বিবেচনা করা উচিত নয়? উদ্দেশ্যে ফলাফল কার্যকর করা চালিয়ে যায়। এই ক্ষেত্রে অন্য একটি ধারা যুক্ত করা কেবল পদ্ধতির জটিলতা বাড়ায়।
চক কনওয়ে

সংক্ষিপ্ত ও নির্বিচার ব্লকে প্রশ্নযুক্ত সমস্ত সম্পর্কিত যুক্তি না রাখার ক্ষমতার ভিত্তিতে আমি দ্বিমত পোষণ করি। ফোকাস হ'ল myStringমান এবং ifহ'ল ব্লকটির পরে কোডটি যদি ফলাফলটি যুক্তিযুক্ত হয় তবে স্ট্রিং! = নাল। অতএব যেহেতু ফোকাস যে সাধিত অতিরিক্ত যুক্তিবিজ্ঞান হয় নির্দিষ্ট মান আমার মনে হয় এটা একটি ইন encapsulated করা উচিত elseব্লক। অন্যথায় এটি সম্ভাব্যতা খুলবে কারণ আমি অজান্তেই যুক্তি আলাদা করতে এবং অনিচ্ছাকৃত পরিণতিগুলি প্রবর্তন করে দেখিয়েছি। সর্বদা ঘটতে পারে না, তবে এটি সত্যিই একটি সেরা অনুশীলন মতামত শৈলীর প্রশ্ন ছিল।
এটকনওয়ে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.