代码之家  ›  专栏  ›  技术社区  ›  JustADude

setter与Classic If中的三元运算

  •  1
  • JustADude  · 技术社区  · 8 年前

    目前正在修改大型映射类和一些新规则,这让我想知道这里的最佳选择是什么。

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

    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 (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);
    }
    

    我觉得使用三元操作会降低可维护性,增加复杂性(每次都会检查)。但我想听听其他的意见。

    注:我有很多尝试。。所以使用if意味着复制那些try块或在每个块中添加if,这会降低可读性。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Ralf Kleberhoff    8 年前

    这个问题没有绝对的答案。视情况而定。

    使用三元运算符,可以立即看到:

    • 三个属性总是设置为某个值,并且总是相同的属性,与条件无关。
    • 您可以看到这两个可选值彼此非常接近,因此对于读者来说,比较它们很容易。

    但是有一些(很多?)不习惯该操作员的开发人员(这是他们的错还是我们的错?),因此,使用它可能会迫使他们查找其含义,而不是立即理解代码(对于我来说,有LISP背景的人来说,三元运算符总是和 if 声明)。

    的确,使用三元运算符,最终会得到三个条件,而不是一个条件(但是应该忽略这些较小的性能影响,除非您发现这在应用程序中确实有害)。

    另一方面 如果 声明中,您会立即看到:

    • 这只是影响所有属性的一个条件。
    • 您可以看到这两种情况的属性组合非常接近。

    甚至Java初学者也会理解您的代码。

    因此,这取决于:

    • 同事的Java流利性
    • 是要强调单个特性的不同值,还是要强调三个特性的值集。

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