5

私のコードでは、3 つのブール値を評価しています。
これらのブール値の真理値の各組み合わせには、異なるアクションが必要です (たとえば、異なるメソッドを実行する必要があります)。
現在、私は if-else ブロックを使用しています (8 つのオプション、あまり良くありません)。このコードを「きれい」にする別のオプションがあるかどうか疑問に思っています。
もしかしてデザインパターン?
誰かがアイデアを持っていますか?

4

4 に答える 4

4

スイッチブロックを使う

switch ((A?4:0) + (B?2:0) + (C?1:0)){
case  0: //A,B,C false 
break;

case  3: //A False, B,C true
break;

case  4: //A True, B,C false 
break;
}
于 2013-03-28T09:13:49.807 に答える
3

コマンド patternを使用することをお勧めします 。

public interface Command {
     void exec();
}

public class CommandA() implements Command {

     void exec() {
          // ... 
     }
}

Map オブジェクトを構築し、それに Command インスタンスを設定します。

次に、マップを反復処理することで、このようなことを行うことができます。

commandMap.get(value).exec();
于 2013-03-28T09:21:00.593 に答える
1

3 つの要素はそれほど悪くありませんが、テーブルに 4 つ、5 つ、または 25 が含まれている場合はどうでしょうか。複雑になる可能性があります。ここにコンパクトなテクニックがありますが、他の人は失敗します。

テーブル要素の文字列を作成します。

final boolean a = false, b = false, c = false;
final String method = "state"+(a?"AT":"AF")+(b?"BT":"BF")+(c?"CT":"CF");

これにより、次のような文字列が生成されます。

// stateAFBFCF
// stateAFBTCF
// stateAFBFCT
...

状態の各組み合わせを処理するために、同じ名前でメソッドを作成します。

public void stateAFBTCF() { }
public void stateAFBTCF() { }
public void stateAFBFCT() { }
...

リフレクションを使用して正しいメソッドを呼び出します。

final Class<?> _class = handler.getClass();
final Method _method = _class.getDeclaredMethod(methodName, new Class[] {});
_method.invoke(handler, new Object[] { });
于 2013-03-28T10:23:24.097 に答える
0

できるだけ多くのメソッドの組み合わせがある場合は、さまざまなメソッドの入り口で組み合わせを確認できます。

public void a(boolean a, boolean b, boolean c) {
    if (a && !b && !c) {
    }
}

public void ab(boolean a, boolean b, boolean c) {
    if (a && b && !c) {
    }
}

public void abc(boolean a, boolean b, boolean c) {
    if (a && b && c) {
    }
}

public void ac(boolean a, boolean b, boolean c) {
    if (a && !b && c) {
    }
}

public void b(boolean a, boolean b, boolean c) {
    if (!a && b && !c) {
    }
}

public void bc(boolean a, boolean b, boolean c) {
    if (!a && b && c) {
    }
}

public void c(boolean a, boolean b, boolean c) {
    if (!a && !b && c) {
    }
}

public void none(boolean a, boolean b, boolean c) {
    if (!a && !b && !c) {
    }
}

次に、それらすべてを呼び出すだけです。

a(a, b, c);
ab(a, b, c);
abc(a, b, c);
ac(a, b, c);
b(a, b, c);
bc(a, b, c);
c(a, b, c);
none(a, b, c);
于 2013-03-28T09:39:34.487 に答える