【发布时间】:2021-04-11 05:05:07
【问题描述】:
我有一个布尔标志,基于它我想执行 1 行功能,比如增加变量或调用对象的方法等。在 java 中使用 min cognitive complex 做到这一点的最佳方法是什么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
}
}
}
所有这些都在增加认知复杂性
【问题讨论】:
-
只需将所有内容放在同一个
if或else中。还是你在问别的? -
我不确定我是否理解您想要在此处简化的内容。
if(a) b else c已经很短了。 -
如果你的意思是这样做 if (flag) x++ else y++ 不会解决我的问题,因为它仍然会通过任何嵌套因素增加声纳 lint 认知复杂性 - rules.sonarsource.com/java?search=cognitive%20complexity
-
一般来说,如果有一个包含非平凡逻辑的循环,则将主体提取到不同的函数。这也有助于遵守其他规则,例如有限的嵌套级别。如果您有多个布尔标志,您可能能够提取相等的部分和不同的部分,并使用模板方法或策略模式等模式。但选择哪一种取决于多种因素,不能一概而论。
-
跟进@Hulk 的评论 - 请注意您编辑的示例如何从
a中提取数据,然后使用这些数据来决定要做什么。此行为应在SomeClass本身内。另见:告诉,不要问
标签: java java-8 sonarqube sonarlint