【问题标题】:My code is clumsy, sonarqube says "Replace this if-then-else statement by a single return statement."我的代码很笨拙,sonarqube 说“用一个 return 语句替换这个 if-then-else 语句。”
【发布时间】:2021-01-30 21:47:05
【问题描述】:

我是 Java 新手。我不知道如何使这段代码更简单。

if (word == null || word.length() < 3 || !Character.isLetter(word.charAt(0)) || !Character.isDigit(word.charAt(word.length()-1)) || word.matches("[\\s\\S]*\\s[\\s\\S]*")) {
    return false;
} else {   
    return true;
}

sonarqube 说“用一个 return 语句替换这个 if-then-else 语句。”我不知道如何修改它。

【问题讨论】:

  • return !(word == null...
  • return word != null &amp;&amp; word.length() &gt;= 3 &amp;&amp; Character.isLetter(word.charAt(0)) &amp;&amp; Character.isDigit(word.charAt(word.length()-1)) &amp;&amp; !word.matches("[\\s\\S]*\\s[\\s\\S]*");
  • 这是可怕的代码。强烈考虑重做这个。

标签: java coding-style


【解决方案1】:

Timsmelik 在这里,我同意他的回答。因此,我将重点介绍如何通过添加一些私有方法来使这段代码更具可读性,最终可能会得到这样的结果:

public boolean isValid(String word) {
     return isNotNull(word) && hasAtLeastThreeChars(word) && isFirstCharALetter(word) && isLastCharADigit(word) && hasNoWhiteSpaces(word)
}

...基本上为您执行的每个验证创建一个私有方法。这增加了一些代码行,但乍一看,在巨大的条件串联中发生了什么变得非常清楚。我个人更喜欢可读性而不是紧凑的代码。

但是,由于您已经在使用正则表达式来验证字符串中没有空格,您还可以扩展该正则表达式来验证其他一些点吗?您知道您的字符串必须有 2 个以上的字符,第一个字符必须是字母,最后一个字符必须是数字,等等。如果您修改了正则表达式来验证这些点,您可以节省一些行。这样做的唯一缺点是,当您在代码中遇到正则表达式时,它可能会非常晦涩难懂。因此,当您将来遇到该代码时,您可能会有点讨厌自己。

希望这对您有所帮助

【讨论】:

    【解决方案2】:

    如果你有这样的事情:

    if (myObj == null) {
        return false;
    } else {
        return true;
    }
    

    您可以将 if-else 替换为 return 语句:

    return myObj != null;
    

    请注意,如果 if 语句中的表达式为真,则返回值为 false,因此我们必须反转返回值。

    【讨论】:

      【解决方案3】:

      考虑以下代码行:

      return !(word == null || word.length() < 3 || !Character.isLetter(word.charAt(0)) || !Character.isDigit(word.charAt(word.length()-1)) || word.matches("[\\s\\S]*\\s[\\s\\S]*"));
      

      ! 函数作为 NOT,并反转语句。其余的一切你都应该熟悉,因为你写了它:)

      【讨论】: