1

让我们想象一个简单的构造:

public void onClick(View view) {
    switch (view.getId()) {
        case R.id.btn_first: {
            // some code
        }
            break;
        case R.id.btn_second: {
            // some code
        }
            break;
        case R.id.btn_third: {
            // some code
        }
            break;
        // and so on
    }
}

这是一段处理不同按钮点击的简单代码。但随着按钮数量的增加 -switch块的圈复杂度也随之增加。是否有另一种方法来表示此代码构造以降低onClick()方法的圈复杂度?提前致谢。

4

3 回答 3

2
public void onClick(View view) {
    for (ClickHandler handler : allHandlers()) {
        if (handler.supports(view.getId())) {
            handler.onClick(view);
        }
    }
}

interface ClickHandler {
    boolean supports(int viewId);
    void onClick(View view);
}

为每个分支实现一个ClickHandlerallHandlers()构建它们的列表。

于 2013-02-01T14:04:59.717 回答
1

这是我在使用早期版本的 GWT(Google Web Toolkit)时遇到的问题之一。GWT 是 google 为 JAVA 开发人员提供一种使用 JAVA 编写 JavaScript 代码的方法的答案。

我们开始使用单个匿名内部类来处理网页上的每个事件/元素。当你没有太多元素时它工作得很好,这对于网页来说是不现实的。因此,随着元素数量的增加,它变得难以管理和混乱。然后我们很快就解决了您提出的同一个问题。谷歌通过在 GWT 的更高版本中使用事件总线解决了这个问题。

那是怎么解决的? 他们创建了一种模式,您可以在其中将条件抽象到事件总线的一个级别,并让它调用适当的处理程序。

但是,回到您的 javascript 问题,这里有一个很好、简单的模式解释,Handling events for many elements

真的,在我看来,你想要做的是完全避免圈复杂性模式,就像我说的那样,通过使用事件总线或事件处理程序或映射抽象一个级别,最终调用一个函数来避免代码重复并用另一个解决这个问题图案。

我宁愿创建更多的小函数,从而使代码更像组件,而不是让 if/else 模式不断复制自己。我发现一旦你沿着这条路走下去,这种模式就没有尽头,你将继续被迫添加更多 if/else 语句,直到你用更好的解决方案重构代码。

我记得在 JAVA 代码中看到了同样的事情,他们正在培训 COBOL 开发人员学习 JAVA,而那些保持程序思维方式的人不断陷入这种模式。我曾经看到一个带有 26 个条件的 switch 语句检查单个类型条件。

这里有一些关于Cyclomatic Complexity Refactoring Tips的好技巧以及好的代码示例。

于 2019-04-27T18:41:33.950 回答
0

这是可能的(例如带有执行程序的哈希图或其他东西),但我认为这会使代码质量变差。低圈复杂度有利于高质量的代码,但最终目标仍然应该是高质量和可维护的代码,而不是低圈复杂度。

于 2013-02-01T14:00:46.093 回答