2017-02-02 3 views
1

Freunde. Derzeit entwickle ich s komplexe Suche. Ich habe nächste Klassen:Eine Suchklasse. Muster Beratung Anfrage

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

App \ Search \ Search ist die Hauptsuchklasse. Alle Klassen in \ OrderBy nehmen das Query Builder-Objekt als Referenz an und wenden einige Logiken darauf an.

Hier sind einige Code-Beispiele:

//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; 
    } 
} 

Die Hauptidee ist es, bedingt mehrere Bestellung auf eine Abfrage gelten, wie folgt aus:

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

So Code funktioniert gut, aber ich fühle mich einige code riechen darin, vor allem jede Order-Methode manuell zu deklarieren. Gibt es irgendwelche Muster oder Tricks, die meine Suchklasse verbessern könnten?

Antwort

1

Dies ist die Builder Pattern in das heißt Sie durch Hinzufügen von zusätzlichen Methoden, um Ihre Abfrageobjekt -build- würde usw.

ich in die Composite Pattern aussehen würde und sehen, ob Sie Ihre Klassen zu nutzen machen Refactoring könnte it + builder + möglicherweise Factory Pattern (je nachdem, wie genau planen Sie auf Instanziierung/Aufbau Ihre Anfragen)

Eine andere Alternative (obwohl ich nicht glaube, es würde am Ende als sauber oder nett zu sein):

Die Decorator Patternkönnte lohnt sich auch zu sehen. Aber die Syntax würde ein wenig anders aussehen ... Sie würden ein Objekt durch die (wahrscheinlich eine) Fabrik übergeben und die Abfrage aufbauen, indem Sie Komponenten um die Basisabfrage herum schichten.