2015-10-20 33 views
3
if(var == something) { 
    A(); 
    B(); 
} else if(var == something_else) { 
    A(); 
    B(); 
    C(); 
} else { 
    assert(false); 
} 

如何避免在if這兩種情況下調用A()和B()的代碼重用。我是否應該使用開關盒,在下面的僞c代碼片段中,應該避免代碼重用的方法是什麼?

switch(var) { 
case something: 
case something_else: 
    A(); 
    B(); 
    break; 
} 
if (var == something_else) 
    C(): 

什麼是更好的解決方案? switch vs if else是否有任何性能損失?

+1

呼叫順序是否重要? –

+0

@ rakeb.void,No – JagsVG

+0

您給出的例子非常簡單,似乎在這種情況下儘量減少代碼重用是不值得的。它只會讓代碼更難閱讀。 – user694733

回答

6
if (var == something || var == something_else) { 
    A(); 
    B(); 
} 

if (var == something_else) { 
    C(); 
} 

如果您還需要else,你可以這樣做:

if (var == something || var == something_else) { 
    A(); 
    B(); 

    if (var == something_else) { 
     C(); 
    } 
} else { 
    assert(false); 
} 

在問候你的問題,

是否有開關的任何性能損失VS如果別的嗎?

請閱讀這個問題的答案:

Is 'switch' faster than 'if'?

總之,通常不會有任何明顯的差異。所以你應該在編寫代碼時考慮到可讀性。在if/elseswitch之間,只要選擇更自然的東西。

+0

'else'呢? –

+0

@ rakeb.void謝謝,編輯 –

2

由於調用順序沒關係,試試這個:

switch(var) {  
    case something_else: 
     C(); 
    case something: 
     A(); 
     B(); 
    break; 
    default: 
     assert(false); 
    break; 
} 
2

if語句可以使用嵌套對於這一點,就像這樣:

If (var == something || var == something_ese) { 
    A(); 
    B(); 
    If (var == something_else) { C(); } 
} 
Else 
{ 
    Assert(false); 
} 
1

我會建議分離assert和工作:

assert(var == something || var == something_else); 

A(); 
B(); 
if(var == something_else) { 
    C(); 
} 

不僅可以避免重複AB調用,但也使得它更易於閱讀,因爲您可以在開始時指定前提條件。