Ich bin in einem TDD-Projekt und versuche, mich so gut wie möglich an die guten Praktiken zu halten, die mit dieser Art von Entwicklung verbunden sind. Einer von ihnen vermeidet so viel wie möglich statisch und global.
Ich stehe vor diesem Problem: Ich habe ein Objekt "Artikel", mit dem "Optionen" (zusätzliche "Mikroartikel") verknüpft sein können.
Ich kann nicht herausfinden, wie man einen guten Ansatz verfolgt, der nicht kontraproduktiv ist oder zu viele Abfragen erzeugt, da ich in einer Situation wäre, in der alles so entkoppelt ist, dass ich im Grunde 1 Abfrage pro Objekt durchführen muss.
Aus meiner Sicht sehe ich 3 Möglichkeiten:
1) Build inside Artikel:
class Article
{
//[...]
public function getArrOption(){
//Build an array of Options instance.
//return an array of Options.
}
}
Pro: Geradlinig
Const: Maintenability: Das Artikelobjekt enthält jetzt die Erstellungslogik für das Option-Objekt. Dies wird wahrscheinlich zu einer Code-Duplizierung führen.
2) Verwenden einer optionFactory
class Article
{
//[...]
public function getArrOption(){
return OptionFactory::buildFromArticleId($this->getId());
}
}
Pro: Gebäudelogik gehört nicht zur Klasse Artikel
Const: Ich verstoße gegen die Regel "Statisch ist schwer zu verspotten", was es schwierig macht, meine Artikelklasse zu testen.
3) Trennen Sie alle Logiken.
//Build the array of Option instance in a controller somewhere, using a Factory:
$arrOption = OptionFactory::buildFromArticleId($article->getId());
Pro: Article kümmert sich nur um seine eigene Verantwortung und kümmert sich nicht um seinen "Vater" -Link zu den Optionen. Die Dinge sind wirklich entkoppelt
Const: Benötigt mehr Code im Controller, wenn ich auf die Optionen zugreifen muss. Das heißt, ich sollte niemals eine Fabrik in einem Objekt benutzen, und das klingt für mich irgendwie utopisch ...
Was ist der beste Weg? (Habe ich etwas verpasst?) Danke.
Bearbeiten:
Ganz zu schweigen davon, dass ich, wenn ich Factory Inside Class nicht anrufen kann, grundsätzlich auch nie das Lazy Initialization Pattern verwenden kann ...