سؤال

أنا الغريب أن نرى أي بديل(s) العادية إذا عبارات مثل

if(x)
     do a;
if(y)
     do b;
if(z)
    do c;

حتى ترى كل شيء إذا البيانات منفصلة و أي شرط آخر.من فضلك لاحظ أن X Y Z تماما منفصلة الشروط حتى التبديل لا يصلح.

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

المحلول

واحد من شأنه أن "حقا وجوه المنحى" الجواب هو تحديد واجهة ل "القاعدة" (مع حالة () والعمل () طرق)، إنشاء 3 تطبيقات، الاشياء لهم إلى مجموعة، ثم أعاد فقط من خلالهم كما بشكل عام في:

List<Rule> rules = .... ; // your 3 rules initialized here somehow
for(Rule r : rules) {
  if(r.condition()) {
    r.action();
  }
}

وهذا يجعل الكثير من المعنى إذا كان لديك 300 قواعد / الشروط بدلا من مجرد 3.

في Java8، قد ترغب في القيام بذلك بدلا من ذلك، إذا كانت القواعد هي وحدة المعالجة المركزية مكثفة:

rules.parallelStream().filter(Rule::condition).forEach(Rule::action);

نصائح أخرى

الجواب القصير هو نعم.

هناك عدد قليل من الوقت يمكنك تجنب استخدام إذا كان المشروط evluation و المتفرعة كل ذلك معا.وأنها لحظات من ملاءمة.

  1. تعدد الأشكال, عندما السلوك تعتمد على القيم الأولية
  2. Referrenced المهمة عندما كنت تعرف الأولية الممكنة القيم لديهم من 1 إلى 1 العلاقة مع عودة القيم.قوائم أفضل من المصفوفات على هذا لكن...

    // Example:  
    if (a==1) { b=2;  }  
    if (a==2) { b=17; }  
    
    // Becomes  
    int fx(2);  // our array of answers  
    fx[0] = 2;   
    fx[1] = 17;  
    b = fx[ a - 1 ];
    
  3. Referrenced المتفرعة ، عندما كنت تعرف الأولية الممكنة القيم لديهم من 1 إلى 1 العلاقة مع وظيفة/فرع للاستخدام.(على سبيل المثال لا جافا)

    // Example:
    if (a==1) { doSomething1();  }  
    if (a==2) { doSomething2(); }  
    
    // Becomes
    function * fx(2);  // our array or better still, list of functions  
    fx[0] = &doSomething1;   
    fx[1] = &doSomething2;  
    `fx[ a - 1 ](); `
    
  4. مباشرة منطقية المهمة.

    نحن نكره:

    if (thisCondition == true) {  
      b = true;  
    } else {  
      b = false;  
    }
    

    يجب أن تكون:

    ب = thisCondition;

البدائل if-else في جافا هي بيان التبديل ، الشرطي الثلاثي (?:) المشغل ولا تفعل بالضبط ما تطلبه (مقبض فقط if لا else).الكود الذي نشر هو أفضل طريقة للقيام بذلك, في رأيي.

استخدم تعدد الأشكال.

interface SomethingDoer {
    public void doSomething();
}

class ADoer implements SomethingDoer { ... }
class BDoer implements SomethingDoer { ... }
class CDoer implements SomethingDoer { ... }

public class Main {
     public static void main (String[] args) {
          SomethingDoer doer = new SomethingDoerFactory(args).getDoer();
          doer.doSomething();
     }
}

وإذا لم يتم القضاء عليها تماما، ولكن يتم نقله إلى SomethingDoerFactory. هذا الحل لا ينطبق في جميع الحالات، ولكن في بعض منها هو بديل جيد جدا لاستثناءات متعددة.

وهنا هو الحديث لطيفة حول هذا الموضوع:
http://misko.hevery.com / 2008/12/08 / نظيفة رمز محادثات الميراث، تعدد الأشكال اختبار /

هذا هو أبسط ، للقراءة لكنها فعالة الحل.سوف يفاجأ أن نرى بدائل فعالة هنا.

تحرير

يمكنك محاولة تطبيق طريقة استخراج عدة مرات:

doAIfX();
doBIfY();
doCifZ();

حيث طرق محددة:

void doAIfX() {
    if (!X) {
        return;
    }

    // do 'a'
}

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

سوف تحتاج إلى هذه البيانات إذا في مكان ما.

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

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

ماذا عن...myAnimator(الشيء, نقاط البيع, سرعة | computeSpeed());

إذا كانت السرعة === غير معرف فإنه سيتم ثم computeSpeed...أعتقد.

وانها حقا يتوقف على السياق ... ولكن نعم هو إلا إذا بين آخر واحد من التحكم في التدفق بيان في جافا: https://docs.oracle.com/javase/tutorial/java/ nutsandbolts / flow.html

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