java - 如何在if条件下重构复杂的表达式?

标签 java if-statement enums refactoring polymorphism

例子如下:

if (folderInfoRecord.getValueRequired()
    && ((!folderInfoData.getInfoType().equals(InfoType.NUMERIC) 
    && !folderInfoData.getInfoType().equals(InfoType.DATE) 
    && !folderInfoData.getInfoType().equals(InfoType.CHOOSE) 
    && StringUtils.isBlank(folderInfoRecord.getInfoValue(), true))
    || (folderInfoData.getInfoType().equals(InfoType.NUMERIC) 
    && folderInfoRecord.getInfoValueNumeric() == null) 
    || (folderInfoData.getInfoType().equals(InfoType.DATE) 
    && folderInfoRecord.getInfoValueDateTime() == null) 
    || (folderInfoData.getInfoType().equals(InfoType.CHOOSE) 
    && folderInfoData.getSelectedInfoRole() == null))) {
        showNotification(pageResourceBundle.getText("JS_ALERT_FIELD_REQUIRED"));
        return;
}


谁能告诉我如果条件可以如何优化呢?

最佳答案

真正的解决方案是Replace Conditional with Polymorphism。这里最大的问题是标志是编码类型。



我了解它可能需要大量的工作,您可能无法这样做。这是一种变通方法,可以使代码的意图更加清晰,并希望代码更具可读性:

if (folderInfoRecord.getValueRequired() && 
    Checker.isMissing(folderInfoData, folderInfoRecord) 
{
        showNotification(pageResourceBundle.getText("JS_ALERT_FIELD_REQUIRED"));
        return;
}


(下面的代码甚至可能无法编译,请检查原始代码。)

final class Checker {

  InfoType         it;
  FolderInfoRecord fir;
  FolderInfoData   fid;

  private Checker(FolderInfoData fid, FolderInfoRecord fir) {
    this.it  = fid.getInfoType();
    this.fid = fid;
    this.fir = fir;
  }

  static public boolean isMissing(FolderInfoData fid, FolderInfoRecord fir) {

      return (new Checker(fid, fir)).isMissing();
  }

  private boolean isMissing() {

     return wrongAsNumeric() && wrongAsDate() && wrongAsChoose() && isBlank();
  }

  private boolean wrongAsNumeric() {

    return it.equals(InfoType.NUMERIC) && (fir.getInfoValueNumeric() == null);
  }

  private boolean wrongAsDate() {

    return it.equals(InfoType.DATE) && (fir.getInfoValueNumeric() == null);
  }

  private boolean wrongAsChoose() {

    return it.equals(InfoType.CHOOSE) && folderInfoData.getSelectedInfoRole() == null)
  }

  private boolean isBlank() {

    return StringUtils.isBlank(folderInfoRecord.getInfoValue(), true);
  }  
}


与其他建议的解决方案不同,此代码可重复使用:如果要在代码的其他位置执行此检查,则只需调用Checker.isMissing()

关于java - 如何在if条件下重构复杂的表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21274858/

相关文章:

java - 等同于Hibernate中的ResultSet.getRow()

MySQL:其中价格 < 50,总和(价格 +14)

javascript - addEventListener和if语句在按钮上单击

java - Java。使用枚举中的泛型获取特定类型

c# - 变形此序列的最优雅方式

java - 向数组添加边框

java多线程学习源码

java - 在Java jdbc代码的同一查询中使用return关键字更新和返回Updated列

PHP/MySQL - 停止运行相同查询的 Foreach

asp.net-mvc - 将枚举参数从 Ajax Jquery 传递到 MVC web api