هل العودة مبكرًا من دالة أكثر أناقة من عبارة if؟

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

  •  21-08-2019
  •  | 
  •  

سؤال

أنا وزميلي نختلف حول أي مما يلي هو الأكثر أناقة.لن أقول من هو، لذلك فهو محايد.أيهما أكثر أناقة؟

public function set hitZone(target:DisplayObject):void
        {
            if(_hitZone != target)
            {
                _hitZone.removeEventListener(MouseEvent.ROLL_OVER, onBtOver);
                _hitZone.removeEventListener(MouseEvent.ROLL_OUT, onBtOut);
                _hitZone.removeEventListener(MouseEvent.MOUSE_DOWN, onBtDown);

                _hitZone = target;

                _hitZone.addEventListener(MouseEvent.ROLL_OVER, onBtOver, false, 0, true);
                _hitZone.addEventListener(MouseEvent.ROLL_OUT, onBtOut, false, 0, true);
                _hitZone.addEventListener(MouseEvent.MOUSE_DOWN, onBtDown, false, 0, true);
            }
        }

...أو...

public function set hitZone(target:DisplayObject):void
        {
            if(_hitZone == target)return;

            _hitZone.removeEventListener(MouseEvent.ROLL_OVER, onBtOver);
            _hitZone.removeEventListener(MouseEvent.ROLL_OUT, onBtOut);
            _hitZone.removeEventListener(MouseEvent.MOUSE_DOWN, onBtDown);

            _hitZone = target;

            _hitZone.addEventListener(MouseEvent.ROLL_OVER, onBtOver, false, 0, true);
            _hitZone.addEventListener(MouseEvent.ROLL_OUT, onBtOut, false, 0, true);
            _hitZone.addEventListener(MouseEvent.MOUSE_DOWN, onBtDown, false, 0, true);

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

المحلول

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

وحتى ذلك الحين لماذا في هذه الحالة ماذا الجميع يفضل الخيار 2؟ انها لأنك تقوم بإعداد العقد الذي يفرض وظيفة من خلال التحقق من صحة البيانات الواردة، أو الثوابت الأخرى التي قد تحتاج إلى أن يتم التحقق. أجمل بناء الجملة من أجل بناء المصادقة هو الاختيار لكل شرط، والعودة فورا إذا فشلت شرط صحة. وبهذه الطريقة لم يكن لديك للحفاظ على نوع من isValid منطقية من خلال كل من الشيكات الخاصة بك.

لتلخيص الامور: نحن نبحث حقا في كيفية كتابة رمز التحقق من الصحة وليس المنطق العام؛ الخيار 2 هو أفضل لرمز التحقق من الصحة.

نصائح أخرى

في معظم الحالات، يؤدي الرجوع مبكرًا إلى تقليل التعقيد وجعل التعليمات البرمجية أكثر قابلية للقراءة.

إنها أيضًا إحدى التقنيات المطبقة فيها البرمجة المتقشف:

الحد الأدنى من استخدام التحكم

  1. تقليل استخدام الشرطية عن طريق استخدام بنيات متخصصة مثل هذا التصنيف والميراث والفئات مثل الافتراضات الفئة والفئة مرة واحدة وفاصل الفصل الدراسي
  2. تبسيط الشروط الشرطية مع المبكر return.
  3. تقليل استخدام بنيات الحلقات ، باستخدام فئات Action Appludator مثل فئة منفصلة وملفات الفصل.
  4. تبسيط منطق التكرار مع المخارج المبكرة (عبر return, continue و break صياغات).

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

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

وأنا في محاولة لتجنب عودة مبكرة في منتصف الجسم. أحيانا أنهم أفضل وسيلة، ولكن في معظم الوقت أعتقد أنهم تعقيد.

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

في تجربتي، وهذه المسألة مع استخدام عوائد الأولى في المشروع هي أنه إذا لم يتم استخدام الآخرين في المشروع لهم، فإنها لا تبدو بالنسبة لهم. ذلك يعود في وقت مبكر أو لا - إذا كانت هناك المبرمجين متعددة المعنية، تأكد الجميع يدرك ما لا يقل عن وجودهم

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

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

وآه الوصي.

وIMHO، نعم - منطق من هو أكثر وضوحا لعودة صريحة ومباشرة بجانب حالة، وأنه يمكن أن تجمع بشكل جيد مع هياكل مماثلة. هذا لعله أكثر قابلية للتطبيق حيث يتم استبدال "العودة" مع "رمي استثناء جديد".

وكما ذكرت من قبل، العودة المبكرة هي أكثر قابلية للقراءة، وخاصة إذا كان الجسم وظيفة طويل، قد تجد أن حذف} عن طريق الخطأ في وظيفة 3 صفحة (اللي تبونه في حد ذاتها ليست أنيقة جدا) ومحاولة تجميع يمكن أن يستغرق عدة دقائق من التصحيح غير automatable.

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

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

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

ولكن، وهذا هو تقسيم أرقى من الشعر. أنا متأكد من يجب أن يكون لديك قضايا أكبر ما يدعو للقلق:)

والخيار 2 هو أكثر قابلية للقراءة، ولكن فشل الإدارة من قانون عندما آخر قد تكون هناك حاجة لإضافتها.

وحتى إذا كنت متأكدا، لا يوجد إلا الذهاب للخيار 2، ولكن إذا يمكن أن يكون هناك مجال لشرط آخر ثم أود أن تفضل الخيار 1

والخيار 1 هو أفضل، لأنه يجب أن يكون أقل عدد ممكن من النقاط العودة في الإجراء. هناك استثناءات مثل

  if (a) {
    return x;
  }
  return y;

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

وانا افضل لتجنب عودة في بداية وظيفة مباشرة، وكلما كان ذلك ممكنا وضع منطق المؤهلة لمنع دخول لطريقة قبل أن يتم استدعاؤها. وبطبيعة الحال، وهذا يختلف تبعا للغرض من هذه الطريقة.

ولكن، أنا لا أمانع العودة في منتصف طريقة، وفرت طريقة قصيرة وقابلة للقراءة. في حالة ما إذا كان الأسلوب هو كبير، في رأيي، هو بالفعل غير قابل للقراءة جدا، لذلك إما أن ريفاكتوريد ذلك في وظائف متعددة مع عوائد مضمنة، أو أكسر صراحة من هيكل الرقابة مع عودة واحدة في نهاية المطاف.

ويغريني لإغلاقه كما تكرار دقيق، كما رأيت بعض المواضيع المشابهة بالفعل، بما في ذلك <وأ href = "https://stackoverflow.com/questions/268132/invert-if-statement-to-reduce-nesting "عنوان =" المقلوب "لو" بيان للحد من تداخل "> عكس" لو "بيان للحد من تداخل التي لديها إجابات جيدة.

وسوف ندعه يعيش الآن ... ^ _ ^

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

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

وهناك واحد على الأقل بديل آخر. فصل تفاصيل العمل الفعلي من قرار حول ما إذا كان لأداء العمل. شيء كما يلي:

public function setHitZone(target:DisplayObject):void
    {
        if(_hitZone != target)
            setHitZoneUnconditionally(target);

    }

public function setHitZoneUnconditionally(target:DisplayObject):void
    {
        _hitZone.removeEventListener(MouseEvent.ROLL_OVER, onBtOver);
        _hitZone.removeEventListener(MouseEvent.ROLL_OUT, onBtOut);
        _hitZone.removeEventListener(MouseEvent.MOUSE_DOWN, onBtDown);

        _hitZone = target;

        _hitZone.addEventListener(MouseEvent.ROLL_OVER, onBtOver, false, 0, true);
        _hitZone.addEventListener(MouseEvent.ROLL_OUT, onBtOut, false, 0, true);
        _hitZone.addEventListener(MouseEvent.MOUSE_DOWN, onBtDown, false, 0, true);

    }

وأي من هؤلاء الثلاثة (الخاص بك اثنين زائد الثالث أعلاه) هي معقولة للحالات صغيرة مثل هذه. ومع ذلك، فإنه سيكون أمرا سيئا أن يكون لها وظيفة مئات من خطوط طويلة مع عدة "نقاط الإنقاذ" متناثر في جميع أنحاء.

ولقد كان هذا النقاش مع رمز بلدي على مر السنين. بدأت الحياة التي تفضل عودة احدة وببطء قد انقضى.

في هذه الحالة، أنا أفضل الخيار 2 (العودة احدة) ببساطة لأننا نتحدث عن 7 أسطر من التعليمات البرمجية ملفوفة من قبل إذا () مع عدم وجود تعقيدات أخرى فقط. انها أبعد ما تكون أكثر قابلية للقراءة وظيفة مثل. يتدفق من أعلى إلى أسفل. كنت أعلم أنك تبدأ من أعلى وتنتهي في القاع.

وأن يقال، كما قال آخرون، إذا كان هناك المزيد من الحراس في بداية أو أكثر تعقيد أو إذا كبرت وظيفة، ثم أود أن تفضل الخيار 1: العودة فورا في بداية لالمصادقة بسيط

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