16

我有一个接收对象并根据它检测到的对象类型执行某些操作的方法:

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

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

4

5 回答 5

43

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

于 2011-05-02T04:06:08.390 回答
28

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

  • CC 不考虑代码的语义;例如,被调用的某某方法是做什么的,或者算法的数学属性。

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

可以说,CC 与真实代码复杂度之间的关系就像 IQ 与真实智能之间的关系。

因此,圈复杂度应该被视为代码复杂部分所在位置的指标......而不是复杂性或代码质量的真正衡量标准。事实上,高度复杂的代码不一定质量差。通常,复杂性是与生俱来的,试图摆脱它只会让事情变得更糟。


在这个特定的例子中,高 CC 测量值并不对应于会给典型程序员带来任何困难的东西。最好的答案(IMO)是不理会该方法。将其归为误报。

于 2011-05-02T04:24:21.393 回答
9
void receive(ObjectTypeA object) {
        doSomethingA();
}

void receive(ObjectTypeB object) {
        doSomethingB();
}

void receive(ObjectTypeC object) {
        doSomethingC();
}

...

// Your final 'else' method
void receive(Object object) {
        doSomethingZ();
}
于 2014-03-31T14:10:58.090 回答
-2

从来没有“降低圈复杂度”的目标,尽管有时我是由 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; }
    ...

不知道会不会减少圈圈的东西,不在乎。

于 2011-05-02T04:05:21.377 回答
-2

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

我可能会这样写

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

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

于 2011-05-02T04:08:23.230 回答