如何解决基于布尔标志在 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);
}
如果您愿意,但这主要是风格/个人喜好的问题。
从那时起,您可以开始考虑拆分以 1
和 2
结尾的方法,以分隔策略对象。
还要注意我们怎么突然不再使用外部的一个方法了——这可以用来减少 SomeClass
的公共接口,对于具体的例子,我们只需要 doIt()
是公共的.这是通常被称为“告诉,不要问”的原则的应用。避免向对象询问其字段的内容,以根据这些值做出决定。相反,告诉他们你想发生什么,把细节留给他们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。