سؤال

هل هذا مقبول الترميز الممارسة ؟

public class MessageFormat {
    private static final Color DEFAULT_COLOR = Color.RED;

    private Color messageColor = DEFAULT_COLOR;

    public MessageFormat(Person person) {
        Color color = person.getPreferredColor();
        messageColor = (color != null) ? color : messageColor; // this line
    }
}

أو أنا أفضل حالا الذهاب مع الكلاسيكية ...

if (color != null) {
    messageColor = color;
}
هل كانت مفيدة؟

المحلول

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

a = sprintf( "There are %i green bottle%s on the wall.", i, (i==1?"":"s") );

في هذه الحالة سوف رمز تكون أقل قابلية للقراءة إذا كنت كسره يصل الى حوالي 5 إذا خطوط / شيء آخر.

وعموما أنا وضع أقواس حول المشغل كامل بحيث عندما قراءته I عقليا تحليل بأنها قيمة واحدة.

 messageColor = (color != null ? color : messageColor); 

والبديل الآخر هو

messageColor = color || messageColor;

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

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

نصائح أخرى

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

if (colour != null) {messageColour = colour;}
   else {messageColour = messageColour;};

والذي هو غبي بعض الشيء.

وأود أن أكتب عادة الثاني في سطر واحد، ولكن هذا سؤال من التركيب نزوة فردية. الترميز المبادئ التوجيهية نمط:

if (colour != null) {messageColour = colour;};

تحرير (أنا الآن أكثر عنيد من قبل 8 سنوات)

ومنذ كنت تبحث عن أفضل الممارسات:

// Use default visibility by default, especially in examples.
// Public needs a reason.
class MessageFormat {
    static final Color DEFAULT_COLOR = Color.RED;

    // Strongly prefer final fields.
    private final Color messageColor;

    // Protect parameters and variables against abuse by other Java developers
    MessageFormat (final Person person) {
        // Use Optionals; null is a code smell
        final Optional<Color> preferredColor = person.getPreferredColor();
        // Bask in the clarity of the message
        this.messageColor = preferredColor.orElse(DEFAULT_COLOR);
    }
}

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

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

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

إذا كنت تجد نفسك تفعل هذا كثيرا، ويمكن أن تكتب defaultIfNull، firstNonNull أو وظيفة coalesce الأمر الذي قد يجعل رمز أكثر إيجازا. <وأ href = "http://commons.apache.org/lang/api/org/apache/commons/lang/ObjectUtils.html#defaultIfNull(java.lang.Object،٪20java.lang.Object)" يختلط = " نوفولو noreferrer "> أباتشي العموم لانج يتضمن وظيفة defaultIfNull.

وتشمل بعض اللغات مشغل ||=، وهو المصطلح المعتاد لتعثر القيم في تلك اللغات.

وانا افضل ثاني لأنه يعبر عن أكثر وضوحا ماذا يعني لك: تريد فقط تغيير اللون إذا لم يكن لاغيا. الطريقة الأولى لا تجعل هذا واضح جدا.

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

وأنا في بعض الأحيان استخدامها في طريقة يدعو اذا كنت ترغب في تجنب NPEs، ولكن عادة ما elimate تلك القطع القبيح من التعليمات البرمجية في واحدة من refactorings القادمة؛)

الثلاثي مشغلي غالبا ما يحصل سوء المعاملة رمز أنها تنتج يبدو ذكية وصغيرة الحجم.

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

 if ( <condition> ) {
     <action> ;
 }

بدلا من الثلاثي الجملة.

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

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