Hallo zusammen,
mal angenommen es gibt folgende Domain-Objekte
Shop
Betriebsferien
Feiertag
Die Objekte Shop und Betriebsferien stehen in einer 1:n oder has_many Beziehung zueinander (ein Shop kann mehrmals Betriebsferien haben, bzw. mehrere Betriebsferien-Objekte beinhalten). Eine Beziehung zwischen Feiertag und Shop gibt es erst mal nicht.
Nun will ich in meinem Shop-Objekt eine Funktion implementieren, die mir sagt ob der Shop heute geöffnet ist. Um das Beispiel nicht zu verkomplizieren ist der Shop außer an Feiertagen und während der Betriebsferien immer geöffnet:
Um diese Prüfung durchzuführen muss ich somit auf die Objekte Feiertag und Betriebsferien zugreifen können. Für das Objekt Betriebsferien könnte ich im Shop-Objekt auch direkt eine entsprechende Eigenschaft definieren, schließlich handelt es sich strenggenommen um eine Komposition (Shop-Betriebsferien brauchen immer einen Shop). Ich könnte die Betriebsferien entweder direkt im Konstruktor laden, oder mittels Lazy Init erst nach Bedarf:
Ich denke, es spricht soweit nichts dagegen das so zu machen.
Jetzt bräuchte ich also nur noch das Feiertag-Objekt. Um an das Feiertag Objekt zu kommen, könnte ich mir folgende Möglichkeiten vorstellen:
- ich übergebe es direkt im Konstruktor new Shop(new Feiertag());
Damit schaffe ich aber eine sehr starke Abhängigkeit zwischen Objekten/Klassen die normalerweise nichts voneinander wissen müssen,
außerdem benötige ich das Objekt nur bei einer Methode, die ich vielleicht nicht immer brauche wenn ich mit einem Shop-Objekt arbeite
- Stichwort DI, ich übergebe das Feiertag-Objekt mit einer dafür vorgesehenen Setter-Methode $shop->setFeiertag(new Feiertag());
Vorteil: lose Kopplung zwischen beiden Klassen
Nachteil: die Methode isGeoeffnet() würde fehlschlagen, wenn der Client nicht zuvor das Feiertag-Objekt selbst übergeben hat. D.h. Ich würde beim Client ein Wissen um die Abhängigkeiten im Inneren eines Shop-Objektes voraussetzen.
- Ich erzeuge das Feiertag-Objekt direkt in der Methode isGeoeffnet(), also nur dann wenn ich es wirklich brauche
Nachteil: die Abhängigkeit zwischen der Shop-Klasse und einer konkreten Implementierung der Feiertag-KLasse wird größer
Vorteil: Das Feiertag-Objekt wird erst dann erzeugt wenn es benötigt wird und der Client muss sich nicht selbst um das Laden des Feiertag-Objektes kümmern, benötigt somit kein Wissen über die Abhängigkeiten im Inneren eines Objektes.
Mein Favorit wäre die letztgenannte Lösung. Man könnte sich zusätzlich noch überlegen, ob diese Prüfung grundsätzlich im Verantwortungsbereich eines Shop-Objekts liegen sollte? Möglicherweise wäre es besser die Prüfung komplett in eine Extra-Klasse auszulagern? Aber wer sollte es eigentlich besser wissen, ob ein Shop gerade geöffnet ist, als der Shop selbst
Mich würde mal interessieren wie Ihr darüber denkt und ob Ihr evtl. noch andere Möglichkeiten/Ideen sieht.
vg
jack
mal angenommen es gibt folgende Domain-Objekte
Shop
Betriebsferien
Feiertag
Die Objekte Shop und Betriebsferien stehen in einer 1:n oder has_many Beziehung zueinander (ein Shop kann mehrmals Betriebsferien haben, bzw. mehrere Betriebsferien-Objekte beinhalten). Eine Beziehung zwischen Feiertag und Shop gibt es erst mal nicht.
Nun will ich in meinem Shop-Objekt eine Funktion implementieren, die mir sagt ob der Shop heute geöffnet ist. Um das Beispiel nicht zu verkomplizieren ist der Shop außer an Feiertagen und während der Betriebsferien immer geöffnet:
PHP-Code:
public function istGeoeffnet() {
if(Betriebsferien->hatHeuteBetriebsferien($this->id ) || Feiertag->istHeuteFeiertag()) {
return false;
}
return true;
}
PHP-Code:
class Shop {
protected $_betriebsferien = null;
public function getBetriebsferien() {
if($this->_betriebsferien === null) {
$this->_betriebsferien = new Betriebsferien($this->id);
}
return $this->_betriebsferien;
}
}
Jetzt bräuchte ich also nur noch das Feiertag-Objekt. Um an das Feiertag Objekt zu kommen, könnte ich mir folgende Möglichkeiten vorstellen:
- ich übergebe es direkt im Konstruktor new Shop(new Feiertag());
Damit schaffe ich aber eine sehr starke Abhängigkeit zwischen Objekten/Klassen die normalerweise nichts voneinander wissen müssen,
außerdem benötige ich das Objekt nur bei einer Methode, die ich vielleicht nicht immer brauche wenn ich mit einem Shop-Objekt arbeite
- Stichwort DI, ich übergebe das Feiertag-Objekt mit einer dafür vorgesehenen Setter-Methode $shop->setFeiertag(new Feiertag());
Vorteil: lose Kopplung zwischen beiden Klassen
Nachteil: die Methode isGeoeffnet() würde fehlschlagen, wenn der Client nicht zuvor das Feiertag-Objekt selbst übergeben hat. D.h. Ich würde beim Client ein Wissen um die Abhängigkeiten im Inneren eines Shop-Objektes voraussetzen.
- Ich erzeuge das Feiertag-Objekt direkt in der Methode isGeoeffnet(), also nur dann wenn ich es wirklich brauche
PHP-Code:
public function istGeoeffnet() {
$feiertag = new Feiertag();
$betriebsferien = this->getBetriebsferien;
if($betriebsferien->hatHeuteBetriebsferien() || $feiertag->istHeuteFeiertag()) {
return false;
}
return true;
}
Vorteil: Das Feiertag-Objekt wird erst dann erzeugt wenn es benötigt wird und der Client muss sich nicht selbst um das Laden des Feiertag-Objektes kümmern, benötigt somit kein Wissen über die Abhängigkeiten im Inneren eines Objektes.
Mein Favorit wäre die letztgenannte Lösung. Man könnte sich zusätzlich noch überlegen, ob diese Prüfung grundsätzlich im Verantwortungsbereich eines Shop-Objekts liegen sollte? Möglicherweise wäre es besser die Prüfung komplett in eine Extra-Klasse auszulagern? Aber wer sollte es eigentlich besser wissen, ob ein Shop gerade geöffnet ist, als der Shop selbst
Mich würde mal interessieren wie Ihr darüber denkt und ob Ihr evtl. noch andere Möglichkeiten/Ideen sieht.
vg
jack
Kommentar