如何降低Cyclomatic Complexity?

我有一个接收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... } } } } } 

如何降低Cyclomatic Complexity? 我四处搜寻但找不到任何有用的东西。

你不能利用面向对象的方法吗? 创建一个具有doSomething()方法的接口,然后创建实现所需行为的子类? 然后调用object.doSomething()会执行适当的行为吗?

圈复杂度是基于代码的图结构的度量。 具体而言,它基于通过代码的可能路径的数量; 请看这里了解更多详情。 虽然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(); } 

为什么需要降低复杂性? 这是一个足够简单的模式,任何有能力的开发人员都会认为它是一个微不足道的function。

我可能会这样写

  if (object instanceof ObjectTypeA) { doSomethingA(); } else if (object instanceof ObjectTypeB) { doSomethingB(); } else if (object instanceof ObjectTypeC) { doSomethingC(); } 

如果要满足“CC必须小于x”的一些深奥需求,那么标准在那里确保可维护代码的总体规则意味着无论CC有多高,这都是可以接受的。

从未有过“减少圈复杂度”的目标,尽管有时候我被LOC付了钱。

你的代码“足够好”。 我的眼睛在括号上绊倒了,所以我牺牲了一点性能并做了以下(提供类型A,B等不在同一层次结构中):

 receive(Object object) { if (object intanceof ObjectTypeA) doSomethingA(); if (object instanceof ObjectTypeB) doSomethingB(); ... 

或(如果它们在同一层次结构中):

 receive(Object object) { if (object intanceof ObjectTypeA) { doSomethingA(); return; } if (object instanceof ObjectTypeB) { doSomethingB(); return; } ... 

不知道它是否会减少圈的东西,并不在乎。