2016-01-21 14 views
5

私は、入力がパラメータ(例えばA、B、C、D)とデータ(XYZ)を設定するユースケースを持っています。パラメータ(A、B、C、D)に基づいて、データ(XYZ)を処理して返信する必要があります。処理ロジックは、パラメータに基づいて一意または共通にすることができます(A、C、Dの場合は#2、B、C、Dなどの場合は#2を実行します)。私はまた、処理の順序を維持する必要があります。私のユースケースに使用するデザインパターンは何ですか?

現在の実装はif-elseループに基づいています。私は責任の連鎖、パイプラインの設計パターンを見ています。しかし、上記の作業のための他の適切なデザインパターンはありますか?

I/P:A = {A1、A2、A3}、B = {B1、B2、B3}、C = {C1、C2、C3}、Dのif-elseブロックを使用

例= {D1、D2、D3}及びXYZ = "foo" という

if (A == A1) 
{ 
    //dosomething-A1 

    if (B == B1) 
    { 
     //dosomething-B1 

     if (C == C2) 
     { 
      //dosomething-C2 
     } 
    } 
    else if (B == B2) 
    { 
     //dosomething-B2 
    } 

    if (C == C2) 
    { 
     //dosomething-C2 

     if (D == D1) 
     { 
      //dosomething-D1 
     } 
     else if (D == D3) 
     { 
      //dosomething-D3 
     } 
    } 
} 
else if (A == A2) 
{ 
    //dosomething-A2 
    ... 
} 
else if (A == A3) 
{ 
    //dosomething-A3 
    ... 
} 
+3

downvoteするつもりなら、理由を残してください。そして、@ジョシ、私は質問を理解するが、あなたが与えたユースケースは非常に抽象的なです。もっと詳細を伝えることができますか、これまでのコードを投稿することはできますか? –

+0

私はdownvoteはこれが意見に基づいているからだと思う。トピック:私はこれに答えるためにもっと多くの情報が必要だと思います。データ処理は各パラメータに対して順次実行されるか、またはすべてが一度に実行されますか?パラメータはお互いに依存していますか?そこに4つ以上のパラメータがありますか?匿名クラスはここでは多くの問題を解決できますが、パターンは必要ありません。 –

+1

私は、デザインパターン(または一般的なデザイン)に関する議論は意見に基づくと思います。それでも重要な議論です:-) –

答えて

4

チェーンは、それが再利用される場合に、非常によくこれに合うように思われます。マップに格納されたハンドラを使用することもできます。ここで、キーは適切なパラメータ値です。これは、パラメータとして渡される可能な値の限られたセットに対してうまく機能します。

handlers.get(a).handle(XYZ) 

このように、あなたは完全に無関心です。しかし、これもまたすべての目的に合っているわけではありません。

3

コマンドパターンのようなものを探します。パラメータデータに基づいて処理する必要があります。内部実装を外部に公開しないでください。したがって、公開されたインタフェースの観点からは、パラメータに基づいて実行するメソッドを識別するパラメータとデータおよびコマンドパターンの必要性が必要です。

0

実際の単語の大文字小文字がないと、言い難いですが、おそらく、クラスの良い階層でif/elseツリーのサイズを減らすことができます。

多態性により、オブジェクト指向性が向上します。

0

if-then-elseステートメントのリストは、rule-based systemを思い出させます。ルールベースは、実質的には、形式がCondition -> Actionのルールを含むデータベースです。あなたは、単にRunnableを使用することができActionについて

@FunctionalInterface 
interface Condition { 
    boolean matches(A a, B b, C c, D d); 
} 

:Javaの8条件の実装は、このようになります。

static void evaluate(A a, B b, C c, D d) { 
     BASE.entrySet().stream() 
      .filter((entry) -> entry.getKey().matches(a, b, c, d)) 
      .forEach((e) -> e.getValue().run()); 
} 

あなたはこのようにそれを呼び出すことができます::

static final Map<Condition, Runnable> BASE = 
     ImmutableMap.<Condition, Runnable>builder() 
      .put((a, b, c, d) -> a == A1,() -> doSomethingA1()) 
      .put((a, b, c, d) -> a == A1 && b == B1,() -> doSomethingB1()) 
      .put((a, b, c, d) -> a == A1 && b == B1 && c == C2,() -> doSomethingC2()) 
      .put((a, b, c, d) -> a == A1 && b == B2,() -> doSomethingB2()) 
      .put((a, b, c, d) -> c == C2,() -> doSomethingC2()) 
      .put((a, b, c, d) -> c == C2 && d == D1,() -> doSomethingD1()) 
      .put((a, b, c, d) -> c == C2 && d == D3,() -> doSomethingD3()) 
      .put((a, b, c, d) -> a == A2,() -> doSomethingA2()) 
      .put((a, b, c, d) -> a == A3,() -> doSomethingA3()) 
      .build(); 

は、あなたは、単に次のメソッドを定義することができ、このルールベースを使用するには、次のようにあなたのコードに基づいて、ルールベースの定義を定義することができ

evaluate(A1, B1, null, null); 
// executes doSomethingA1() and doSomethingB1() 
関連する問題