如何降低其循环复杂性?

我有一个方法,它接收一个对象,并根据它检测到的对象类型做一些事情:

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...
                }
            }
        }
    }
}

如何降低环状复杂性?我四处寻找,但找不到任何有用的东西。


答案 1

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


答案 2

循环复杂度是基于代码图形结构的度量。具体来说,它基于通过代码的可能路径的数量;有关更多详细信息,请参阅此处。虽然CC与典型程序员认为的代码复杂性之间存在相关性,但它们不是一回事。例如:

  • CC不考虑代码的语义;例如,所调用的某某方法的作用,或算法的数学性质。

  • CC 不考虑设计和编码模式。因此,CC说复杂的东西对于理解正在使用的模式的人来说可能很简单。

你可以说CC和真实代码复杂性之间的关系就像智商和真实智能之间的关系。

因此,应该将循环复杂性视为代码中复杂部分的指标......不是作为复杂性或代码质量的真正衡量标准。事实上,高度复杂的代码并不一定是质量差的。通常,复杂性是固有的,试图摆脱它只会让事情变得更糟。


在此特定示例中,高 CC 度量值与会导致典型程序员遇到任何困难的东西不对应。最好的答案(IMO)是不要使用这种方法。将其粉笔化为误报。