سؤال

لقد حان المناقشة حتى في مكتبي حول استخدام مشغلي الثلاثي. هناك وجهان لهذه المناقشة.

والجانبية 1) أن مشغلي ثلاثية من السهل الكتابة والقراءة، وبالتالي الراحة هي صافي وفورات في التكاليف.

والجانب 2) أن مشغلي ثلاثية صعبة للحفاظ على لأنها تتطلب الزائد رمز زبد ينبغي لها أي وقت مضى الحاجة إلى تعديل ليكون حتى ادنى قليلا أكثر تعقيدا.

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


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

$id = $user->isRegistered() ? $user->id : null;

وطيب، لذلك هذا صحيح تماما، ولكن ماذا يحدث عندما يحتاج رمز لتغيير لتصبح شيئا قليلا أكثر تعقيدا؟

$id = null;
if ($user->isRegistered() || $user->hasEmail()) {
    $id = $user->id;
}

وأي مبرمج عاقل أن ننظر إلى الثلاثي وتحويل لمعيار إذا / آخر. ومع ذلك، وهذا يتطلب تغييرا 4-خط مقابل بدءا من:

if ($user->isRegistered()) {
    $id = $user->id;
}

والتي لا تتطلب سوى تغيير خط 1.

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

المحلول

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

وأما بالنسبة والتي هي أكثر كفاءة، وقتا طويلا، وأنا ذاهب للرد بسؤال البغيض - لماذا نهتم؟ يأخذ إما خيار أقل من 20 ثانية لتحويله إلى ما يعادل إذا البيان.

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

نصائح أخرى

وكنت العصا مع المشغل ternery في المثال الخاص بك.

   $id = ($user->isRegistered() ||  $user->hasEmail())? $user->id : null;

وطالما أن "فرع" الوحيد هو أن تقرر ما هي القيمة هو أن تسند إلى متغير، المشغل ternery هو أكثر قابلية للقراءة مما لو-شيء آخر بنود، لأنه لا يحتمل تكرار وظيفة الفعلية التي يتم تنفيذها، (في هذه الحالة - وهذا هو رمز "$ معرف =")      إذا كانت الشروط المنطقية تصبح معقدة، تبسيطها.

   bool $isReg    = $user->isRegistered(),
        $hasEmail = $user->hasEmail();
   $id = ($isReg || $hasEmail)?  $user->id : null;

وأود أن استخدام عامل التشغيل الثلاثي كلما لدي التعبير عن سطر واحد حيث تعتمد القيمة على شرط منطقي المناسبة. في الواقع، إذا كنت بحاجة إلى الاختيار بين تعيين إلى متغير، ويمكنني أن تختار بين التعبير 1 والتعبير 2، ثم أنا غالبا ما تستخدم الثلاثي.

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

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

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

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