2017-02-02 19 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(); 

Так код работает просто отлично, но я чувствую, некоторые в нем запах кода, особенно при объявлении каждого метода заказа вручную. Есть ли какой-либо шаблон или трюк, который может улучшить мой класс поиска?

ответ

1

Это в том, что вы бы -build- ваш объект запроса путем добавления на дополнительные методами Builder Pattern и т.д.

Я хотел бы посмотреть в Composite Pattern и посмотреть, если вы могли бы реорганизовать свои классы, чтобы использовать это + Builder + возможно Factory Pattern (в зависимости от того, как именно вы планируете на инстанцировании/построении запросов)

другой вариант (хотя я не думаю, что это будет в конечном итоге, как чистый или хороший):

Decorator Patternвозможно стоит посмотреть. Но синтаксис выглядел бы немного иначе ... Вы передали бы объект через (возможно,) фабрику и создали бы запрос путем разбиения компонентов вокруг базового запроса.