2016-08-03 31 views
2

給出下一個代碼示例,您認爲哪種方法更好,或者您能否想出另一種方式以更優雅的方式對其進行編碼?如果使用重複代碼或者使用重複條件

中如果

if(a || b) { 
    doAB(); 
} 
if(b) { 
    doB(); 
} 

重複的代碼(兩次doAB())(兩次爲 'B' 檢查)重複的條件:

if(a) { 
    doAB(); 
} 
if(b) { 
    doAB(); 
    doB(); 
} 

或混合...

if(a || b) { 
    doAB(); 
    if(b) { 
    doB(); 
    } 
} 

編輯:

一個同事提出這樣的:

int mask = a?1:b?2:0; 
switch(mask) { 
    case 2: 
    doB(); 
    case 1: 
    doAB(); 
} 
+0

你想做什麼? –

+2

第二個片段可能在功能上是錯誤的,因爲如果'a'和'b'都爲真,它會調用'doAB()'兩次。 – Eran

+0

我想避免重複的代碼 –

回答

2

一個完全不同的觀點:避免使用if/else的東西。

在OO語言中,可以使用多態而不是if/else。而不是要求某種狀態;然後調用一個特定的方法;你只需在某個對象上調用一個方法;並且對象的類型將確保該方法執行正確的操作。

換句話說:在某個時刻,您決定要實例化哪個具體類;之後,你不再擔心了。

你知道,小動作語言甚至沒有如果(作爲關鍵字/語言生成int)。

當然,你不應該進去,只是換一個,如果與另一個。相反,您可以退後一步,看看您的問題是否可以重新構建;利用多態性。

你可以在這裏找到一個相當不錯的video如何看待現實。

+0

但是在這個例子中,他有一個布爾類型的基元...你能解釋你打算如何用它重載?你的意思是創建一個採用布爾值的工廠,並根據它的值實例化兩個不同的類?如果是這樣,這似乎極端措施只是爲了避免如果/其他。你能否詳細說明一下? – Palcente

+0

@Palcente問題是:「a」從哪裏來?是的,這正是面向對象設計的精妙之處:您的業務邏輯,那些真正做到「真正的工作」的對象,他們很少使用「新」。相反,一些* framework *創建對象;基於配置信息或其他元信息。然後,在創建完所有對象之後,您只需進行方法調用。如果您好奇,我建議您轉到視頻(鏈接添加到我的答案),花了30分鐘。每秒值得! – GhostCat

+0

會做,謝謝 – Palcente

4

我猜第一個是最好給出的第二個最有可能不正確。我會使用你認爲簡單且不易出錯的表格。

第二個例子最喜歡的應該是

if (a) { 
    doAB(); 
} else if (b) { 
    doAB(); 
    doB(); 
} 

如果是,它不可能是B和反之亦然

在這種情況下,你並不需要兩個條件。它應該是==!b

// a || b is always true 
doAB(); 
if(b) { 
    doB(); 
} 
+1

它可以是其中A和B都是假 –

+0

@danielsp在這種情況下的話,我會第一個選擇堅持,因爲它似乎不容易出錯。 –