আমি কি কোনও ফাংশন থেকে তাড়াতাড়ি ফিরে আসব বা একটি বিবৃতি ব্যবহার করব? [বন্ধ]


304

আমি প্রায়শই উভয় ফর্ম্যাটে এই ধরণের ফাংশন লিখেছি, এবং আমি ভাবছিলাম যে একটি ফর্ম্যাট অন্যটির চেয়ে বেশি পছন্দ করা হয়, এবং কেন।

public void SomeFunction(bool someCondition)
{
    if (someCondition)
    {
        // Do Something
    }
}

অথবা

public void SomeFunction(bool someCondition)
{
    if (!someCondition)
        return;

    // Do Something
}

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


9
আমি এই আলোচনার জন্য কিছুটা দেরি করেছি তাই আমি এটিকে কোনও উত্তর দেবো না; আমি এই সম্পর্কে দু'বছর আগেও ভেবেছিলাম: lecterror.com/articles/view/code-formatting- and-readability আমি দ্বিতীয়টি পড়া, সংশোধন করা, রক্ষণাবেক্ষণ এবং ডিবাগ করা সহজ বলে মনে করি। তবে সম্ভবত এটি কেবল আমার :)
ডাঃ হ্যানিবাল লেকটার


4
এখন এই প্রশ্নটি একটি মতামত ভিত্তিক প্রশ্নের সূক্ষ্ম উদাহরণ
রুডল্ফ ওলা

2
সুতরাং যদি এক বা অন্য দিকে কোনও নিখুঁত প্রমাণ না থাকে? যখন এক এবং অন্য দিকে যথেষ্ট যুক্তি সরবরাহ করা হয় এবং উত্তরটি সঠিক হয় তবে সেখানে ভোটদান হয় - এটি এটিকে খুব দরকারী করে তোলে। আমি এই জাতীয় সমাধির প্রশ্নগুলি এই সাইটের মূল্যের জন্য ক্ষতিকারক বলে মনে করি।
gsf

9
এবং আমি মতামত ভিত্তিক প্রশ্ন এবং উত্তর পছন্দ করি। তারা আমাকে জানান যে সংখ্যাগরিষ্ঠরা কী পছন্দ করে এবং এটি আমাকে অন্যদের পড়ার কোড লিখতে দেয়।
Zygimantas

উত্তর:


402

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


7
স্মার্টটাক এগুলিকে "গার্ড ক্লজ" বলে। কমপক্ষে এটাকেই কেন্ট বেক তাদের স্মার্টটাক সেরা অনুশীলন প্যাটার্নগুলিতে ডাকে; আমি জানি না এটি সাধারণ পার্লেন্স কিনা।
ফ্র্যাঙ্ক শিয়েরার

154
তাড়াতাড়ি প্রস্থান করা আপনাকে আপনার সীমিত মানসিক স্ট্যাকের বাইরে জিনিসপত্র পপ করতে দেয়। :)
জোরেেন

50
এর আগে আমি এটিকে "বাউন্সার প্যাটার্ন" হিসাবে উল্লেখ করেছি শুনেছি - দরজায় যাওয়ার আগে খারাপ মামলা থেকে মুক্তি পান।
রেভবিঙ্গো

14
আমি এমনকি যতদূর গিয়েছিলাম এবং এটি অবশ্যই বলতে চাই এটি কেবলমাত্র সঠিক কাজ।
অলিভার ওয়েইল

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

170

অবশ্যই পরেরটি। প্রাক্তনটি এখনই খারাপ দেখাচ্ছে না, তবে আপনি যখন আরও জটিল কোড পাবেন, আমি ভাবতে পারি না যে কেউ এটি ভাববে:

public int SomeFunction(bool cond1, string name, int value, AuthInfo perms)
{
    int retval = SUCCESS;
    if (someCondition)
    {
        if (name != null && name != "")
        {
            if (value != 0)
            {
                if (perms.allow(name)
                {
                    // Do Something
                }
                else
                {
                    reval = PERM_DENY;
                }
            }
            else
            {
                retval = BAD_VALUE;
            }
        }
        else
        {
            retval = BAD_NAME;
        }
    }
    else
    {
        retval = BAD_COND;
    }
    return retval;
}

এর চেয়ে বেশি পঠনযোগ্য

public int SomeFunction(bool cond1, string name, int value, AuthInfo perms)
{
    if (!someCondition)
        return BAD_COND;

    if (name == null || name == "")
        return BAD_NAME;

    if (value == 0)
        return BAD_VALUE;

    if (!perms.allow(name))
        return PERM_DENY;

    // Do something
    return SUCCESS;
}

আমি পুরোপুরি স্বীকার করি আমি একক প্রস্থান পয়েন্টগুলির সুবিধা কখনই বুঝতে পারি নি।


20
একক বহির্গমন পয়েন্টের সুবিধাটি হ'ল ... একটি একক প্রস্থান পয়েন্ট আছে! আপনার উদাহরণ সহ, বেশ কয়েকটি পয়েন্ট রয়েছে যা ফিরে আসতে পারে। আরও জটিল ক্রিয়াকলাপের সাথে, যখন ফেরতের মানের ফর্ম্যাটটি পরিবর্তিত হয় তখন এটি হান্ট-দ্য এক্সিট-পয়েন্টে পরিণত হতে পারে। অবশ্যই, এমন এক সময় রয়েছে যখন একক বহির্গমন পয়েন্টটি জোর করে বোঝা যায় না।
জনল

71
@ জনল বড় ফাংশনগুলি একাধিক প্রস্থান পয়েন্ট নয়, সমস্যা। আপনি যদি এমন কোনও প্রসঙ্গে কাজ না করেন যেখানে একটি অতিরিক্ত ফাংশন কল অবশ্যই আপনার কোডটি ধীরে ধীরে কমিয়ে দেবে ...
ড্যান রোজনস্টার্ক

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

76
@ জেসন ভাইয়ারগুলি যেন একা একা return value;সাহায্য করে !?! তারপরে একজনকে অর্ধ ডজন শিকার করতে হবে value = ..., এই অসুবিধা সহ যে আপনি কখনই নিশ্চিত হন না যে এই কার্যভার এবং চূড়ান্ত রিটার্নের মধ্যে যে মানটি পরিবর্তন হবে না। কমপক্ষে তাত্ক্ষণিকভাবে প্রত্যাবর্তন পরিষ্কার যে কিছুই আর ফলাফল পরিবর্তন করবে না।
সুজোরড

5
@ সুজেদ: আমি এখানে দ্বিতীয় দ্বিতীয়। আপনি যদি ফলাফলটি লগ করতে চান তবে আপনি কলার সাইটে লগইন করতে পারেন। যদি আপনি কারণটি জানতে চান তবে আপনাকে প্রতিটি প্রস্থানস্থান / অ্যাসাইনমেন্টে লগ করতে হবে তাই উভয়ই এই দিকটিতে অভিন্ন।
ম্যাথিউ এম।

32

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

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

public int myFunction(string parameterOne, string parameterTwo) {
  // Can't work without a value
  if (string.IsNullOrEmpty(parameterOne)) {
    throw new ArgumentNullException("parameterOne");
  } 
  if (string.IsNullOrEmpty(parameterTwo)) {
    throw new ArgumentNullException("parameterTwo");
  }

  // ...      
  // Do some work
  // ...

  return value;
}

9
এবং যদি শেষ ফলাফলটি রক্ষণাবেক্ষণযোগ্য হয় তবে কে কোন স্টাইলটি নির্বাচিত হয়েছিল তা যত্নশীল করে?
জেফ সিভার

3
@ জেফ সিভার - সুতরাং কেন এটি একটি "পবিত্র-যুদ্ধ" শৈলীর প্রশ্ন হয়ে উঠেছে, দিনের শেষে এটি ব্যক্তিগত পছন্দের দিকে নেমে আসে এবং অভ্যন্তরীণ স্টাইল গাইড যা বলুক না কেন।
rjzii

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

আমার সংকলকটি যেমন সাইক্লোমাটিক জটিলতার পরামর্শ দেয় তেমন কী? যদি কেউ এটি সহায়তা করতে পারে তবে নীড় কোড না করাই ভাল?
l

24

আমি তাড়াতাড়ি ফিরতে পছন্দ করি

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

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


13

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

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

জাভা সম্পর্কে আমি যথেষ্ট জ্ঞানবান নই, "অবশেষে" ব্লক কোডটি কল হবে কিনা এবং চূড়ান্তরক্ষকরা কিছু ঘটেছে তা নিশ্চিত করার জন্য প্রয়োজনীয় পরিস্থিতিটি পরিচালনা করতে পারবে কিনা।

সি # আমি অবশ্যই উত্তর দিতে পারি না।

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

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


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

1
সি তে, কেবলমাত্র ব্যবহার করুন gotoএবং সম্ভবত একটি দ্বি-পয়েন্ট রিটার্ন করুন। উদাহরণ (কোড ফর্ম্যাটিং মন্তব্যে সম্ভব নয়):foo() { init(); if (bad) goto err; bar(); if (bad) goto err; baz(); return 0; err: cleanup(); return 1; }
মিরাবিলোস

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

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

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

9

জয়ের প্রথম দিকে এগুলি কুরুচিপূর্ণ বলে মনে হতে পারে তবে বড় ifর‍্যাপারগুলির চেয়ে অনেক কম কুরুচিপূর্ণ, বিশেষত যদি পরীক্ষা করার একাধিক শর্ত থাকে।


9

আমি উভয় ব্যবহার।

যদি DoSomethingকোডের 3-5 লাইন হয় তবে প্রথম ফর্ম্যাটিং পদ্ধতিটি ব্যবহার করে কোডটি কেবল সুন্দর দেখাচ্ছে।

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


2
সুন্দর কোনও উপায় নেই! অনেক বেশি ইনডেন্টেশন!
জিমি কেনে

@ জিমিকেন কেবলমাত্র এতগুলি ইনডেন্টেশন রয়েছে যা 3-5 লাইনে ঘটতে পারে, বিশেষত আপনার প্রতি স্তরের 2 (?) লাইনগুলির জন্য বাকী অংশটি ইন্টেন্টেড হয়: নিয়ন্ত্রণের কাঠামো এবং ব্লক শুরুর জন্য একটি, ব্লকের শেষের জন্য একটি।
উত্সাহক

8

একক-প্রবেশ-একক-প্রস্থান জন্য একটি সর্বোত্তম কারণ হ'ল অন্যথায় আনুষ্ঠানিক শব্দার্থবিজ্ঞান অন্যথায় স্পষ্টভাবে কুৎসিত হয়ে যায় (একই কারণে GOTO ক্ষতিকারক হিসাবে বিবেচিত হয়েছিল)।

অন্য কোনও উপায়ে দিন, আপনার সফটওয়্যারটি যখন কেবল 1 টি রিটার্ন পেলে রুটিন থেকে বেরিয়ে আসবে সে সম্পর্কে তর্ক করা সহজ। যা ব্যতিক্রমগুলির বিরুদ্ধেও যুক্তি।

সাধারণত আমি প্রারম্ভিক-রিটার্ন পদ্ধতির নূন্যতম করি।


তবে একটি আনুষ্ঠানিক বিশ্লেষণ সরঞ্জামের জন্য আপনি সরঞ্জামটির প্রয়োজনীয় শব্দার্থকগুলির সাথে একটি বাহ্যিক ফাংশন সংশ্লেষ করতে পারেন এবং কোডটি মানব পাঠযোগ্য keep
টিম উইলিসক্রফ্ট

@Tim। এটি আপনি কতটা ডিংকিং করতে চান এবং আপনি কী বিশ্লেষণ করছেন তার উপর নির্ভর করে। কোডার যদি জিনিসগুলির বিষয়ে বুদ্ধিমান হয় তবে আমি SESE মোটামুটি পাঠযোগ্য।
পল নাথান

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

@ টিম: যথেষ্ট ফর্সা যদিও আমি স্থির ভাষায় এখনও প্রচুর নাটক আছে তা উল্লেখ করতে বাধ্য হতে পারি না।
পল নাথান

একটি কারণ যা ব্যতিক্রমগুলির মুখোমুখি হয় না। একারণে সি-সিগন্যাল দুর্দান্ত, তবে আপনাকে সি ++ তে কিছু কিনে না।
পিটারচেন

7

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


6

এটা নির্ভর করে.

খুব শীঘ্রই পরীক্ষা করার জন্য যদি কিছু স্পষ্ট ডেড ইন্ড শর্ত থাকে যা বাকী ফাংশনটি চালানো অর্থহীন করে তোলে তাড়াতাড়ি প্রত্যাবর্তন *

ফাংশনটি আরও জটিল হলে এবং একাধিক প্রস্থান পয়েন্ট থাকতে পারে (পঠনযোগ্যতার সমস্যা) যদি রেটওয়াল + একক রিটার্ন সেট করুন Set

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


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

@ টিএমএন: ভালো কথা।
ববি টেবিলগুলি

2
এখানে মূল পয়েন্ট যে OO যেমন পণ্য এটি কি আপনি একটি ব্যতিক্রম নিক্ষেপ , না আসতে । একাধিক রিটার্ন খারাপ হতে পারে, একাধিক ব্যতিক্রম থ্রোগুলি অবশ্যই গন্ধযুক্ত কোড নয়।
মাইকেল কে

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

3

একটি ব্যবহার করুন

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

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

ডেলফি স্পেসিফিক ...

আমি মনে মনে করি যে এটি ডেল্ফি প্রোগ্রামারদের জন্য একটি ভাল প্রোগ্রামিং অনুশীলন, যদিও আমার কোনও প্রমাণ নেই। প্রি-D2009, আমরা একটি মান ফেরত পাঠাতে একটি পারমাণবিক উপায় আছে কি না, আমরা exit;এবং result := foo;বা আমরা শুধু ব্যতিক্রম নিক্ষেপ পারে।

যদি আপনি বিকল্প ছিল

if (true) {
 return foo;
} 

জন্য

if true then 
begin
  result := foo; 
  exit; 
end;

আপনি কেবল আপনার প্রতিটি কার্যের শীর্ষে এটি দেখে অসুস্থ হয়ে পড়তে পারেন এবং পছন্দ করতে পারেন

if false then 
begin
  result := bar;

   ... 
end
else
   result := foo;

এবং কেবল exitপুরোপুরি এড়ানো ।


2
নতুন ডেলফিসের সাথে এটি সংক্ষেপে সংক্ষেপিত হতে পারে if true then Exit(foo);আমি প্রায়শই প্রথমে প্রথমে বা যথাক্রমে আরম্ভ resultকরার কৌশলটি ব্যবহার করি , তারপরে সমস্ত ত্রুটির শর্তগুলি পরীক্ষা করে এবং যদি কেবল কোনওটি পূরণ হয়। সাফল্য- কেসটি তখন (সাধারণত) পদ্ধতির শেষে কিছুটা সেট করে। nilFALSEExit;result
JensG

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

এবং সি # প্রোগ্রামাররা। হ্যাঁ, সত্য কথা বলতে গেলে, আমি সত্যিই এটি দরকারী হিসাবে এটি ঘোষণা এবং ব্যবহারের মধ্যে লাইনের সংখ্যা হ্রাস করে (আইআইআরসি এর জন্য এমনকি কিছু মেট্রিক রয়েছে, নামটি ভুলে গেছে)।
JensG

2

আমি নিম্নলিখিত বিবৃতিতে একমত:

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

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


গার্ড ক্লজ জন্য +1। আমি
ইতিবাচকমুখী

1

আমি এই দিনগুলিতে প্রারম্ভিক রিটার্নগুলি প্রায় একচেটিয়াভাবে ব্যবহার করি। আমি এটি লিখি

self = [super init];

if (self != nil)
{
    // your code here
}

return self;

যেমন

self = [super init];
if (!self)
    return;

// your code here

return self;

তবে এটা আসলে কিছু যায় আসে না। আপনার কার্যগুলিতে যদি আপনার বাসা বাঁধানোর এক বা দুটি স্তরের বেশি হয় তবে তাদের ফাঁসানো দরকার।


আমি রাজী. ইন্ডেন্টেশন যা পড়তে সমস্যা সৃষ্টি করে। কম ইনডেন্টেশন ভাল। আপনার সাধারণ উদাহরণে একই মাত্রার ইন্ডেন্টেশন রয়েছে তবে সেই প্রথম উদাহরণটি অবশ্যই আরও ইনডেন্টেশনে বাড়বে যার জন্য আরও মস্তিষ্কের শক্তি প্রয়োজন।
ব্যবহারকারী 441521

1

আমি লিখতে পছন্দ করব:

if(someCondition)
{
    SomeFunction();
}

2
eww। এটি কি পূর্ব-বৈধতা? বা এটি কোনও বৈধতা-উত্সর্গীকৃত মেহটোডে রয়েছে DoSomeFunctionIfSomeCondition?
এসটিডব্লিউ

এটি কীভাবে আপনার উদ্বেগকে আলাদা করে রাখে?
justkt

2
আপনি ফাংশনটির বাস্তবায়ন (এর নির্ভরতার যুক্তি) বাহ্যিক করে এনক্যাপসুলেশন লঙ্ঘন করছেন।
TMN

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

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

1

আপনার মত, আমি সাধারণত প্রথমটি লিখি তবে শেষটি পছন্দ করি। যদি আমার অনেক নেস্টেড চেক থাকে তবে আমি সাধারণত দ্বিতীয় পদ্ধতিতে রিফ্যাক্টর।

ত্রুটি পরিচালনার বিষয়টি কীভাবে চেক থেকে সরিয়ে নেওয়া হয়েছে তা আমি পছন্দ করি না।

if not error A
  if not error B
    if not error C
      // do something
    else handle error C
  else handle error B
else handle error A

আমি এটি পছন্দ করি:

if error A
  handle error A; return
if error B
  handle error B; return
if error C
  handle error C; return

// do something

0

উপরের শর্তগুলিকে "পূর্বশর্ত" বলা হয়। রেখে if(!precond) return;, আপনি দৃষ্টিগোচরভাবে সমস্ত পূর্বশর্ত তালিকাভুক্ত করছেন।

বৃহত "if-else" ব্লকটি ব্যবহার করে ইনডেন্ট ওভারহেড বাড়তে পারে (আমি প্রায় 3-স্তরের ইনডেন্টের উদ্ধৃতিটি ভুলে গিয়েছি)।


2
কি? আপনি জাভাতে প্রাথমিক রিটার্ন করতে পারবেন না? সি #, ভিবি (। নেট এবং)), এবং সম্ভবত জাভা (যা আমি ধরে নিয়েছিলাম, তবে সন্ধান করতে হবে যেহেতু আমি ১৫ বছরে ভাষাটি ব্যবহার করি নি) সমস্ত প্রথম দিকে রিটার্নের অনুমতি দেয়। সুতরাং 'দৃ strongly়-টাইপ করা ভাষাগুলি' বৈশিষ্ট্যটি না থাকার কারণ হিসাবে অভিযুক্ত করবেন না। stackoverflow.com/questions/884429/...
ps2goat

-1

আমি বিবৃতি যদি ছোট রাখি পছন্দ করি।

সুতরাং, এর মধ্যে চয়ন করুন:

if condition:
   line1
   line2
    ...
   line-n

এবং

if not condition: return

line1
line2
 ...
line-n

আপনি "তাড়াতাড়ি প্রত্যাবর্তন" হিসাবে বর্ণিত আমি চয়ন করব।

মনে মনে, আমি প্রারম্ভিক রিটার্ন বা যা-ই হোক না কেন, আমি ঠিক সত্যিই কোডটি সরল করতে চাইছি, বিবৃতি ইত্যাদির দেহগুলি সংক্ষিপ্ত করতে চাই etc.

যদি এর জন্য থাকে তবে তা ভয়ঙ্কর হয়ে থাকে , এগুলি যে কোনও মূল্যে এড়িয়ে চলুন।


-2

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


-2

আমি ফাংশন স্তরে ব্যর্থ-দ্রুত অনুশীলন করি। এটি কোড সামঞ্জস্যপূর্ণ এবং পরিষ্কার রাখে (আমার কাছে এবং আমি যাদের সাথে কাজ করেছি)। যে কারণে আমি সবসময় তাড়াতাড়ি ফিরে আসি।

কিছু পরীক্ষিত শর্তগুলির জন্য, আপনি যদি এওপি ব্যবহার করেন তবে আপনি সেই চেকগুলির জন্য দিকগুলি বাস্তবায়ন করতে পারেন।

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