Вопрос

Мне любопытно увидеть какие-либо альтернативы обычным операторам if, таким как

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

итак, как вы видите, все операторы if являются отдельными и никаких других условий нет.Пожалуйста, обратите внимание, что X Y Z - это полностью отдельные условия, поэтому switch не подойдет.

Это было полезно?

Решение

Один «действительно объектно-ориентированный» Ответ будет заключаться в определении интерфейса для «Правило» (с помощью методов condition () и action ()) создайте 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);

Другие советы

Короткий ответ - да.

Есть несколько раз, когда вы можете избежать использования if для условного выделения и ветвления всего вместе. И у них есть моменты уместности. <Ол>

  • Полиморфизм, когда поведение зависит от начальных значений
  • Ссылочное присвоение, когда вы знаете возможные начальные значения, и они имеют соотношение 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 ];
    
  • Ссылочное ветвление, когда вы знаете возможные начальные значения, и они имеют соотношение 1: 1 к используемой функции / ветви. (пример не Java)

    // 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 ](); `
    
  • Прямое логическое назначение.

    Мы ненавидим:

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

    Должно быть:

      

    b = thisCondition;

  • Альтернативами if-else в Java являются оператор switch и условный троичный оператор (?: ), ни один из которых не выполняет в точности то, что вы спрашиваете (обрабатывает только 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();
         }
    }
    

    If не полностью исключено, но оно перемещено в SomethingDoerFactory. Это решение применимо не во всех случаях, но в некоторых из них это очень хорошая альтернатива множественным if.

    Вот хороший разговор об этом:
    http://misko.hevery.com / 2008/12 / 08 / чистое-код Общение наследование-полиморфизм тестирование /

    это самое простое, читабельный, но эффективный решение.Я был бы удивлен, увидев здесь эффективные альтернативы.

    Редактировать

    вы можете попробовать применить способ извлечения несколько раз:

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

    где методы определяются с помощью:

    void doAIfX() {
        if (!X) {
            return;
        }
    
        // do 'a'
    }
    

    это действительно зависит от того, что x, y, z и a, b, c. Иногда, если заявления более подходят. Иногда полиморфизм более подходит.

    Вам понадобятся эти операторы if где-нибудь.

    Они могут быть преобразованы в другие методы, чтобы сохранить настоящий метод в чистоте, как предлагали другие. Если вам необходимо повторно использовать тот же набор операторов if в нескольких местах, возможно, можно использовать Шаблон декоратора .

    Звучит как идеальный случай для использования закрытия . Но для этого вам нужно groovy или что-то подобное.

    Как насчет...myAnimator(вещь, pos, скорость | computeSpeed());

    если скорость === неопределенный затем он увеличит скорость вычислений...Я думаю.

    Это действительно зависит от контекста ... но да, если-еще только один из потока управления оператора в Java: https://docs.oracle.com/javase/tutorial/java/ nutsandbolts / flow.html

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top