【问题标题】:Sonarqube - extend the nested ternary operatorsSonarqube - 扩展嵌套的三元运算符
【发布时间】:2021-12-05 17:27:35
【问题描述】:
我得到了这个表达式的代码味道:
return url == null ? View("Demo") : View(!string.IsNullOrEmpty(url) ? (object)url: null);
如何扩展此三元运算符以避免不符合标准的编码标准(Sonar cube 将此检测为主要代码异味/不符合标准)?
【问题讨论】:
标签:
c#
asp.net
model-view-controller
sonarqube
【解决方案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);
}