2017-02-08 18 views
2

私は、私の設計上の問題について例を挙げて説明しようとしています。switch-caseまたはif-else-bestデザインのcase文?

私は5人の親[1,2,3,4,5]がいるとします。各親にはn人の子供がいます。子供は[a、b、c、d、e、f]のようなものです。私はここで何か

Map<String, String> children = parentDataHolder.getParent(parentType).getChildren(); 
switch(parentType){ 
     case 1: 
      if(partent1.contains(childType1)){ 
      } 
      //Similarly for all child types 
     case 2: 
     case 3: 
     ....... 
} 

を記述しようとしています

、親タイプが固定されています。子タイプは動的です。私は地図を取得しています。各地図について、子供がいるかどうかをチェックする必要があります。もしそうなら、私は子供のタイプに応じて行動しなければならない。

どのデザインが優れていますか?上記のデザインは私のためによく見えません。

アイデア?

EDIT:

parentHolderは、親タイプと子タイプを取得するためのメソッドを持つオブジェクトです。 例えば:私はこのJSONを受け取ったら、私はMapで子供値を格納していますし、私はparentTypeを取得していますし、状態を切り替えるために渡す

​​

スイッチのケースの中で、子供用のロジックを適用する必要があります。上の例には2つの子があります。その他のケースでは、parentType 1の子としてa、b、cが使用されます。だからそれは一般的なものでなければならない。

+2

これはあまりに抽象的であいまいです。 'Parent'と' Child'のクラス定義を表示し、 'parentType'が何であるかを説明してください。質問は現在の状態では答えることができません。 –

+0

@ジムガリソン私は編集中です。お待ちください。 –

+0

それぞれの親/子の組み合わせが別々のロジックによって処理される場合、あなたが持っているものはすべてIMOで悪くないです。そうであれば、そのような論理を指定することは避けられません。 –

答えて

1

switchif-elseよりも読みやすくなっています。

最初の要件分析中に見つかった場合や後で要件が変更され、新しいケースが追加された場合は、これらの両方(elseとswitchの場合)を避ける必要があります。

このような場合、私たちはopen close principleを尊重する必要があります。 Swichのcase文は、ocpが脆弱であるだけでなく、エラーが発生しやすいため、新しいケースを追加したくない場合に問題が発生する可能性があります。

このようなシナリオでは、抽象化によってケースを処理する必要があります(変更可能なものを禁じることによって、変更から自分自身を保護してください)。

このような場合に(抽象的な)親クラスを定義することができ、それぞれのケースを別々のサブクラスにマッピングできます。 ケースx:// contents;があるとします。内容は、親クラスで持つことができる抽象メソッドの実装に置くことができます。新しいケースが追加された場合、簡単に新しいクラスを定義して実装を提供することができます。クライアントコードは、抽象的な親クラスと実行時に注入できるコンクリートクラスにのみ依存する必要があります。