2011-10-25 24 views
0

我有一個網頁列表,每個網頁都有關於產品的列表。在以前的系統中,我們使用if/else語句的每一頁進行分類,如下所示:用於分類東西的設計模式

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

所以分類是通過字符串關鍵字匹配完成。由於現在我們正在制定一個新的系統,我想確保有可擴展性的空間。我以爲每個分類都有一個單獨的課程太重了。

我想也許有一種方法,每個會更好,就像有一個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;我經常使用lambda作爲值的這種模式,它提供了相當多的靈活性。使用像patterns這樣的查找表也具有在運行時易於編輯的優點;您甚至可以從數據庫或配置文件加載查找表。 Array表單幾乎是Rails處理其路由表的方式。

+0

謝謝。在性能方面,數組,散列和select-case之間有一個主要區別?我也可以使用lambda進入select-case/if語句嗎? – lulalala

+0

@lulalala:一如既往的表現取決於你真實情況的具體情況。我懷疑'case'會最快,而Array版本會比Hash稍微快一點(但是基準測試是唯一知道的方法)。你可以用'case'來使用lambda表達式,但是不會有太多的意義,因爲它無論如何都是靜態代碼。在Array/Hash情況下使用lambda表達式是有意義的,因爲您正在用解釋數據替換靜態邏輯,而lambda表達式是將小塊代碼轉換爲數據的標準方式。 –

相關問題