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.
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
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. –
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. –