我必須評估許多條件。在我的情況下,我必須做這樣的事情:switch語句中的switch語句?
switch(id)
{
case 5:
// switch some other cases here
case 6:
// set some value
...
}
情況5有另一個開關的好習慣嗎?如果沒有,有什麼更好的?在那裏有if
陳述?
我必須評估許多條件。在我的情況下,我必須做這樣的事情:switch語句中的switch語句?
switch(id)
{
case 5:
// switch some other cases here
case 6:
// set some value
...
}
情況5有另一個開關的好習慣嗎?如果沒有,有什麼更好的?在那裏有if
陳述?
我會調用一個特定於情況5的功能,然後在該功能中有開關情況。例如:
switch(id)
{
case 5:
functionFiveSpecific(id);
case 6:
// set some value
...
}
特異於殼體5的功能:
private void functionFiveSpecific(id)
{
// other switch in here
}
雖然
強烈建議避免使用switch語句如果可能的。請閱讀here。
我會調用一個函數並傳入aditional的情況下,並在函數做一個開關的情況下。使更乾淨的代碼。我經常使用的另一種方法確實是嵌套如果是
,可能是錯的唯一的事情是,它可能會損害可讀性:
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
...
}
切換語句是不錯的做法。嵌套的switch語句可能很麻煩。
也許考慮在另一種方法中嵌入嵌套switch語句以提高清晰度。
更好的做法是在不同類中多態地封裝不同的行爲,並儘可能避免使用switch語句。
這並不總是可能的,如果必須使用開關語句的話,我不會把另一個嵌套switch語句(或if語句的集合),但很可能有一個方法調用其中將包括該邏輯。
如果你張貼在你正在嘗試做一些詳細信息,然後我們可能能夠提供更好的建議。
確實,這篇文章的答案非常合適。想象一下,如果使用這裏提到的OOP概念之一就可以實現沒有if語句的代碼。 – 2011-05-23 13:10:31
一旦你開始築巢您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語句出的第一它更容易維護的類型,也可以是單獨測試
+1用於環複雜度 – crypted 2011-05-23 13:15:30
避免!
嘗試重構代碼以消除開關情況。切換行爲語句可以重構爲策略模式。
+1用於將多態行爲分爲策略。不幸的是,這是過度勞累的簡單的事情,你不能重構你的代碼,因爲它來自「外部」:( – 2011-05-23 13:16:06
你能提供一個簡單的代碼示例到你的模式?我不知道我能理解如何從嵌套開關轉換爲這種模式.. – Dennis 2014-05-09 21:15:54
使用switch語句是不好的做法本身 – 2011-05-23 13:01:47
什麼是好的,只要它的作品。 – crypted 2011-05-23 13:02:07
Int3 - 哦,親愛的! – ThePower 2011-05-23 13:02:53