3

私の問題は現在デザインに関連しています。jsfパラメーターページがあり、さまざまなパラメーターを送信してjasperレポートを生成します。例:国籍、旅行タイプ、ビザタイプ、性別など。パラメータは組み合わせにすることができます。たとえば、一度にユーザーは国籍とビザタイプを選択し、他の人を空白のままにして、他の人のデフォルトを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メソッドです。IDがゼロでないかどうかを確認するために多くのifを使用しています。それ以外の場合は、ルックアップからそのIDの説明を取得します。それ以外の場合は、そのように設定し、Beanセッター内でnullをチェックしています。nullの場合はALLに設定します。

私の問題は、現在、パラメータがほとんどないことです。これらのパラメータはしばらくは機能しますが、検索パラメータが大きくなるとどうなりますか。もしそうなら醜く見えるでしょう。誰かが私にこれらを取り除くためのより良いアプローチを提案できますか?ありがとう、ピーター

4

6 に答える 6

1

ChainofResponsibilityのデザインパターンに従ってください。

  • これにより、コードの可読性と保守性が向上します

  • 「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

はい、これらのメソッドをユーティリティ クラスに入れて、Minion が提案したように実行できます。

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

あなたが行ったように検証条件をdtoに入れることは、スマートなコーディングの動きではありません。作ろうとしているのはジェネリックパラメータ画面ですか?ほとんどの場合、すべてのレポート パラメータが異なる場合は、すべてのレポートに個別のパラメータ画面が必要です。HTH、ベン

于 2012-09-13T10:08:36.763 に答える
0

検索を行う必要があるフィールドに注釈を付けてから、単一のループを使用して searchParams の値を確認し、id が存在する場合は検索を行うこともできます。

于 2012-09-13T13:02:55.390 に答える
0

空/null文字列のIMHOテストは、手動でコーディングするにはあまりにも一般的です。単純化するために、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;
}

もちろん、多数のフィールドがある場合は、一般的なアプローチが正当化される場合があります。

編集: 概念的な考察

ご覧のとおり、クラスのセッター メソッドで値のチェックを実行します。そうしないことをお勧めします。セッターはインスタンス変数にのみ値を割り当てることを期待しています。それ以上のことをすると、混乱を招く可能性があります。クラスを使用して検索機能をパラメータ化する可能性があるため、その検索を実行する直前に空でないメンバー値を確保するためのより良い場所になります。

于 2012-09-13T10:15:20.120 に答える