假设一个方法根据一个相当大的枚举中的一个值来选择一个动作。我们的声纳现在抱怨这种方法的圈复杂度很高(自然是关于 case 语句的数量)。
我知道,大型 switch case 语句并不是 OOP 中的最佳风格,但有时使用它们(在我的例子中是评估运算符标记的解析器)而不是构建复杂的对象树是非常合适的。
我现在的担心是怎么处理的?是否有任何设计模式可以有意义地拆分这样的开关盒?或者我可以(并且我应该)将课程排除在测量 CC 之外(因为其中可能有其他方法可以轻松避免高 CC)?
这不是一件真正关键的事情。我只是不喜欢我的项目有我无法删除的警告;o)
编辑:代码示例
String process()
String fieldName = this.getField() != null ? this.getField().getSchemaName() : null;
String result = "";
switch (op) {
case PHRASE:
result = "";
if(!value.isEmpty() && value.get(0) != null) {
result = value.get(0).toString();
}
break;
case EQUALS:
case GT:
case GTE:
case LT:
case LTE:
case NOT_EQUALS:
result = prepareSingleParameterStatement(fieldName);
break;
case BETWEEN_EXC:
case BETWEEN_INC:
result = prepareDoubleParameterStatement(fieldName);
break;
case IN:
case NOT_IN:
case ALL_IN:
result = prepareCollectionStatement(fieldName);
break;
case AND:
case OR:
result = prepareLogicalStatement();
break;
case NOT:
result = prepareNotStatement();
break;
default:
break;
}
return result;
}