OOP Zugriff auf Objekte fremder Klassen
Hallo zusammen.
Ich bin gerade dabei ein Framework zu schreiben, jedoch habe ich ein kleines Problem bei der objektorientierten Umsetzung des Ganzen. Ich versuche mal kurz das Problem zu umreißen: Es gibt eine Klasse BaseObject, von der alle anderen Klassen bis auf die Logs abgeleitet werden. Das BaseObject verfügt über einen Konstruktor, in dem die Log-Datei geöffnet wird, natürlich alles objektorientiert PHP-Code:
PHP-Code:
Die Klassen sind wie folgt aufgebaut: Code:
BaseObject Hier noch der Konstruktor von BaseObject PHP-Code:
|
AW: OOP Zugriff auf Objekte fremden Klassen
Singletons sind böse!
Ein stumpfer Ersatz für globale Variablen. Selten sinnvoll. Was ist, wenn es mehrere (verschiedene) Logger geben soll? Was ist, wenn du mal eine Ableitung/Kind eines Loggers verwenden willst? Ob etwas Singleton sein darf/soll/muß, ist eine Anforderung der Applikation. Darum darf sowas in einem Framework nicht auftauchen. Selbst die Helden des ZF haben das mittlerweile geschnallt und eliminieren jetzt alle Singletons in ihrem Framework. Bitte tappe nicht in die gleiche Falle. Logger über den Constructor übergeben ist auch böse! Denn nicht immer brauchen alle Objekte einen Logger. Das Fachwort dafür ist übrigens "Constructor Injection" Besser wäre also die "Setter Injection". Im Falle deiner Controller wäre es sicherlich Sinnvoll diese per "Factory" zu erzeugen. Mache dich generell über das "Dependency Injection Pattern" kundig. Denn witziger weise, bist du nicht die/der erste mit diesem Problem! |
AW: OOP Zugriff auf Objekte fremden Klassen
Soweit ich das jetzt verstanden habe, sollen die Objekte von eienr Factory-Klasse erzeugt werden und jede Klasse, welche beispielsweise einen Logger braucht enthält dann einen "setLogger" - Dienst. Wie sieht das mit der Vererbung aus bei Klassen die einen Logger brauchen und bei welchen die keinen benötigen?
|
AW: OOP Zugriff auf Objekte fremden Klassen
Bevor ich was zur Vererbung oder Fabriken sage (was soll man dazu denn auch sagen), erstmal dieses:
1. bei notwendigen Dingen: Konstruktor injection 2. bei optionalen Dingen: Setter injection Im folgenden Code benötigt der Logger ZWINGEND einen Dateinamen. Also: Konstruktor injection Aber der Rechner kann einen Logger bedienen, muss aber nicht, kommt auch ohne aus. Also: Setter injection So und nun endlich ein Beispiel: PHP-Code:
|
AW: OOP Zugriff auf Objekte fremden Klassen
Okay, dank deiner Hilfe steige ich langsam da durch. Per Factory lass ich alle Logger usw. anfangs erzeugen und gebe sie dann gegebenenfalls den anderen Objekten per Setter Injection mit, falls diese sie benötigen.
Wenn ich mehrere Klassen habe deren Objekte, einen Logger benötigen, macht es dann Sinn eine Oberklasse, zu schreiben, welche die Methoden setLogger, setDB usw. enthält oder soll ich die Methode je nach Bedarf immer einzeln in die Klasse schreiben, was mir aber weniger sinnvoll erscheint, denn wie sieht es aus, wenn es mehrere Logger geben soll für welchen Zweck auch immer, kann man die Methoden irgendwie verallgemeinern? |
AW: OOP Zugriff auf Objekte fremden Klassen
Zitat:
Bedenke: Du kannst immer nur von EINER Oberklasse erben, aber VIELE Interfaces implementieren. Zitat:
Sowas? Google: "Observer Design Pattern" |
Alle Zeitangaben in WEZ +2. Es ist jetzt 17:34:25 Uhr. |
Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.