2009-08-19 7 views
0

Ich habe eine Suchklasse, die ich verwende, um Ergebnisse aus zwei verschiedenen Quellen zu holen und sie zusammen zu kombinieren. Die Suchklasse ist das übergeordnete Element und hat zwei untergeordnete Elemente A und B, die die Suche erweitern.Ist es eine schlechte Übung, eine Kindklasse mit einem Elternobjekt zu konstruieren?

In der Search-Klasse habe ich eine Methode namens fetch(), die die beiden untergeordneten Objekte instanziiert, um ihre Ergebnisse zu erhalten. Es sieht etwa so aus:

public function fetch(){ 
    $a = new A($this); 
    $a_results = $a->fetch(); 

    $b = new B($this); 
    $b_results = $b->fetch(); 

    // code to combine the results here 
} 

Der Konstruktor der Klasse A und B beide wie folgt aussehen:

class A extends Search 
{ 
    public function __construct(Search $search){ 
     parent::__construct($search->category, $search->offset, $search->keywords...); 
    } 

Es fühlt sich an wie ich etwas falsch, das zu tun bin ich vorbei ein übergeordnetes Objekt zu einem Kind und dann ein anderes Elternobjekt mit genau den gleichen Daten erstellen. Gibt es einen besseren Weg, dies einzurichten?

Ich habe es auf diese Weise festgelegt, da einige Teile meiner Anwendung direkt auf Klasse A und B zugreifen müssen, anstatt über die übergeordnete Suchklasse.

+1

Do A und B implementieren beide die Fetch-Methode? Wenn nicht, würde dies zu einer Endlosschleife führen. Es scheint, dass die Suche nicht wirklich nach dem Suchbegriff sucht, stattdessen sollten A- und B-Klassen einfach ein Suchobjekt als ihren __construct-Parameter verwenden, um die Eigenschaften des Suchobjekts zu verwenden. – localshred

+0

Ja, A und B haben beide Methoden fetch(), die unterschiedliche Logik haben. Vielleicht müssen A und B die Suche nicht erweitern, aber sie verwenden die gleichen Elemente und die gleichen Methoden, die für die Erstellung des Objekts erforderlich sind. Daher ist es für mich sinnvoll, die Suche zu erweitern. –

+0

Sie haben Recht, es ist sinnlos, die Suchklasse auf diese Weise zu erweitern. Ich muss nur das Suchobjekt übergeben und dann auf seine Eigenschaften zugreifen. Wenn Sie dies in eine Antwort setzen, kann ich es als die akzeptierte Lösung markieren. –

Antwort

2

Verwenden Sie die Komposition, wenn beispielsweise die Search-Klasse ein Array mit Quellen hat, wobei jede Quelle eine Instanz einer Source-Klasse ist, in der Sie definieren, was einer Quelle gemeinsam ist, und die Parameter für jede A- und B-Quelle übergeben.

Die Idee hier, falls es nicht klar ist, ist für die Source-Klasse, die Daten aus den Quellen zurückgeben und lassen Sie die Search-Klasse die Suche durchführen. Wie praktisch oder effizient das ist, hängt von der Quelle und der Art der Suche ab.

class Search { 
    private $sources = array(); 

    public Search($p1,$p2,$p3,$p4) { 
     //Use proper parameters to define the sources 
     $sources[] = new Source("A",$p1,$p2,$p3,$p4); 
     $sources[] = new Source("B",$p1,$p2,$p3,$p4); 
    } 
    public function fetch() { 
     foreach ($source in $sources) { 
      $results[] = $source->fetch(); 
     } 
     combine($results); 
    } 
} 


class Source { 
    //Whatever you need to define the source 
    public function fetch() { 
     //Fetch from the proper source 
    } 
    public Source($name,$p1,$p2,$p3,$p4) { 
     //Store the parameters to be able to operate 
    } 
} 
Verwandte Themen