2012-05-03 69 views
3

我有一個方法要重構,以及一些假的碼如下:如何重構下列代碼

if(deletedInfo.isEmpty() && addedInfo.isEmpty()) { 
    // some logic codes 
} else if (!deletedInfo.isEmpty() && addedInfo.isEmpty()) { 
    // some logic codes 
} else if (deletedInfo.isEmpty() && !addedInfo.isEmpty()) { 
    // some logic codes 
} else if(!deletedInfo.isEmpty() && !addedInfo.isEmpty()) { 
    // some logic codes 
} 

是有一個合適的圖案或某種算法來重構這個代碼?

謝謝。

+1

是'//一些邏輯code'每種條件下的完全不同? – assylias

+0

我不喜歡任何提議的解決方案。可能是因爲需要更多的上下文信息。 也許重構數據的結構...根本沒有意義deletedInfo和addedInfo,是嗎?如果沒有刪除應該添加。如果你想檢查是否沒有任何事情發生(不添加,不刪除),那麼可能你的對象結構將是空的。 –

回答

4
if (deletedInfo.isEmpty()) { 

    if (addedInfo.isEmpty()) { 
     // some logic codes 
    } else { 
     // some logic codes 
    } 

} else { 

    if (addedInfo.isEmpty()) { 
     // some logic codes 
    } else { 
     // some logic codes 
    } 

} 
+0

您也可以將外部'if'和'else'中的行放入私有方法中,然後調用它。如果邏輯長度很長,將會非常寶貴。 – adarshr

0

有幾種方法可以做到這一點。這裏有一個:

if (a) { 
    if (b) { 
    // do J 
    } else { 
    // do K 
    } 
} else { 
    if (b) { 
    // do L 
    } else { 
    // do M 
    } 
} 

你可能會喜歡的東西更像是一個真值表,特別是如果你有兩個以上的測試結合:

int switcher = 0; 
if (a) switcher|=1; 
if (b) switcher|=2; 
switch(switcher) { 
    case 0: 
    // do J 
    break; 
    case 1: 
    // do K 
    break; 
    case 2: 
    // do L 
    break; 
    case 3: 
    // do M 
    break; 
} 

我不認爲這是一個自動「權「方式 - 你必須選擇最適合你的情況。

+0

我不會採用切換方法。看起來像對我來說是一個黑客。 – aioobe

+0

我同意乍一看並不那麼直截了當 - 但我不會自動排除它,可能會出現這種情況。 – crazyscot

+1

開關((a?0:2)+(b?0:1)){... –

2

您可以使用此代碼重構:

int val = 0; 
if (deletedInfo.isEmpty()) val |= 0x1; 
if (addedInfo.isEmpty()) val |= 0x2; 

switch (val) { 
    case 0: // some logic codes 
    case 1: // some logic codes 
    case 2: // some logic codes 
    case 3: // some logic codes 
}