setter中的三元运算 VS Classic If
Ternary operation in setter VS Classic If
目前正在修改大映射类,一些新规则的出现让我想知道这里最好的选择是什么。
想象一下像这样的经典映射函数:
yyy.setType(xxx.getType);
yyy.setSomething(xxx.getSomethigElse);
yyy.setThisAsWell(xxx.getThatAsWell);
而且我现在有一个条件可以检查一下,有什么比较好? (知道我以后不会做类似的条件检查):
final Boolean isRuleApplying = xxx.getRule == RULE;
yyy.setType(
isRuleApplying ? RULE_STUFF : xxx.getType
);
yyy.setSomething(
isRuleApplying ? RULE_STUFF_OTHER : xxx.getSomethigElse
);
yyy.setThisAsWell(
isRuleApplying ? RULE_STUFF_AGAIN : xxx.getThatAsWell
);
还是使用旧的 if else 更好?
if (xxx.getRule == RULE) {
yyy.setType(RULE_STUFF);
yyy.setSomething(RULE_STUFF_OTHER);
yyy.setThisAsWell(RULE_STUFF_AGAIN);
} else {
yyy.setType(xxx.getType);
yyy.setSomething(xxx.getSomethigElse);
yyy.setThisAsWell(xxx.getThatAsWell);
}
我觉得使用三元运算会降低可维护性并增加复杂性(每次检查)。但我想听听其他意见。
注意:我有一堆 try..catch,所以使用 if 意味着复制这些 try 块或在每个块中添加一个 if,这会降低可读性。
这个问题没有绝对的答案。视情况而定。
使用三元运算符,您会立即看到:
- 三个属性总是设置为某个值,并且它总是相同的属性,与条件无关。
- 您看到两个备选值彼此接近,因此对于 reader 比较它们很容易。
但是有些(很多?)开发人员不习惯该运算符(这是他们的错还是我们的错?),因此使用它可能会迫使他们查找其含义而不是立即理解代码 (对我来说,有 LISP 背景,三元运算符总是和 if
语句一样不自然。
确实,使用三元运算符,您最终会得到三个条件而不是一个(但是您应该忽略这些次要的性能影响,除非您发现它确实对您的应用程序造成伤害)。
另一方面,使用 if
语句,您会立即看到:
- 这只是影响所有属性的一个条件。
- 您会看到两种情况的属性组合非常接近。
甚至 Java 初学者也能理解您的代码。
所以,这取决于:
- 您同事的 Java 流利程度
- 您是要强调单个属性的不同值还是三个属性的值集。
当然,所有这些都不是非常面向对象的。如果代码结构和预算允许,也许你可以想出一个使用多态而不是条件的解决方案。
目前正在修改大映射类,一些新规则的出现让我想知道这里最好的选择是什么。
想象一下像这样的经典映射函数:
yyy.setType(xxx.getType);
yyy.setSomething(xxx.getSomethigElse);
yyy.setThisAsWell(xxx.getThatAsWell);
而且我现在有一个条件可以检查一下,有什么比较好? (知道我以后不会做类似的条件检查):
final Boolean isRuleApplying = xxx.getRule == RULE;
yyy.setType(
isRuleApplying ? RULE_STUFF : xxx.getType
);
yyy.setSomething(
isRuleApplying ? RULE_STUFF_OTHER : xxx.getSomethigElse
);
yyy.setThisAsWell(
isRuleApplying ? RULE_STUFF_AGAIN : xxx.getThatAsWell
);
还是使用旧的 if else 更好?
if (xxx.getRule == RULE) {
yyy.setType(RULE_STUFF);
yyy.setSomething(RULE_STUFF_OTHER);
yyy.setThisAsWell(RULE_STUFF_AGAIN);
} else {
yyy.setType(xxx.getType);
yyy.setSomething(xxx.getSomethigElse);
yyy.setThisAsWell(xxx.getThatAsWell);
}
我觉得使用三元运算会降低可维护性并增加复杂性(每次检查)。但我想听听其他意见。
注意:我有一堆 try..catch,所以使用 if 意味着复制这些 try 块或在每个块中添加一个 if,这会降低可读性。
这个问题没有绝对的答案。视情况而定。
使用三元运算符,您会立即看到:
- 三个属性总是设置为某个值,并且它总是相同的属性,与条件无关。
- 您看到两个备选值彼此接近,因此对于 reader 比较它们很容易。
但是有些(很多?)开发人员不习惯该运算符(这是他们的错还是我们的错?),因此使用它可能会迫使他们查找其含义而不是立即理解代码 (对我来说,有 LISP 背景,三元运算符总是和 if
语句一样不自然。
确实,使用三元运算符,您最终会得到三个条件而不是一个(但是您应该忽略这些次要的性能影响,除非您发现它确实对您的应用程序造成伤害)。
另一方面,使用 if
语句,您会立即看到:
- 这只是影响所有属性的一个条件。
- 您会看到两种情况的属性组合非常接近。
甚至 Java 初学者也能理解您的代码。
所以,这取决于:
- 您同事的 Java 流利程度
- 您是要强调单个属性的不同值还是三个属性的值集。
当然,所有这些都不是非常面向对象的。如果代码结构和预算允许,也许你可以想出一个使用多态而不是条件的解决方案。