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

ので、コードがうまく動作しますが、私はいくつかを感じます特に、すべての注文メソッドを手動で宣言する際には、そのコードの臭いがあります。 Searchクラスを改善するパターンやトリックはありますか?これは、あなたは追加のメソッドに追加して、クエリオブジェクトをアップ-build-ということでBuilder Patternある

答えて

1

など

私はComposite Patternに見て、あなたが利用するために、あなたのクラスをリファクタリングすることができれば参照してくださいね

Decorator Pattern:それは(私はそれがクリーンか素敵になってしまうだろうとは思いませんが)

別の方法を(あなたは/あなたのクエリを構築するインスタンス化を計画する方法を正確に依存する)ビルダー+おそらくFactory Patternを+ かもしれないも見ておく価値があります。しかし構文は少し違って見えるでしょう...(おそらく)ファクトリを介してオブジェクトを渡し、基本クエリの周りにコンポーネントを重ねることによってクエリを構築します。

関連する問題