1

リスト メソッドでは、クライアント側からいくつかのフィルターを渡します。現在、入ってくるパラメーターに基づいて実行される if/else ブロックの長いリストがあります。

これにアプローチするより良い方法があるかどうか疑問に思っていますか?

def list () {
  println params
  def list = []
  if (params["Column1"] != null) {
    list = Mymodel.createCriteria().listDistinct {
      eq("somecolumn", params["Column1"]);
    }
  }
  else if (params["Column2"] != null) {
    list = Mymodel.createCriteria().list {
      eq("someothercolumn", params["Column2"]);
    }
  }
  else if (params["filter"] == "failed") { 
     list = MyModel.createCriteria().list {
       eq("status", false);
     }
  }
  return list as JSON
}

以下は、いくつかのリクエストに対して取得しているパラメーターです。

[Column1:somevalue, action:[GET:list], controller:somecontroller]
[Somecolumn:someothervalue, action:[GET:list], controller:somecontroller]

この問題が手に負えなくなる前に解決するために使用できるパターンはありますか

4

1 に答える 1

3

関連するパターンはないと思いますが、Elvis 演算子を使用して基準を作成する冗長性を取り除くことで、コードを数行にドリルダウンできます。

def list() {
    def list = []
    def someColumnValue = params.Column1 ?: params.Column2 ?: null
    def statusValue     = params.filter == 'failed'
    list = Mymodel.withCriteria{ //can also use createCriteria
        if(someColumnValue) {
            eq("somecolumn", someColumnValue)
        } else if(statusValue) {
            eq("status", !statusValue)   
        }
    }
    list as JSON
}

パラメータの数が増えると、次のようなものを使用できます

def someColumnValue = params.Column1 ?: 
                      params.Column2 ?: 
                      params.Column3 ?: 
                      params.Column4 ?: 
                      null

関連するパラメーターが 1 つだけの場合は、if else の代わりに switch case ブロックを効果的に使用できます。

于 2013-08-24T04:27:04.983 に答える