2011-05-23 228 views
18

我必須評估許多條件。在我的情況下,我必須做這樣的事情:switch語句中的switch語句?

switch(id) 
{ 
    case 5: 
     // switch some other cases here 
    case 6: 
     // set some value 
    ... 
} 

情況5有另一個開關的好習慣嗎?如果沒有,有什麼更好的?在那裏有if陳述?

+0

使用switch語句是不好的做法本身 – 2011-05-23 13:01:47

+0

什麼是好的,只要它的作品。 – crypted 2011-05-23 13:02:07

+9

Int3 - 哦,親愛的! – ThePower 2011-05-23 13:02:53

回答

17

我會調用一個特定於情況5的功能,然後在該功能中有開關情況。例如:

switch(id) 
{ 
    case 5: 
     functionFiveSpecific(id); 
    case 6: 
     // set some value 
    ... 
} 

特異於殼體5的功能:

private void functionFiveSpecific(id) 
{ 
    // other switch in here 
} 

雖然

強烈建議避免使用switch語句如果可能的。請閱讀here

+0

該帖子似乎並未暗示強烈建議避免非嵌套切換。對於嵌套式交換機,爲什麼避免切換還有其他特殊原因?性能原因除外,與今天的機器不太相關。 – liang 2013-05-01 09:29:48

+5

*強烈建議儘量避免使用switch語句。*不要傳播fud。有限制的東西不是爲了能夠避免它的原因。 'foreach'有侷限性,爲什麼要用它?嘿C#有限制,爲什麼要麻煩? 'switch'更具可讀性,並且如果重要的話速度會更快。但如果你的意思是多態,那麼我同意。 – nawfal 2013-05-17 21:20:28

1

我會調用一個函數並傳入aditional的情況下,並在函數做一個開關的情況下。使更乾淨的代碼。我經常使用的另一種方法確實是嵌套如果是

7

,可能是錯的唯一的事情是,它可能會損害可讀性:

switch(id) 
{ 
    case 5: 
    { 
     switch (somethingElse) 
     { 
      case 1: 
       // blah... 
     } 
    } 
    case 6: 
     // set some value 
    ... 
} 

你可以通過移動嵌套部分進入一個方法改善這一點:

switch(id) 
{ 
    case 5: 
     Foo(); 
     break; 
    case 6: 
     // set some value 
    ... 
} 
5

切換語句是不錯的做法。嵌套的switch語句可能很麻煩。

也許考慮在另一種方法中嵌入嵌套switch語句以提高清晰度。

2

如果可能,請使用多態性。這會讓你的代碼更清潔。

+2

請問您能更具體一些,拿出代碼示例嗎? – shytikov 2015-03-12 10:09:49

5

更好的做法是在不同類中多態地封裝不同的行爲,並儘可能避免使用switch語句。

這並不總是可能的,如果必須使用開關語句的話,我不會把另一個嵌套switch語句(或if語句的集合),但很可能有一個方法調用其中將包括該邏輯。

如果你張貼在你正在嘗試做一些詳細信息,然後我們可能能夠提供更好的建議。

+0

確實,這篇文章的答案非常合適。想象一下,如果使用這裏提到的OOP概念之一就可以實現沒有if語句的代碼。 – 2011-05-23 13:10:31

5

一旦你開始築巢您Cyclomatic complexity開始上升。取決於嵌套開關的複雜程度,這可以很有趣地維護。您可能需要考慮將第二個嵌套開關移動到它自己的函數上。例如

switch (order.Status) 
{ 
    case OrderStatus.New: 
     // Do something to a new order; 
     break; 

    ... 

    case OrderStatus.ReadyToShip 
     // Process Shipping Instructions 
     ShipOrder(order); 
     break; 
} 

,然後,如果你有一個開關基於航運的支付

void ShipOrder(Order order) 
{ 
    switch (order.ShippingMethod) 
    { 
    } 
} 

通過移動第二switch語句出的第一它更容易維護的類型,也可以是單獨測試

+0

+1用於環複雜度 – crypted 2011-05-23 13:15:30

6

避免!

嘗試重構代碼以消除開關情況。切換行爲語句可以重構爲策略模式。

Strategy Pattern](![Strategy Pattern

+1

+1用於將多態行爲分爲策略。不幸的是,這是過度勞累的簡單的事情,你不能重構你的代碼,因爲它來自「外部」:( – 2011-05-23 13:16:06

+3

你能提供一個簡單的代碼示例到你的模式?我不知道我能理解如何從嵌套開關轉換爲這種模式.. – Dennis 2014-05-09 21:15:54