質問

次のような通常の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. 挙動が初期値に依存する場合の多相性
  2. 可能な初期値がわかっていて、戻り値と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. 初期分岐の可能性がわかっていて、使用する関数/分岐と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 ](); `
    
  4. 直接のブール代入。

    嫌い:

    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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top