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 流利程度
  • 您是要强调单个属性的不同值还是三个属性的值集。

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