質問
次のような通常のifステートメントに代わるものがあれば興味があります
if(x)
do a;
if(y)
do b;
if(z)
do c;
すべてのifステートメントが別個であり、else条件がないことがわかるように。 X Y Zは完全に独立した条件であるため、スイッチが合わないことに注意してください。
解決
1つの" truelyオブジェクト指向"答えは、「ルール」のインターフェースを定義することです。 (condition()およびaction()メソッドを使用)、3つの実装を作成し、それらをコレクションに詰め込んでから、次のようにそれらを一般的に繰り返します:
List<Rule> rules = .... ; // your 3 rules initialized here somehow for(Rule r : rules) { if(r.condition()) { r.action(); } }
これは、3つだけでなく300のルール/条件がある場合に非常に意味があります。
Java8では、ルールがCPUを集中的に使用する場合、代わりにこれを行うことができます。
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;
Javaの if-else
に代わるものは、switchステートメントと条件付き3項(?:)演算子。どちらも正確には求めていません( 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 / clean-code-talks-inheritance-polymorphism-testing /
これは最もシンプルで、読みやすく効果的ですソリューションです。ここで効果的な代替案を見て驚いたでしょう。
編集
抽出メソッドを数回適用しようとすることができます:
doAIfX();
doBIfY();
doCifZ();
メソッドは次によって定義されます:
void doAIfX() {
if (!X) {
return;
}
// do 'a'
}
実際には、x、y、zおよびa、b、cに依存します。ステートメントがより適している場合があります。ポリモーフィズムの方が適している場合があります。
これらのif文はどこかにある必要があります。
他のメソッドにリファクタリングして、現在のメソッドをクリーンに保つことができます。これと同じ set のifステートメントを多くの場所で再利用する必要がある場合は、デコレーターパターン。
閉鎖を使用するのに最適なケースのように聞こえます。ただし、そのためには groovy などが必要です。
どうですか... myAnimator(thing、pos、speed | computeSpeed());
speed === undefined の場合、computeSpeed ...と思います。
実際にはコンテキストに依存します...しかし、そうif-elseはJavaの制御フローステートメントの1つにすぎません: https://docs.oracle.com/javase/tutorial/java/ nutsandbolts / flow.html