Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在onClick()方法中降低圈复杂度_Java_Android_Refactoring_Switch Statement_Cyclomatic Complexity - Fatal编程技术网

Java 如何在onClick()方法中降低圈复杂度

Java 如何在onClick()方法中降低圈复杂度,java,android,refactoring,switch-statement,cyclomatic-complexity,Java,Android,Refactoring,Switch Statement,Cyclomatic Complexity,让我们想象一个简单的构造: public void onClick(View view) { switch (view.getId()) { case R.id.btn_first: { // some code } break; case R.id.btn_second: { // some code } break;

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

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
    }
}
这是一段处理不同按钮点击的简单代码。但随着按钮数量的增加,
开关
块的圈复杂度也随之增加。是否有其他方法来表示此代码构造以降低
onClick()
方法的圈复杂度?提前感谢。

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

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);
}

为每个分支实现一个
ClickHandler
,并让
allHandlers()
构建它们的列表。

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

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

这是如何解决的?他们创建了一个模式,您可以将条件抽象到事件总线的一个级别,并让它调用适当的处理程序

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

实际上,在我看来,你想要做的是完全避免圈复杂模式,就像我说的那样,通过事件总线、事件处理程序或映射抽象出一个层次,最终调用一个函数来避免代码重复,并用另一个模式解决这个问题

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

我记得在他们培训的JAVA代码中也看到了同样的情况 学习JAVA的COBOL开发人员和那些保持程序思维的开发人员经常陷入这种模式。我曾经看到一个switch语句,其中包含26个条件,用于检查单个类型的条件


下面是一些使用好代码示例的好提示。

不,没有其他可能的选项1:每个按钮使用一次单击处理程序。选项2:将类似按钮分组到单击处理程序中,并使用几个带有短switch语句的单击处理程序。选项3:将点击处理委托给视图(参见下面的Ryan Stewart答案)。此代码将变得低质量且不可维护。这就是问题所在。