2017-04-12 25 views
1

私が達成しようとしているのは、一致条件に複数のブールオプションをマッチングさせることです。これまでのところ私のデザインです。私はそれに満足していない。どのように条件に合致する複数のオプションを効率的に書いていますか?または、複数のオプションにメジャーコードの匂いがある?特定の条件に複数のオプションを一致させる

class Condition 
{ 
    Boolean a; // Optional 
    Boolean b; // Optional 
    Boolean c; // Optional 
    boolean d; // mandatory 

    Condition(Boolean a, Boolean b, Boolean c, boolean d) 
    { 
     this.a = a; 
     this.b = b; 
     this.c = c; 
     this.d = d; 
    } 

    public boolean matches(Boolean a, Boolean b, Boolean c, boolean b) 
    { 
     return (a == null || this.a == a) 
       && (b == null || this.b == b) 
       && (c == null || this.c == c) 
       && (this.b == b); 
    } 

    public static void main(String args[]) { 
     Condition c1 = new Condition(true, true, null, true); 
     Condition c2 = new Condition(null, null, false, false); 
     Condition c3 = new Condition(false, true, null, true); 
     Condition[] conditions = new Condition[]{c1,c2,c3}; 

     for (Condition con : conditions) { 
      Boolean a = someTestLogic1(...); 
      Boolean b = someTestLogic2(...); 
      Boolean c = someTestLogic3(...); 
      boolean d = someTestLogicMandatory(...); 

      if (con.matches(a,b,c,d)) { 
       // found the matching condition 
       return con; 
      } 
     }    
    } 
} 
+0

明確にすることができますか?このコードのどの部分が特に不満ですか? –

+0

私は、より効率的な(スピード)とエレガントな方法(少ない冗長)が少ないコンストラクタparamsで同じことを達成していると思うし、すべての条件のループと最初の一致するものを見つけるために壊れて好きではない – delita

+0

メソッドは 'someTestLogic1()'などを 'for'ループの中で呼び出します。そうですか?理由は、これらのメソッドはすべてゼロ引数メソッドのように見えますが、どのようにdiffを返すのでしょうか? 'ブール値'?私は彼らがループの外にいることができますか? – developer

答えて

0

私はより効率的な(スピード)が存在する疑いがあるとエレガントな方法(以下 冗長)低いコンストラクタのparamsと同じことを達成する、と はまた、私はすべての条件のループを好きではないし、最初の一致するものを見つけて を見つけてください。

は、(1)null O渡す良い方法ではないインスタンスを作成するためにコンストラクタの呼び出しを満たす:

は、以下のようなあなたの現在のコードといくつかの問題が明らかにあります。

(2)同じタイプの2つのオブジェクトの等価性をチェックしていても、equals()メソッドを使用していません。

ので、に答える、上記の問題については、以下のとおりです。

(1)あなたは、最初の問題に

を解決するためにBuilder patternを使用することができます(2)明らかに、あなたはequals()hashcode()メソッドをオーバーライドする必要がありますjava.lang.Objectから2つのオブジェクトの等価と一致するようにします。 (彼らはあなたのコアロジック一部であるように)


重要な点は、これら二つの溶液が完全ifチェックまたは状態を回避する、すなわち、あなたの冗長性を解決することができない可能性があることです。しかし、これらの修正は正しい方向にあなたを導き、あなたのコードをより構造化して(あまり混乱しないように)、容易に読むことができます&が維持されます。

関連する問題