不能嵌套三元运算符(squid:S3358)

时间:2018-11-19 05:56:47

标签: java sonarqube sonarlint sonarlint-eclipse

当我使用以下代码进行2级三元操作时

 double amount = isValid ? (isTypeA ? vo.getTypeA() : vo.getTypeB()) : 0;

哪个声纳发出警告

Ternary operators should not be nested (squid:S3358)
  

仅因为您可以做某事,并不意味着您应该这样做,并且嵌套三元运算就是这种情况。嵌套三元运算符会导致在您编写代码时看起来似乎很清晰的那种代码,但是六个月后,将使维护者(或更糟糕的是,您将来)会费力地抱怨。

     

相反,为了清楚起见,请犯错,并使用另一行将嵌套操作表示为单独的语句。

我的同事建议接受这样的级别,并且比其他级别更明确。

我想知道是否可以将此规则(或其他规则)配置为允许的级别限制?

如果没有,为什么声纳在处理代码约定时是如此严格?

我不想ignore规则,只是自定义以允许最多2个级别而不是1个级别。

1 个答案:

答案 0 :(得分:1)

  

我想知道是否可以将此规则配置为允许的级别限制?

无法配置Ternary operators should not be nested规则。您只能启用或禁用它。

  

我想知道是否可以将其他规则配置为允许的级别限制?

我不知道任何现有的规则都可以做到。幸运的是,您能够创建自定义分析器。原始规则类在此处NestedTernaryOperatorsCheck。您可以简单地复制它并根据需要进行调整。

  

为什么声纳在处理代码约定时是如此严格?

SonarSource为不同的语言提供了很多规则。每次定制都会使代码更难以维护。他们的能力有限,因此必须做出所有用户都不接受(但大多数用户都接受)的决定。