减少表达式中使用的条件运算符 (4) 的数量(最多允许 3 个)
Reduce number of conditional operators(4) used in the expression (maximum allowed 3)
如何降低运算符的复杂性?我有一个条件问题。
Object someObject = getSomeObject();
boolean isNotInstanceOfA = !(someObject instanceof A);
boolean isNotInstanceOfB = !(someObject instanceof B);
boolean isNotInstanceOfC = !(someObject instanceof C);
boolean isNotInstanceOfABC = isNotInstanceOfA && isNotInstanceOfB && isNotInstanceOfC;
if (isNotInstanceOfABC && (container.getChildren(itemId) == null || container.getChildren(itemId).isEmpty())) {
return "something";
}
itemId 是否是原始类型? 我猜它不是原始类型,为了减少代码,您可以将此 null 或空检查移动到一个单独的方法和 return 一个布尔值..你也可以像这样减少一些代码:`
boolean isNotInstanceOfABC = !(someObject instanceof A) && !(someObject instanceof B) && !(someObject instanceof C);
if (isNotInstanceOfABC && isEmptyOrNull(container.getChildren(itemId))) {
return "something";
}`
您实际上可以计算 if
块之前的条件,这样 代码将更具可读性,如下所示:
boolean isChildNull = (container.getChildren(itemId) == null);
boolean isChildEmpty = (isChildNull || container.getChildren(itemId).isEmpty());
if (isNotInstanceOfABC && isChildEmpty) {
return "something";
}
但是,我从你的代码中推断出你做错了什么,因为你做了很多instanceof
检查,这根本不是一个好的做法,你可能需要考虑重构您的代码,如所述(用多态性替换条件)。
不确定它是否适合您,但我会尝试以这种方式重构代码:
Object someObject = getSomeObject();
if (isInstanceOfABC(someObject)) {
log.debug("Instance of A, B or C");
return;
}
if (childrenIsEmptyOrNull( container.getChildren(itemId) ) {
log.debug("Children is null or empty");
return;
}
return "something";
private boolean isInstanceOfABC(Object someObject) {
return someObject instanceof A
|| someObject instanceof B
|| someObject instanceof C;
}
private boolean childrenIsEmptyOrNull(Children children) {
return children == null || children.isEmpty();
}
然而,
使用 instance of
是一种 代码异味 。每当我看到这样的结构时,我就肯定出了什么问题。你最好现在停下来,在多态的帮助下摆脱所有这些检查。
标准化你的逻辑表达式然后使用下面的方法
public boolean AND_Operator(boolean ...values) {
for (boolean b : values) {
if(!b)
return false;
}
return true;
}
public static boolean OR_Operator(boolean ...values) {
for (boolean b : values) {
if(b)
return true;
}
return false;
}
如何降低运算符的复杂性?我有一个条件问题。
Object someObject = getSomeObject();
boolean isNotInstanceOfA = !(someObject instanceof A);
boolean isNotInstanceOfB = !(someObject instanceof B);
boolean isNotInstanceOfC = !(someObject instanceof C);
boolean isNotInstanceOfABC = isNotInstanceOfA && isNotInstanceOfB && isNotInstanceOfC;
if (isNotInstanceOfABC && (container.getChildren(itemId) == null || container.getChildren(itemId).isEmpty())) {
return "something";
}
itemId 是否是原始类型? 我猜它不是原始类型,为了减少代码,您可以将此 null 或空检查移动到一个单独的方法和 return 一个布尔值..你也可以像这样减少一些代码:`
boolean isNotInstanceOfABC = !(someObject instanceof A) && !(someObject instanceof B) && !(someObject instanceof C);
if (isNotInstanceOfABC && isEmptyOrNull(container.getChildren(itemId))) {
return "something";
}`
您实际上可以计算 if
块之前的条件,这样 代码将更具可读性,如下所示:
boolean isChildNull = (container.getChildren(itemId) == null);
boolean isChildEmpty = (isChildNull || container.getChildren(itemId).isEmpty());
if (isNotInstanceOfABC && isChildEmpty) {
return "something";
}
但是,我从你的代码中推断出你做错了什么,因为你做了很多instanceof
检查,这根本不是一个好的做法,你可能需要考虑重构您的代码,如
不确定它是否适合您,但我会尝试以这种方式重构代码:
Object someObject = getSomeObject();
if (isInstanceOfABC(someObject)) {
log.debug("Instance of A, B or C");
return;
}
if (childrenIsEmptyOrNull( container.getChildren(itemId) ) {
log.debug("Children is null or empty");
return;
}
return "something";
private boolean isInstanceOfABC(Object someObject) {
return someObject instanceof A
|| someObject instanceof B
|| someObject instanceof C;
}
private boolean childrenIsEmptyOrNull(Children children) {
return children == null || children.isEmpty();
}
然而,
使用 instance of
是一种 代码异味 。每当我看到这样的结构时,我就肯定出了什么问题。你最好现在停下来,在多态的帮助下摆脱所有这些检查。
标准化你的逻辑表达式然后使用下面的方法
public boolean AND_Operator(boolean ...values) {
for (boolean b : values) {
if(!b)
return false;
}
return true;
}
public static boolean OR_Operator(boolean ...values) {
for (boolean b : values) {
if(b)
return true;
}
return false;
}