3

我的问题目前与设计有关。我有一个 jsf 参数页面,它提交不同的参数来生成碧玉报告。例如国籍、旅行类型、签证类型、性别等。参数可以是组合。例如,有一次用户可以选择国籍和签证类型并将其他留空,这将使其他人的默认值为 ALL。我从参数页面提交 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 方法。我正在使用许多 if 来查看 id 是否不为零从查找中获取该 id 的描述,否则只需像这样设置它,在 bean setter 内部我正在检查 null。如果为 null,则将其设置为 ALL。

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

4

6 回答 6

1

遵循责任链设计模式。

  • 这将增加代码的可读性和可维护性

  • 减少“if”循环的数量

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

于 2012-09-14T00:09:48.333 回答
1

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

if(lookup.contains(searchParams.getTravelType()))
{
 //code here
} 
于 2012-09-13T10:40:55.150 回答
0

将解析块分成不同的功能。例如。

checkgender(searchParams.getGender(), travelDetailReportBean);

或者

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

取决于你想要它

于 2012-09-13T10:01:14.217 回答
0

您还可以注释需要进行查找的字段,然后使用单个循环在 searchParams 中查看它们的值,如果 id 存在,则进行查找。

于 2012-09-13T13:02:55.390 回答
0

Yes you can put these methods into a utility class and do as Minion has suggested.

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

Putting validation condition in a dto as you have done is not a smart coding move. Is it a generic parameter screen you are trying to make? Mostly, every report should have a separate parameter screen if every report parameters differ. HTH, Ben

于 2012-09-13T10:08:36.763 回答
0

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

private static final String OPTION_ALL = "ALL";

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

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

编辑:概念考虑

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

于 2012-09-13T10:15:20.120 回答