2013-03-28 28 views
5

在我的代碼中,我正在評估3個布爾值。
這些布爾值真值的每種組合都需要不同的操作(例如,應執行不同的方法)。
目前我正在使用if-else塊(8個選項,不是很好)。 我想知道是否有另外的選擇來編寫這個代碼,使它更漂亮。
也許設計模式?
有人有想法嗎?帶動作的真值表

+3

您可以將三個布爾值組合成0-7範圍內的整數並使用switch語句。 – Moshe 2013-03-28 09:11:27

+5

你可以分享代碼..你到目前爲止嘗試過什麼? – 2013-03-28 09:11:32

+1

在任何可能的情況下,你都應該優先考慮條件,所以你應該給代碼一個檢查的順序。 ü應該寫,如果的或開關/箱或類似的東西的邏輯 – Neron 2013-03-28 09:44:18

回答

3

我建議你使用command pattern

public interface Command { 
    void exec(); 
} 

public class CommandA() implements Command { 

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

建立一個Map對象,並用命令實例來填充它:

然後,你可以做這樣的事情在你通過迭代在地圖上。

commandMap.get(value).exec(); 
3

使用一個開關塊

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; 
} 
+2

也可以在掩碼保存Bolean值是這樣的: 100, 010, 011, ... ,然後在這個變量簡單的使用開關。 – gkiko 2013-03-28 09:15:56

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); 
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[] { }); 
+0

好主意,唯一的缺點是方法存在檢查是在運行時完成的。 – 2013-03-28 11:10:37

+0

@LefterisE - 同意,儘管有些人可能更喜歡運行時異常,而不是編碼所有的條件檢查程序。 getDeclaredMethod()中的try/catch可以減少臉上的一巴掌。 – Java42 2013-03-28 11:48:32