والتي بناء الجملة هو أفضل من أجل العودة القيمة ؟

StackOverflow https://stackoverflow.com/questions/139739

  •  02-07-2019
  •  | 
  •  

سؤال

لقد تم القيام ضخمة رمز استعراض نمط واحد أنا لاحظت في كل مكان هو هذا:

public bool MethodName()
{
    bool returnValue = false;
    if (expression)
    {
        // do something
        returnValue = MethodCall();
    }
    else
    {
        // do something else
        returnValue = Expression;
    }

    return returnValue;
}

هذا ليس كيف كنت قد فعلت هذا لكنت قد عاد لتوه قيمة عندما كنت أعرف ما كان عليه.أي من هذين أنماط أكثر صحيح ؟

وأشدد على أن المنطق يبدو دائما أن يكون منظم مثل أن قيمة الإرجاع يتم تعيين في واحدة plave فقط و لا يتم تنفيذ التعليمات البرمجية بعد تعيينه.

هل كانت مفيدة؟

المحلول

هناك مناقشة مطولة حول هذا الموضوع هنا.

نصائح أخرى

الكثير من الناس بعدم وجود مخرج واحد فقط نقطة من الأساليب.النمط الذي وصف أعلاه يلي تلك التوصية.

جوهر الرئيسي من هذه التوصية هو أنه إذا ou إلى تنظيف بعض الذاكرة أو الدولة قبل عودته من طريقة, فمن الأفضل أن يكون هذا الرمز في مكان واحد فقط.وجود العديد من نقاط الخروج يؤدي إلى إما ازدواجية رمز تنظيف أو المشاكل المحتملة بسبب فقدان رمز تنظيف في واحدة أو أكثر من نقاط الخروج.

بالطبع, إذا كان الأسلوب هو بضعة أسطر طويلة أو لا تحتاج إلى أي تنظيف, هل يمكن أن يكون العديد من العوائد.

كنت قد استخدمت الثلاثي ، للحد من هياكل المراقبة...


return expression ? MethodCall() : Expression;

وأظن أنني سوف أكون في الأقلية ولكن أنا أحب أسلوب عرض في المثال.فمن السهل لإضافة سجل بيان تعيين نقطة توقف المنظمة البحرية الدولية.بالإضافة, عندما تستخدم بطريقة متسقة ، يبدو من الأسهل على "تطابق" من وجود العديد من العوائد.

أنا لست متأكدا من أن هناك "الصحيح" الجواب على ذلك.

بعض معاهد التعليم والكتب الدعوة عودة واحد الممارسة.

سواء كان أفضل أو ليس هو ذاتي.

الذي يبدو وكأنه جزء من سيئة OOP التصميم.ربما ينبغي أن يكون ريفاكتوريد على أعلى مستوى من داخل من طريقة واحدة.

وإلا أنا أفضل استخدام مشغل الثلاثي, مثل هذا:

return expression ? MethodCall() : Expression;

هو أقصر و أكثر قابلية للقراءة.

العودة من طريقة على الفور في أي من هذه الحالات:

  1. لقد وجدت حالة الحدود وتحتاج إلى إعادة فريدة من نوعها أو الحارس القيمة: if (node.next = null) return NO_VALUE_FOUND;
  2. قيمة مطلوبة/الدولة غير صحيح ، لذلك تبقى الطريقة لا تنطبق (ويعرف أيضا باسم حارس شرط).E. g.: if (listeners == null) return null;
  3. طريقة الغرض هو إيجاد والعودة قيمة محددة ، على سبيل المثال: if (nodes[i].value == searchValue) return i;
  4. كنت في شرط إرجاع قيمة فريدة من طريقة لا تستخدم في أي مكان آخر في الأسلوب: if (userNameFromDb.equals(SUPER_USER)) return getSuperUserAccount();

وإلا فمن المفيد أن يكون لديك واحد فقط العودة بيان ذلك أنه من الأسهل لإضافة تسجيل التصحيح الموارد تنظيف و اتباع المنطق.محاولة التعامل مع كل ما سبق 4 حالات الأول, إذا كانت تنطبق ، ثم بتعريف متغير اسمه result(s) في وقت متأخر ممكن و تعيين قيم على ذلك حسب الحاجة.

كلاهما إنجاز نفس المهمة.البعض يقول أن الأسلوب يجب أن يكون فقط إدخال واحد واحد نقطة الخروج.

يمكنني استخدام هذا أيضا.الفكرة هي أن الموارد التي يمكن تحريرها في التدفق الطبيعي من البرنامج.إذا كنت القفز من طريقة في 20 أماكن مختلفة تحتاج إلى استدعاء تنظيف() من قبل سيكون لديك لإضافة بعد آخر طريقة تنظيف 20 مرة (أو ريفاكتور كل شيء)

أعتقد أن المبرمج قد اتخذت تصميم تحديد كائن toReturn في الجزء العلوي من طريقة (مثل قائمة<Foo> toReturn = new ArrayList<Foo>();) ثم ملء ذلك خلال استدعاء الأسلوب ، على نحو ما قرر تطبيقه على منطقية نوع الإرجاع, وهو أمر غريب.

يمكن أيضا أن تكون الآثار الجانبية الترميز القياسية أن الدول التي لا تستطيع العودة في منتصف الجسم طريقة, فقط في نهاية المطاف.

حتى إذا لم يتم تنفيذ التعليمات البرمجية بعد إعادة تعيين قيمة الآن وهذا لا يعني أن بعض رمز لا يجب أن تضاف في وقت لاحق.

ليس أصغر قطعة من التعليمات البرمجية التي يمكن استخدامها ولكن هو إعادة بيع ديون الصديقة.

دلفي قوات هذا النمط تلقائيا إنشاء متغير يسمى "النتيجة" التي سيتم من وظيفة نوع الإرجاع.أيا كان "نتيجة" عندما وظيفة مخارج هو قيمة الإرجاع.لذلك ليس هناك "عودة" الكلمة في كل شيء.

function MethodName : boolean;
begin
  Result := False;
  if Expression then begin
    //do something
    Result := MethodCall;
  end
  else begin
    //do something else
    Result := Expression;
  end;

  //possibly more code
end;

نمط المستخدمة مطول - لكنه أيضا أسهل التصحيح إذا كنت تريد أن تعرف قيمة الإرجاع دون فتح سجلات نافذة التحقق من EAX.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top