当回答ではコードの行数は減らないので
コードが肥大化してしまいどうにかできないものか
というご質問の意図からは外れてしまうかも知れませんが、
Strategyパターン(だと思いますw)を使用すれば、検索条件の切り替えと個々の条件の指定を分離でき、見通しのよいコードにはなると思います。
まず、以下のようにExpressionBuilder
インターフェースと、その内部クラスとしてFactory
クラスを定義します。
ExpressionBuilder
インターフェースはStrategyパターンにおける"Strategy"で、build
メソッドに渡されたExpressionList
オブジェクトに検索条件をセットします。
Factory
クラスのgetBuilder
メソッドは、引数で受け取った文字列を元に
それぞれの検索条件に対応したExpressionBuilder
インターフェースの実装クラスをreturn
します。
java
1public interface ExpressionBuilder {
2
3 <T> ExpressionList<T> build(ExpressionList<T> exp);
4
5 public static class Factory {
6
7 public static ExpressionBuilder getBuilder(String area) {
8 if (area.indexOf("区") != -1) { // ”区”の文字が含まれているか否か
9 if (area.equals("その他23区")) {
10 // その他23区の検索条件を生成するクラス
11 return new Other23kuExpressionBuilder(area);
12 } else {
13 // 特定の区(新宿区、渋谷区など)の検索条件を生成するクラス
14 return new Specific23kuExpressionBuilder(area);
15 }
16 } else if (area.equals("その他東京都")) {
17 // その他東京都の検索条件を生成するクラス
18 return new Not23kuExpressionBuilder(area);
19 } else {
20 // 全国の検索条件を生成するクラス
21 return new NationwideExpressionBuilder(area);
22 }
23 }
24 }
25}
getBuilderメソッドから返却しているExpressionBuilderインターフェースの実装クラスは、
例えば以下のような感じになります。
java
13
4class Specific23kuExpressionBuilder implements ExpressionBuilder {
5
6 private final String area;
7
8 Specific23kuExpressionBuilder(String area) {
9 this.area = area;
10 }
11
12 @Override
13 public <T> ExpressionList<T> build(ExpressionList<T> exp) {
14 return exp
15 .eq("prefectures", "東京都")
16 .eq("city", area);
17 }
18
19}
ちなみに「その他23区」の検索条件は、
.ne("city" , "渋谷区").ne("city" , "新宿区")...
より
.not(Expr.in("city", ...))
に、定数として定義した「特定の23区」をin
メソッドの第二引数に渡すほうが私は可読性が向上するかと思いますが、いかがでしょうか?
(EBeanは不勉強なので、同じ動作結果になるか自信はありませんが。。)
java
1class Other23kuExpressionBuilder implements ExpressionBuilder {
2
3 // 特定の23区
4 private static final String[] SPECIFIC_23KU = new String[] {
5 "渋谷区",
6 "新宿区",
7 ...
8 };
9
10 private final String area;
11
12 Other23kuExpressionBuilder(String area) {
13 this.area = area;
14 }
15
16 @Override
17 public <T> ExpressionList<T> build(ExpressionList<T> exp) {
18 return exp
19 .eq("prefectures", "東京都")
20 .not(Expr.in("city", SPECIFIC_23KU));
21 }
22
23}
こうしておくと、実際に検索を実行する部分はたったこれだけの行数になります。
java
1ExpressionBuilder builder = ExpressionBuilder.Factory.getBuilder("豊島区");
2
3ExpressionList<?> exp = ebeanServer.find(...).select(...).where();
4builder.build(exp).findList();
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/01 01:49