在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。 使代码更清晰。 我经常使用的另一种方法确实是嵌套的