1

当我有以下具有 2 级三元运算的代码时

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

哪个 Sonar 发出警告

Ternary operators should not be nested (squid:S3358)

仅仅因为你可以做某事,并不意味着你应该做,嵌套三元操作就是这种情况。嵌套三元运算符产生的代码在您编写时可能看起来很清晰,但六个月后会让维护者(或更糟 - 未来的您)摸不着头脑并诅咒。

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

我的同事建议可以接受这样的水平,它比替代方案更清楚。

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

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

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

4

1 回答 1

1

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

三元运算符不应该嵌套规则无法配置。您只能启用或禁用它。

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

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

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

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

于 2018-11-19T21:49:24.833 回答