Nat*_*han 16 java refactoring cyclomatic-complexity instanceof
我有一个接收Object的方法,并根据它检测到的对象类型做一些事情:
void receive(Object object) {
if (object instanceof ObjectTypeA) {
doSomethingA();
}
else {
if (object instanceof ObjectTypeB) {
doSomethingB();
}
else {
if (object instanceof ObjectTypeC) {
doSomethingC();
}
else {
if (object instanceof ObjectTypeD) {
doSomethingD();
}
else {
// etc...
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何降低Cyclomatic Complexity?我四处搜索但找不到任何有用的东西.
laz*_*laz 41
你不能利用面向对象的方法吗?创建一个具有该doSomething()方法的接口,然后创建实现所需行为的子类?那么调用object.doSomething()会执行适当的行为吗?
Ste*_*n C 28
圈复杂度是基于代码的图结构的度量.具体而言,它基于通过代码的可能路径的数量; 请看这里了解更多详情.虽然CC与典型程序员所看到的代码复杂性之间存在相关性,但它们并不相同.例如:
CC不考虑代码的语义; 例如,被调用的这种方法是什么,或算法的数学属性.
CC不考虑设计和编码模式.因此,对于理解所使用模式的人来说,CC所说的复杂内容可能很简单.
你可以说CC和实际代码复杂性之间的关系就像是IQ和真实智能之间的关系.
因此,应将Cyclomatic Complexity视为代码复杂部分所在的指标......而不是衡量复杂性或代码质量的真实指标.实际上,高度复杂的代码不一定质量差.通常,复杂性是固有的,试图摆脱它只会让事情变得更糟.
在这个特定的例子中,高CC测量不对应于会导致典型程序员任何困难的事情.最好的答案(IMO)是单独留下方法.把它作为假阳性粉笔.
void receive(ObjectTypeA object) {
doSomethingA();
}
void receive(ObjectTypeB object) {
doSomethingB();
}
void receive(ObjectTypeC object) {
doSomethingC();
}
...
// Your final 'else' method
void receive(Object object) {
doSomethingZ();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
54261 次 |
| 最近记录: |