Java Nested Ifs - 可以通过编码最佳实践来解决吗?

标签 java design-patterns if-statement refactoring

我写了一些代码,只是想知道是否有一种更简洁的方法来做到这一点,以防我必须执行额外的条件?我不想使用嵌套的 if。

有没有办法让它更加面向对象?

  if(!usernameExists)
  {
      if(!username.matches("^[\\pL\\pN]+$") || 
          username.length() < 7 || 
          username.length() > 25)
      {
          usernameValid=false;
          Forms.Main.instructorForm.usernameField.setBackground(Color.red);
          Forms.Main.instructorForm.usernameField.setToolTipText(
             "<html>Only letters & numbers allowed!<br> Length must be between 6 and 26</html>");
      }
      else
      {
          Forms.Main.instructorForm.usernameField.setBackground(Color.white);
          Forms.Main.instructorForm.usernameField.setToolTipText("");
      }
  }
  else
  {
      usernameValid=false;
      Forms.Main.instructorForm.usernameField.setBackground(Color.red);
      Forms.Main.instructorForm.usernameField.setToolTipText(
          "This username already exists!");
  }

最佳答案

我对所呈现的逻辑的正确性不做任何假设,但对于向我展示的内容,我建议您重构并将第一个 boolean 值提取到单独的方法中。

if(!usernameExists) {
    usernameValid = validateUsernameAndSetBackground(username);
} else {
    // rest of code
}


public boolean validateUsernameAndSetBackground(String username) {
    boolean result = true;
    if(!username.matches("^[\\pL\\pN]+$") || username.length() < 7 || username.length() > 25) {
        result = false;
        Forms.Main.instructorForm.usernameField.setBackground(Color.red);
        Forms.Main.instructorForm.usernameField.setToolTipText("<html>Only letters & numbers allowed!<br> Length must be between 6 and 26</html>");
    } else {
        Forms.Main.instructorForm.usernameField.setBackground(Color.white);
        Forms.Main.instructorForm.usernameField.setToolTipText("");
    }
    return result;
}

还有其他重构机会 - 即背景颜色和字段的设置。但这解决了存在大量深层嵌套的条件子句的直接问题。

关于Java Nested Ifs - 可以通过编码最佳实践来解决吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21340316/

相关文章:

java - 请求映射中的通配符

java - 基于字符串的对象创建

design-patterns - 如何在 uml 图中注释设计模式

c# - List<T> 设计模式的名称是什么?如何实现

java - 迭代器重用问题

java - 使用 DecimalFormat 进行格式化会引发异常 - "Cannot format given Object as a Number"

c# - 这是设计模式吗?

bash - 如何 grep 然后在 grep 的特定输出上使 if 语句失败?

Python 对 If-Else 条件语句的求值

java - case-statement 或 if-statement 效率视角