setter VS Classic If中的三元操作

时间:2017-12-13 11:26:13

标签: java if-statement ternary-operator

目前正在修改大型地图类,并且出现了一些新规则让我想知道这里最好的选择是什么。

想象一下这样的经典映射函数:

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会杀死可读性。

1 个答案:

答案 0 :(得分:1)

这个问题没有绝对的答案。这取决于。

使用三元运算符,您会立即看到:

  • 三个属性始终设置为某个值,并且它始终是相同的属性,与条件无关。
  • 您会看到两个替代值彼此接近,因此对于读者来说,很容易比较它们。

但是有一些(很多?)开发人员不习惯那个操作符(是他们的错还是我们的?),所以使用它可能会迫使他们查找其含义而不是立即理解代码(对我而言) ,具有LISP背景,三元运算符始终与if语句一样自然。

这是真的,使用三元运算符,你最终得到三个条件而不是一个(但你应该忽略这些微小的性能影响,除非你发现它在你的应用程序中真的很痛)。

另一方面,使用if语句,您会立即看到:

  • 这只是影响所有属性的一个条件。
  • 您会看到两种情况的属性组合在一起。

即使是Java初学者也会理解你的代码。

所以,这取决于:

  • 你的同事的流利程度
  • 是否要强调单个属性的不同值或三个属性的值集。

当然,所有这些都不是面向对象的。如果代码结构和预算允许,也许您可​​以使用多态而不是条件来提出解决方案。