9

開關我使用switch語句13例,分別僅具有一行返回值。麥凱布圈複雜度在Java

麥凱布繪製這個紅色。有沒有更簡單的方法來編寫一個大開關語句?閱讀起來並不複雜,但我不喜歡默認設置變成紅色。如果其他人在我的代碼中使用相同的工具,並看到紅色的東西,他們可能會認爲我很愚蠢:-)

編輯:我將不同的SQL類型映射到我自己的更抽象的類型,因此減少總量類型。

case Types.TIME: 
    return AbstractDataType.TIME; 
case Types.TIMESTAMP: 
    return AbstractDataType.TIME; 
case Types.DATE: 
    return AbstractDataType.TIME; 
case Types.BIGINT: 
    return AbstractDataType.NUMERIC; 
case Types.DECIMAL: 
    return AbstractDataType.NUMERIC; 

等等...

+4

這是更容易,如果你解釋爲什麼在交換機中有13個案例,以及爲什麼你無法使用多態性或Map來做同樣的事情。 –

+0

同意。你能告訴我們代碼嗎? – Kane

+0

謝謝,請參閱編輯。 –

回答

6

我不知道很多關於麥凱布工具。 Cyclomatic複雜性考慮之一是多個退出點。

我喜歡這個想法EnumMap的。

如果一個開關將被使用,你可以有一個結果變量,並與所有return語句做了。您還可以摺疊具有相同的結果類型的所有源值:

result = null; 

case Types.TIME: 
case Types.DATE: 
case Types.TIMESTAMP: result = AbstractDataType.TIME 

// etc. 

return result; 

我認爲這降低了圈複雜度,不管別人怎麼想它的風格。這是寫出這個陳述的另一種方式,儘管你是否應該更容易判斷。

7

您正在使用的代碼來表達的東西真的是數據。只需使用枚舉映射或爲所有常量字典定義一次。這樣,你只是參數化一個簡單而通用的通信算法,而不是寫一個長開關的情況。

3

+1的地圖的想法...

事情是這樣的:

初始化地圖

Map<Types, AbstractDataType> map = new HashMap<Types, AbstractDataType>(); 
map.put(Types.TIME, AbstractDataTypes.TIME); 
// and so on 

然後在你的代碼簡單做

return map.get(sqlTimeType); 

一個更更好的解決辦法是將這個映射包含在枚舉本身中,這樣你就可以做一個ssuming你沒有過的Sql enum類型控制...

AbstractDataTypes.fromSqlType(timeType); 

,如果你這樣做:

sqlTimeType.getAbstractType(); 

封裝和可重複使用的:-)