2011-10-25 8 views
0

私は製品に関するウェブページのリストを持っています。物を分類するためのデザインパターン

if title =~ /pet/ 
    13 
elsif title =~ /therapy|SPA|massaging|salon|hotspring/ 
    5 
elsif title =~ /present|gift/ 
    4 
# and so on... 
end 

ので、分類は、文字列キーワードマッチングによって行われます。以前のシステムでは、我々は次のように、各ページを分類する他/ if文を使用していました。今は新しいシステムを作っているので、私は拡張性のための部屋があることを確認したい。私はクラス分けごとに別々のクラスを持つことはあまりにも重いと考えていました。

そして私は多分、それぞれが良いと思う方法があると思います。gift?()pet?()のようにしてください。しかし、私はこれをやっていることも論理の中で何かをハードコーディングすることを意味すると思います。この種の分類を行うためのデザインパターンはありますか?

答えて

1

そのようなことを行うにはさまざまな方法があります。ここにいくつかのアイデアがあります。

あなたはcaseを使用することができます。

case title 
when /pet/ 
    13 
when /therapy|SPA|massaging|salon|hotspring/ 
    5 
when /present|gift/ 
    4 
#... 

しかしif秒のあなたの山よりも、異なるないことを。

あなたはハッシュにあなたのルールを置くことができます:

patterns = { 
    /pet/ => 13, 
    /therapy|SPA|massaging|salon|hotspring/ => 5, 
    /present|gift/ => 4, 
    # ... 
} 
match = patterns.find { |re, v| title.match(re) } 
match = match.last if(match) 

またはArray:

patterns = [ 
    [ /pet/, 13 ], 
    [ /therapy|SPA|massaging|salon|hotspring/, 5 ], 
    [ /present|gift/, 4 ], 
    # ... 
} 
match = patterns.find { |p| title.match(p.first) } 
match = match.last if(match) 

patternsの値は何もすることができますいくつかの他のクラスの数値、文字列、インスタンス、またはさらにProcs;私は値としてラムダとこのパターンを頻繁に使用します、それはかなりの柔軟性を提供します。 patternsのようなルックアップテーブルを使用すると、実行時に編集しやすいという利点もあります。ルックアップテーブルをデータベースまたは設定ファイルから読み込むことさえできます。 Arrayフォームは、Railsがルーティングテーブルをどのように処理するかとほとんど同じです。

+0

ありがとうございました。パフォーマンスに関しては、配列、ハッシュ、および選択ケースの間に大きな違いがありますか?また、select-case/ifステートメントにlambdaを使用しますか? – lulalala

+0

@lulalala:パフォーマンスは、いつものように、あなたの実際の状況によって異なります。私は、 'case'が最も速く、ArrayバージョンがHashよりも少し速いと思うだろう(ただし、ベンチマークだけが知っている)。とにかくすべての静的コードであるので、あなたは 'case'でlambdasを使うことができますが、多くの点はありません。 Array/Hashのケースではlambdaを使用するのが理にかなっています。なぜなら、静的なロジックを解釈されたデータに置き換えているからであり、lambdaは小さなコードをデータに変換する標準的な方法です。 –

関連する問題