摆脱太多的if。什么是更好的方法?

时间:2012-09-13 09:52:19

标签: java if-statement

我的问题目前与设计有关。我有一个jsf参数页面,它提交 生成jasper报告的不同参数。例如。国籍,旅行类型,签证类型, 性别等。参数可以是组合。例如。用户可以一次选择 国籍和visatype并留下其他人的空白,这将使其他人的默认值 全部。我从参数页面提交了id。如果我没有选择任何用户 在setter方法中手动将值设置为ALL。这是我托管的快照 bean方法和POJO。

private ReportBean generateReportBean(TravelDetailSearchParams searchParams, String reportPath){
    TravelDetailReportBean travelDetailReportBean = new TravelDetailReportBean();
    if(searchParams.getGender().getId() != 0){
      for(Lookup lookup : gender){
          if(lookup.getId() == searchParams.getGender().getId()){
            travelDetailReportBean.setGender(lookup.getDescEnglish());
            break ;
          }
      }
    }
    else{
      travelDetailReportBean.setGender(searchParams.getGender().getDescEnglish());
    }

    if(searchParams.getTravelType().getId() != 0){
      for(Lookup lookup : travelType){
        if(lookup.getId() == searchParams.getTravelType().getId()){
          travelDetailReportBean.setTravelType(lookup.getDescEnglish());
          break ;
        }
      }
    }
    else{
      travelDetailReportBean.setTravelType(searchParams.getTravelType().getDescEnglish());
    }

    if(searchParams.getPort().getId() != 0){
      for(Lookup lookup : port){
        if(lookup.getId() == searchParams.getPort().getId()){
          travelDetailReportBean.setPort(lookup.getDescEnglish());
          break ;
        }
      }
    }
    else{
      travelDetailReportBean.setPort(searchParams.getPort().getDescEnglish());
    }

    if(searchParams.getNationality().getId() != 0){
      for(Lookup lookup : country){
        if(lookup.getId() == searchParams.getNationality().getId()){
          travelDetailReportBean.setCountry(lookup.getDescEnglish());
          break ;
        }
      }
    }
    else{
      travelDetailReportBean.setCountry(searchParams.getNationality().getDescEnglish());
    }
    if(searchParams.getVisaType().getId() != 0){
      for(Lookup lookup : visaType){
        if(lookup.getId() == searchParams.getVisaType().getId()){
          travelDetailReportBean.setVisaType(lookup.getDescEnglish());
          break ;
        }
      }
    }
    else{
      travelDetailReportBean.setVisaType(searchParams.getVisaType().getDescEnglish());
    }
    logger.debug("nationality: " + travelDetailReportBean.getCountry());
    logger.debug("travelType: " + travelDetailReportBean.getTravelType());
    logger.debug("visatype: " + travelDetailReportBean.getVisaType());
    logger.debug("port: " + travelDetailReportBean.getPort());
    travelDetailReportBean.setReportName(BorderEntryExitConstants.TRAVEL_DETAIL_REPORT_NAME);
    travelDetailReportBean.setReportPath(reportPath);
    return travelDetailReportBean ;
  }

POJO代码如下所示

public class TravelDetailReportBean extends ConcreteReportBean {
  private String gender ;
  private String travelType ;
  private String port ;
  private String country ;
  private String visaType;

  public String getGender() {
    return gender;
  }

  public void setGender(String gender) {
    if(gender == null || gender.equals("")){
      this.gender="ALL";
    }
    else{
    this.gender = gender;
    }
  }

  public String getTravelType() {
    return travelType;
  }

  public void setTravelType(String travelType) {
    if(travelType == null || travelType.equals("")){
      this.travelType ="ALL";
    }
    else{
    this.travelType = travelType;
    }
  }

  public String getPort() {
    return port;
  }

  public void setPort(String port) {
    if(port == null || port.equals("")){
      this.port ="ALL";
    }
    else{
      this.port = port;
    }
  }

  public String getCountry() {
    return country;
  }

  public void setCountry(String country) {
    if(country == null || country.equals("")){
      this.country ="ALL";
    }
    else{
    this.country = country;
    }
  }

  public String getVisaType() {
    return visaType;
  }

  public void setVisaType(String visaType) {
    if(visaType == null || visaType.equals("")){
      this.visaType ="ALL";
    }
    else{
    this.visaType = visaType;
    }
  }
}

问题是generateReportBean方法。我正在向很多人提出如果不知道id是不是 零从查找中获取该id的描述,否则只需将其设置为内部bean 我正在检查null的setter。如果为null,则将其设置为ALL。

我的问题是目前我的参数很少,如果可以使用一段时间,那会是什么 如果搜索参数增长。如果它看起来很难看。有人可以建议我一个更好的方法 摆脱这些如果是。 谢谢, 彼得

6 个答案:

答案 0 :(得分:1)

如果Lookup是对象列表,那么您可以提供基于id的等于方法,然后您可以直接执行

if(lookup.contains(searchParams.getTravelType()))
{
 //code here
} 

答案 1 :(得分:1)

遵循责任链设计模式。

  • 这将提高代码的可读性和可维护性

  • 减少“if”循环次数

参考:http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern

答案 2 :(得分:0)

将解析部分划分为不同的功能。例如

checkgender(searchParams.getGender(), travelDetailReportBean);

travelDetailReportBean.setGender(checkgender(searchParams.getGender()));

取决于你想要的方式

答案 3 :(得分:0)

是的,您可以将这些方法放入实用程序类中,并按照Minion的建议进行操作。

travelDetailReportBean.setGender(ParamUtil.checkGender(searchParams.getGender());

如你所做的那样将验证条件放在dto中并不是一个聪明的编码动作。它是通用的吗? 你想要制作的参数屏幕?通常,每个报告都应该有一个单独的参数 屏幕,如果每个报告参数不同 HTH, 本

答案 4 :(得分:0)

对于空/空字符串的IMHO测试太常见了,无法手动编码。我喜欢使用StringUtils中的Apache Commons lang来简化它。结合Java的?运算符,您可以更清楚地编写它:

private static final String OPTION_ALL = "ALL";

public void setGender(String gender) {
    this.gender = StringUtils.isEmpty(gender) ? OPTION_ALL : gender;
}

当然,如果您拥有大量字段,则通用方法可能是合理的。

编辑:概念性考虑

正如我所见,您在类setter方法中执行值检查。我建议不要这样做:我希望setter只能 为实例变量赋值。如果他们做得更多,这可能会导致混乱。您可能正在使用该类来参数化某些搜索功能,因此在执行该搜索之前,确保非空成员值的更好位置是正确的。

答案 5 :(得分:0)

您也可以注释执行查找所需的字段,然后使用单个循环在searchParams中查看其值,如果存在id,则执行查找。