基于布尔标志在 java 8 中执行 1 行功能的最佳方法是什么?

问题描述

我有一个布尔标志,我想根据它执行 1 行功能,比如增加一个变量或调用一个对象的方法等。在 java 中以最小的认知复杂度做到这一点的最佳方法是什么? 8?

// Objects a is initialized;
// int x,y;
// boolean flag;
if (flag) {
    a.doSomething1();
} else {
    a.doSomethingElse1();
}

// want to check multiple times like this
if (flag) {
    a.doSomething2();
} else {
    a.doSomethingElse2();
}

if (flag) {
    x++;
} else {
    y++;
}

在 java 8 中是否有更简单的方法来降低认知复杂度?因为我正面临这个 sonarlint 规则的问题:方法的认知复杂性不应该太高 if else 语句太多

---------- 编辑 -----------------

我的代码看起来像这样:

void myMethod(List<SomeClass> list) {
    for (SomeClass a : list) {
        SomeClass a;
        String name = a.getName();
        boolean flag = a.getFlag();
        switch(name) {
            case "name1":
                if (flag) a.doSomething1() else a.doSomethingElse1();
                break;
            case "name2":
                if (flag) a.doSomething2() else a.doSomethingElse2();
                break;
            //.... similar otherCases
        }
    }
} 

所有这些都在增加认知复杂性

解决方法

回答你的具体例子:

由于一切仅取决于 SomeClass 的成员,因此逻辑也应该是此类的一部分。一种方法是:

abstract class SomeClass {               

    public void doIt() {
        String name = this.getName();
        switch (name) {
        case "name1":
            this.doName1();
            break;
        case "name2":
            this.doName2();
            break;
        }
    }
    
    private void doName1() {
        if (this.getFlag())
            this.doSomething1();
        else
            this.doSomethingElse1();
    }

    private void doName2() {
        if (this.getFlag())
            this.doSomething2();
        else
            this.doSomethingElse2();
    }
    
    abstract protected String getName();

    abstract protected boolean getFlag();

    abstract protected void doSomething1();

    abstract protected void doSomething2();

    abstract protected void doSomethingElse1();

    abstract protected void doSomethingElse2();
}

myMethod 然后可以是

void myMethod(List<SomeClass> list) {
    for (SomeClass a : list) {
        a.doIt();
    }
}

或改写为

void myMethod(List<SomeClass> list) {
    list.forEach(SomeClass::doIt);
}

如果您愿意,但这主要是风格/个人喜好的问题。


从那时起,您可以开始考虑拆分以 12 结尾的方法,以分隔策略对象。

还要注意我们怎么突然不再使用外部的一个方法了——这可以用来减少 SomeClass 的公共接口,对于具体的例子,我们只需要 doIt() 是公共的.这是通常被称为“告诉,不要问”的原则的应用。避免向对象询问其字段的内容,以根据这些值做出决定。相反,告诉他们你想发生什么,把细节留给他们。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...