альтернатива инструкции if в java
Мне любопытно увидеть любую альтернативу(ы) регулярным операторам if, таким как
if(x)
do a;
if(y)
do b;
if(z)
do c;
так как вы видите, что все операторы if являются отдельными и не имеют других условий. Обратите внимание, что X Y Z полностью разделены, поэтому переключатель не подходит.
10 ответов
один" истинно объектно-ориентированный " ответ состоял бы в том, чтобы определить интерфейс для "правила" (с методами 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);
короткий ответ-да.
есть несколько раз вы можете не использовать, если для условного оценивания и ветвления все вместе. И у них бывают моменты уместности.
- полиморфизм, когда поведение зависит от начальных значений
-
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 ];
-
ссылочное ветвление, когда вы знаете возможные начальные значения и у них есть корреляция 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 = это условие;
альтернативы if-else
в Java есть оператор switch и условного тернарного (?:) оператор, ни один из которых не делает именно то, что вы просите (обрабатывать только if
С else
). Код, который вы выложили-это лучший способ сделать это, на мой взгляд.
Это самый простой, читаемый, но эффективный решение. Я был бы удивлен, увидев здесь эффективные альтернативы.
редактировать
вы можете попробовать применить извлечение метода несколько раз:
doAIfX();
doBIfY();
doCifZ();
где методы определяются:
void doAIfX() {
if (!X) {
return;
}
// do 'a'
}
использовать полиморфизм.
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. Это решение применимо не во всех случаях, но в некоторых из них это очень хорошая альтернатива нескольким ifs.
вот хороший разговор о it:
http://misko.hevery.com/2008/12/08/clean-code-talks-inheritance-polymorphism-testing/
Это действительно зависит от того, что x, y, z и a, b, c. Иногда, если утверждения более подходят. Иногда полиморфизм более подходит.
вам нужно будет иметь эти операторы if где-то.
Они могут быть переработаны в другие методы, чтобы сохранить настоящий метод чистым, как предлагали другие. Если вам нужно повторно использовать это же set из if заявления в ряде мест, это может можно использовать Шаблон "Декоратор".
Это звучит как идеальный случай для использования закрытие. Но для этого вам нужно в Groovy или что-то подобное.
Как насчет... myAnimator (thing, pos, speed / computeSpeed ());
Если скорость === неопределено затем он будет computeSpeed... Я думаю.
Это действительно зависит от контекста... Но да, если-еще только один из поток управления оператор в java: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/flow.html