وهو أسلوب الترميز يمكنك استخدام الثلاثي المشغل ؟ [مغلقة]

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

سؤال

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

$value = ( $a == $b ) 
            ? 'true value # 1'
            : ( $a == $c )
                ? 'true value # 2'
                : 'false value';

شخصيا النمط الذي تستخدمه, أو تجد معظم للقراءة ؟

تحرير: (عند استخدام الثلاثي-المشغل)

أنا عادة تجنب استخدام أكثر من 2 المستويات العميقة مشغل الثلاثي.أنا أميل يفضلون 2 مستويات عميقة مشغل الثلاثي على 2 إذا كان آخر عندما أكون مرددا المتغيرات في PHP قالب البرامج النصية.

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

المحلول

الثلاثي مشغل عموما يمكن تجنبها, ولكن هذا النموذج يمكن أن يكون تماما للقراءة:

  result = (foo == bar)  ? result1 :
           (foo == baz)  ? result2 :
           (foo == qux)  ? result3 :
           (foo == quux) ? result4 : 
                           fail_result;

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

نصائح أخرى

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

إلا إذا كان يمكن أن يصلح على خط واحد, و هو واضح وضوح الشمس ما يعني, أنا استخدامها:

$value = ($a < 0) ? 'minus' : 'plus';

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

if else if else

نمط I في بعض الأحيان استخدام الذي أنا تنشئة لأنه لم يتم ذكرها مثل هذا:

$result = ($x == y)
        ? "foo"
        : "bar";

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

PHP متداخلة الثلاثي مشغلي تتصرف بشكل مختلف.

بناء الجملة هذا يجتاز جميع الاختبارات التالية.على أساس http://deadlytechnology.com/web-development-tips/php-ternary-syntax/

$myvar = ($x == $y)
?(($x == $z)?'both':'foo')
:(($x == $z)?'bar':'none');

.

انظر: http://au.php.net/ternary

على سبيل المثال رقم 3 "غير واضحة الثلاثي السلوك" يفسر لماذا التالية لا تعمل في PHP.

$x = 1;
$y = 2;
$z = 3;   
$myvar = ($x == $y) 
       ? "foo" 
       : ($x == $z) 
         ? "bar" 
         : "none";  
$myvar == 'none'; // Good

$x = 1;
$y = 2;
$z = 1;   
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";  
$myvar == 'bar'; // Good

$x = 1;
$y = 1;
$z = 3;   
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";  
$myvar == 'bar'; // Bad!

$x = 1;
$y = 1;
$z = 1;   
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";  
$myvar == 'bar'; // Bad!

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

أنا أميل إلى أن أرفق الشرط بين قوسين :(a == b) ?1 :0

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

أيضا, لا عش المشروط المشغلين.عند هذه النقطة, أجد أنه من الصعب جدا قراءة و حان الوقت للذهاب إلى أكثر مطول if-else نمط.

إن "مفتعلة سبيل المثال" كيف أن المسافة البادئة ، باستثناء أنه لا يمكن أن مسافة بادئة من اليسار الهامش ، لا تستند إلى حيث ( أو ما هو في السطر أعلاه.

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

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

'before refactoring 
If x = 0 Then                    ' If-Then-Else puts emphasis on flow control
    label = "None"
Else
    label = Foo.getLabel(x)      '  If-Then-Else forces repeat of assignment line
End If

'after refactoring    
label = If(x = 0, "None", Foo.getLabel(x)) ' ternary If puts emphasis on assignment

علما أن "أقل للقراءة" ليست نفس الشيء مثل "أنا لست معتادا على رؤية ذلك".

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

لا تجد للقراءة في كل شيء ، لكن الكثير من هذا لأنني فقط لم تستخدم.

أنا لا تميل إلى استخدام مشغل الثلاثي على الإطلاق كما أجد أنا ..آخر أكثر قابلية للقراءة.

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

$foo = (isset($bar)) ? $bar : 'default';

أنا شخصيا فقط مهمة متغير (java) على سبيل المثال :

String var = (obj == null) ? "not set" : obj.toString();

و (على) عند استخدام وظيفة لا تسمح المعلمة فارغة مثل :

String val; [...]
int var = (val == null) ? 0 : Integer.parseInt(val);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top