在switch语句中切换语句?

我必须评估许多条件。 在我的情况下,我必须做这样的事情:

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

在案例5中使用另一个开关是一种好习惯吗? 如果没有,有什么更好的? 在那里有if语句吗?

我将调用一个特定于案例5的函数,然后在该函数中使用switch case。 例如 :

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

案例5的具体function:

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

虽然

强烈建议尽可能避免使用switch语句。 在这里阅读。

唯一可能出错的是它可能会损害可读性:

 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语句,那么我不会放置另一个嵌套的switch语句(或if语句的集合),但可能会有一个包含该逻辑的方法调用。

如果你发布一些关于你想要做什么的更多细节,那么我们可能会提供更好的建议。

一旦开始嵌套,您的Cyclomatic复杂性就会开始上升。 根据嵌套交换机的复杂程度,维护起来很有趣。 您可能想要考虑将第二个嵌套开关移动到它自己的函数。 例如

 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语句移出第一个,它更容易维护,也可以单独测试

尽可能使用多态性。 这将使您的代码更清洁。

我会调用一个函数并传入aditional案例,并在函数中对它们执行switch case。 使代码更清晰。 我经常使用的另一种方法确实是嵌套的