Sonarqube - 扩展嵌套的三元运算符

Posted

技术标签:

【中文标题】Sonarqube - 扩展嵌套的三元运算符【英文标题】:Sonarqube - extend the nested ternary operators 【发布时间】:2021-12-05 17:27:35 【问题描述】:

我得到了这个表达式的代码味道:

return url == null ? View("Demo") : View(!string.IsNullOrEmpty(url) ? (object)url: null);

如何扩展此三元运算符以避免不符合标准的编码标准(Sonar cube 将此检测为主要代码异味/不符合标准)?

【问题讨论】:

【参考方案1】:

对于每条规则,SonarQube 都提供了合规和不合规解决方案的描述和示例。对于这个特定的规则,says:

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

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

不合规代码示例

public string GetReadableStatus(Job j)

 return j.IsRunning ? "Running" : j.HasErrors ? "Failed" : "Succeeded";  // Noncompliant

合规解决方案

public string GetReadableStatus(Job j)

 if (j.IsRunning)
 
   return "Running";
 
 return j.HasErrors ? "Failed" : "Succeeded";

在您的特定示例中,将被制作为:

if (url == null) 
 return View("Demo");

return View(!string.IsNullOrEmpty(url) ? (object)url: null);

不过,我会考虑在 switch 声明中重新表述所有这些内容;这可能更容易阅读和维护,例如:

switch(url) 
 case null:
  return View("Demo");
 case "":
  return View(null);
 default:
  return View(url);

【讨论】:

以上是关于Sonarqube - 扩展嵌套的三元运算符的主要内容,如果未能解决你的问题,请参考以下文章

以函数方式重写嵌套的三元运算符

javascript 嵌套的三元运算符

了解嵌套的 PHP 三元运算符 [重复]

javascript中的嵌套条件三元运算符[关闭]

java多重三元运算符(三目运算符)嵌套

三元运算符关联性