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

我建议你使用 命令模式

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

三个元素还不错,但是如果你的表包含 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 回答