2012-03-14 12 views
3

私は以下のパターンが戦略パターンに適していると思っていますが、それが正しいかどうか、もしそうなら、適切に実装する方法がわかりません。コード臭 - どのデザインパターンと実装方法?

カテゴリと並べ替えを受け入れる方法があります。現在、カテゴリーやソートが列挙型であるため、このような何か:

public enum Category{ 
    Hot, 
    New 
} 

public enum Sort{ 
    New, 
    Rising,  
    ThisWeek 
} 

public String getUrl(Category category, Sort sort){ 
    validateCategorySortCombo(category, sort); 
} 

お知らせvalidateCategorySortCombo(カテゴリ、ソート)。まず、カテゴリ+ソートの組み合わせ を有効にする必要があります。一部は無効です。例:

if(Category == "Hot" && Sort == "Rising"){ 
    ThrowInvalidCategorySortCombo("Can't use hot category with rising sort") 
} 

これらの組み合わせが有効であることを確認するためのチェックがいくつかあります。他のカテゴリや種類が導入されているので、私はこのクラスを開いて、開いた/閉じた原理を破るように修正しなければならないので、これはコードの臭いのようです。

2番目のコードの匂いは、カテゴリとソートの両方を調べて、渡されるURLを作成する必要があるときに発生します。現在、私は、switch文のシリーズを使用しています。新しいカテゴリと種類が導入されているよう

String url; 
switch(category){ 
    case Hot: 
    url += "www.site.com/hot/"; 
    case New: 
    url += "www.site.com/new/"; 
} 

switch(sort){ 
    case New: 
    url += "?sort=rising"; 
    case ThisYear: 
    url += "?sort=thisyear"; 
} 

繰り返しますが、私はこのクラスを開き、switch文を更新しなければなりません。質問の

カップル:

  1. 何のデザインパターンは、私の問題を解決するために使用されるだろうか?
  2. デザインパターンの実装についてはどうすればよいですか?

答えて

3

まず、私はあなたには、いくつかのコードを書いているまで、あなたが複数のデザインパターンにオープンあなたの心のままにしておくことをお勧めします。どのパターンが最も効果的かをコードで伝えることができます。手前で1つを選択すると、最良の選択肢ではない可能性のあるパターンを使用するようにコードを強制的に強制しようとする可能性があります。

あなたの状況に役立つ可能性のあるパターンは、戦略とChain of Responsibilityです。

移動を上...

私はあなたが戻って一歩を踏み出すとあなたの設計目標は、あなたは、システムが時間とともに変化することを期待する方法に基づいているものを考え出す必要があると思います。たとえば、新しいカテゴリと並べ替えを追加する予定があるようです。それに基づいて、あなたのデザインが持つ二つの目標は次のようになります。

  1. 新しいソート/カテゴリー
  2. を追加するとき、検証コードの変更を最小限に抑える
新しいソート/カテゴリーを追加するとき、建物のコードをURLに変更を最小限に抑えます

これらの目標から、一般的なアプローチを思いついてください。たとえば、私の考えは...

  1. 各バリデーションをそれぞれのクラスに分けると、新しいカテゴリ/ソートを追加する際に既存のバリデーションアルゴリズムを変更する必要はありません。私がしなければならないのは、新しいバリデーションアルゴリズムを追加するか、それがもはや適用されない場合に既存のバリデーションアルゴリズムを削除することだけです。 (これは過度の攻撃かもしれませんが、検証アルゴリズムがどれほど複雑か分かりません)
  2. カテゴリ/ソートごとに独自のURLを提供する方法が分かっている場合、新しいカテゴリまたはソートは影響を与えません既存のカテゴリや並べ替えのURL表現を取得する機能について説明します。

これで、実装の詳細について考えてみましょう(多くのオプションがあります)。ソート列挙型追加/削除時に変更するには、あなたが常に必要ではないでしょうmySort.getUrlComponent()を呼び出すことができ、このルートを行く

​​

:各値は、すでにのようなので、そのURLコンポーネントを知っているように、たとえば、あなたが列挙型を拡張することができ値。これは特にあなたの第二の懸念に取り組むでしょう。

あなたが構築しているシステムに関するすべてのことを知らないので、最良の実装または一連のデザインパターンを与えることはできませんが、私の考えがここに役立つことを願っています。

あなたの第一の懸念のために
1

並べ替え順序の検証をカテゴリenumに移動するだけです。それはM Platvoetようcategory.isValidSort(sort);

2

を読むように言った:

import java.util.*; 
enum Category { 
    Hot(EnumSet.of(Sort.Rising)),New(EnumSet.of(Sort.ThisWeek,Sort.ThisYear)); 
    Category(EnumSet<Sort> legal) { 
     this.legal.addAll(legal); 
    } 
    boolean isLegal(Sort sort) { 
     return legal.contains(sort); 
    } 
    private final EnumSet<Sort> legal=EnumSet.noneOf(Sort.class); 
} 
enum Sort { 
    New,Rising,ThisWeek,ThisYear; 
} 
public class So9706550 { 
     static boolean isValid(Category category,Sort sort) { 
      return category.isLegal(sort); 
    } 
    public static void main(String[] args) { 
     System.out.println(isValid(Category.Hot,Sort.Rising)); 
     System.out.println(isValid(Category.Hot,Sort.ThisWeek)); 
    } 
} 
0

- あなたは、特に重要なカテゴリーやソートの組成物であるがhashmapことができるバリデータを定義することができます

このマップに有効な組み合わせ[ハードコード/設定ファイル駆動/定期的なリフレッシュなどが考えられます]を先に作成できます。

validateCategorySortComboでは、ハッシュマップに実際にキーが含まれているかどうかを確認できますか?はいの場合は、行きたい。

-

Map<Compositekey<Sort,Category>,Boolean> validOptions = new hashMap.. 

void validateCategorySortCombo(category, sort){ 

    if(validOptions.containskey(category,sort)){ 
    //good to go 
    } 
} 
0

は、私はあなただけの入力を検証するが、それらに基づいてURL文字列を構成していなかったことに気づきました。 Abstract Factoryの古典的なケースのように見えますが、ちょっとひどいかもしれません。 カテゴリの抽象ファミリと具体的な実装SortedCategoriesを持つことができます。 HotRaisedFactoryの例外を、そのカテゴリとそのSortの許容できない組み合わせとして明示的に発生させることができるという利点があります。

関連する問題