2017-02-02 7 views
1

친구들. 현재 복잡한 검색을하고 있습니다. 나는 다음 학급을 가지고있다 :검색 클래스입니다. 패턴 조언 요청

App\Search\Search 
App\Search\OrderBy\Relevance 
App\Search\OrderBy\Priority 
App\Search\OrderBy\WordMatch 

App \ Search \ Search는 주요 검색 클래스이다. \ OrderBy의 모든 클래스는 쿼리 빌더 객체를 참조로 가져 와서 일부 로직을 적용합니다. 여기

는 일부 코드 샘플은 다음과 같습니다

//App\Search\Search 
Class Search { 

protected $query; 

    public function __construct($phrase) 
    { 
     $this->phrase = $phrase; 
     $this->query = App\Airport::newQuery(); 
    } 

    public function orderByRelevance() 
    { 
     OrderBy\Relevance::apply($this->query); 
     return $this; 
    } 

    public function orderByPriority() 
    { 
     OrderBy\Priority::apply($this->query); 
     return $this; 
    } 

    public function orderByWordMatch() 
    { 
     OrderBy\WordMatch::apply($this->query); 
     return $this; 
    } 
} 

주요 아이디어는 조건과 같이 쿼리에 여러 순서를 적용하는 것입니다 :

$search = new Search('Berlin'); 
$search->orderByRelevance()->orderByPriority()->get(); 

그래서 코드가 잘 작동,하지만 난 어떤 느낌 특히 주문 방법을 수동으로 선언 할 때 냄새가납니다. 검색 패턴을 개선 할 수있는 패턴이나 트릭이 있습니까? 이것은 당신이 추가 방법에 추가하여 쿼리 개체를 -build- 것이라고에서 Builder Pattern입니다

답변

1

나는 Composite Pattern 조사하고 활용하는 클래스를 리팩토링 수 있는지 것

Decorator Pattern : 그것은 (나는 그것이 깨끗 또는 친절 끝날 것이라고 생각하지 않습니다하지만)

또 다른 대안을 (당신이/쿼리를 구축 인스턴스화 계획 방법을 정확하게에 따라) 빌더 + 가능 Factory Pattern을 + 수도 있습니다.도 살펴볼 가치가 있습니다. 그러나 구문은 약간 다르게 보일 것입니다 ... (아마도) 공장을 통해 객체를 전달하고 기본 쿼리를 중심으로 구성 요소를 겹쳐서 쿼리를 작성합니다.