2011-10-25 5 views
0

나는 제품에 관한 각각의 웹 페이지 목록을 가지고 있습니다.물건을 분류하는 디자인 패턴

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

그래서 분류 문자열 키워드 검색하면됩니다 :/else 문은 다음과 같이 각 페이지를 분류 할 경우 이전 시스템에서 우리는을 사용했다. 이제 우리는 새로운 시스템을 만들고 있으므로 확장 성을위한 공간이 있는지 확인하고 싶습니다. 나는 각 classfication에 대해 별도의 클래스를 갖는 것이 너무 무거울 것이라고 생각했습니다.

그리고 나는 각각에 대해 더 좋은 방법이 있다고 생각합니다. gift?()pet?()이있는 것 같습니다. 그러나 나는 이것을 수행하는 것이 논리에서 무언가를 하드 코딩한다는 것을 의미한다고 생각한다. 이런 종류의 분류를하기위한 디자인 패턴이 있습니까?

답변

1

그런 종류의 일을하는 데는 여러 가지 방법이 있습니다. 여기에 몇 가지 아이디어가 있습니다.

당신이 사용할 수있는 case :

if의 당신의 더미 생각이야보다 다르지 않다
case title 
when /pet/ 
    13 
when /therapy|SPA|massaging|salon|hotspring/ 
    5 
when /present|gift/ 
    4 
#... 

.

당신은 해시로 규칙을 넣어 수 :

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) 

또는 배열 : patterns에서

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) 

값은 무엇이든 될 수있다 : 숫자, 문자열, 다른 클래스의 인스턴스, 또는 심지어 Procs; 나는이 패턴을 람다 (lambda)와 함께 꽤 자주 사용한다. 꽤 유연하다. patterns과 같은 조회 테이블을 사용하면 런타임에 쉽게 편집 할 수 있다는 이점이 있습니다. 데이터베이스 또는 구성 파일에서 찾아보기 테이블을로드 할 수도 있습니다. Array 폼은 Rails가 라우팅 테이블을 처리하는 방법과 거의 같습니다.

+0

감사합니다. 성능 측면에서 배열, 해시 및 선택 사례간에 큰 차이점이 있습니까? 또한 select-case/if 문에 lambda를 사용할 것인가? – lulalala

+0

@lulalala : 성능은 항상 그렇듯이 실제 상황에 따라 다릅니다. 나는'case'가 가장 빠를 것이고 Array 버전이 Hash보다 약간 더 빠를 것이라고 생각한다. (그러나 벤치마킹 만이 알 수있다.) 당신은'case'와 함께 lambdas를 사용할 수 있습니다 만, 어쨌든 모든 정적 코드이므로 많은 점이 없습니다. Array/Hash 케이스에서 lambdas를 사용하는 것은 정적 논리를 해석 된 데이터로 바꾸고 람다 (lambdas)를 작은 덩어리의 코드를 데이터로 바꾸는 표준 방법이므로 의미가 있습니다. –