| | | | |
| |||||||
| Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene |
|
| | LinkBack | Themen-Optionen | Thema bewerten |
| | |
| Erfahrener Benutzer Registriert seit: 12.05.2005
Beiträge: 1.038
PHP-Kenntnisse: Fortgeschritten ![]() | Hallo, ich spiele momentan damit einen eigenen dic zu schreiben. er ähnelt vom aufbau her ein wenig google guice, alles wird immer gegen ein interface gebunden. das ist auch alles wunderschön so, jedoch ist mir eine tolle weitere idee gekommen. im klartext geht es darum, wie man elegant eine klasse um funktionalität erweitert ohne diese neu zu implementieren. möglichkeit 1. ersetzen und erben. ich denke diesen weg gehen die meisten di frameworks, man ersetzt einfach den kompletten service. das hat den nachteil, dass nicht unterschiedliche module identische services ersetzen können. aus diesem grund habe ich mir was einfallen lassen um die klassen im DI elegant erweitern zu können - von unterschiedlichsten modulen gleichzeitig. dabei setze ich frei nach clean code developer auf komposition statt vererbung. [b] in diesem thread suche ich NUR gründe dies nicht zutun. ich habe sowas vorher noch nie in einem dic gesehen, begründet? [b] die api soll ähnlich dieser sein: PHP-Code: man hat ein interface welches man an eine klasse bindet, ein $di->get([INTERFACE]) liefert diese instantz. möchte man den service mit diesem interface erweitern, fügt man einfach einen decorator hinzu. der Decorator muss logischerweise das identische interface implementieren. ab nun liefert der di die korrekte decorierte intanz des objektes zurück. natürlich kann ein service unendlich oft decoriert werden. der code ist hier zu finden: https://github.com/timglabisch/pimDI...est/diTest.php bitte beachten, dass der dic noch nicht fertig ist. |
| | |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |||
| moderatives Dielektrikum Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Zitat:
Zitat:
__________________ -- One pixel is still too big. Please make it smaller. ASAP. Initiative Mittelstand. Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers. -- | ||
| | |
| | |
| Erfahrener Benutzer Registriert seit: 12.05.2005
Beiträge: 1.038
PHP-Kenntnisse: Fortgeschritten ![]() | hier geht es um klassische komposition: http://www.clean-code-developer.de/R...ritance_FCoI_3 vererbung und direkte abhängigkeiten. instanzen können von klassen welche das selbe interface implementieren relativ einfach "erweitert" werden indem diese die originalklasse dekorieren. der beispielcode sollte da eigentlich gut zeigen. $di->bind('istd')->to('diDecorateStd1'); $di->bind('istd')->to('diDecorateDecorator1')->decorated(true); hier hat man nun eine instanz von diDecorateDecorator1 welche das interface istd implementiert. der instanz wurde eine instanz von diDecorateStd1 welche identisches interface implementiert übergeben. |
| | |
| | ||||||
| moderatives Dielektrikum Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Der Link beschreibt ein Vorgehen, keinen Anwendungsfall. Zitat:
Zitat:
Zitat:
Zitat:
Im Übrigen heißt Komposition mitnichten automatisch Decorator. Zitat:
__________________ -- One pixel is still too big. Please make it smaller. ASAP. Initiative Mittelstand. Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers. -- | |||||
| | |
| | |
| Erfahrener Benutzer Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() | Ich verstehe das irgendwie auch nicht. Eher sehe ich Gefahren, weil man, wie nikosch schon anmerkte, überhauot nicht mehr weiß, welche Methoden der Service nun anbietet. Wenn er ledliglich ein Interface anbietet, dann ist ja alles klar. Wenn man jedoch diese Klasse erweitert und dann dort, wo man den Service per Interface abruft, die Erweiterung benutzen will, dann könnte man sich den Aufruf per Interface wieder sparen und diesen direkt per Bezeichnung abrufen. Da hast Du dann die selbe Problematik wie in dem anderen Thread von Dir. Langer Rede kurzer Sinn: Wenn man die Services, die Du erweiterst, per ursprünglichem Interface abruft (So habe ich es verstanden), dann wird der Abruf per Interface obsolet. |
| | |
| | |
| Moderator und Wett-König | Sofern du einen neuen oder veränderten Service Nutzen möchtest, implementiere das Interface und injiziere diesen Service in deine abhängige Komponente. Alles andere ist nicht anwendbar.
__________________ Viele Grüße, Dr.E. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. Think about software design before you start to write code! 2. Discuss and review it together with experts! 3. Choose good tools (-> Adventure PHP Framework (APF))! 4. Write clean and reusable software only! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 12.05.2005
Beiträge: 1.038
PHP-Kenntnisse: Fortgeschritten ![]() | ich versuche es nochmal genauer zu erklären. ich wollte nicht unnötig viel code posten da er ja sowieso auf github verfügbar ist. angenommen wir einen service, nennen wir ihn SayHelloService. wir benötigen für den service ein interface sowie die implementation. PHP-Code: nun können wir den service beim DiC registrieren: PHP-Code: PHP-Code: PHP-Code: nun kommen wir zur eigentlichen problematik, jemand möchte den helloWorldService erweitern, die einfachste möglichkeit wäre einen anderen service zu schreiben und den SayHelloervice zu ersetzen. PHP-Code: idr. ist es jedoch so, das man einen service nur erweitern möchte un die original funktionalität nicht stören möchte, eine möglichkeit wäre: PHP-Code: was passiert nun, wenn der service um weitere Funktionalitäten erweitert werden soll? Die Anzahl der Funktionalitäten sind unbekannt, bekannt ist nur das sie alle das interface iSayHelloService implementieren. wenn man mal den dic vergisst, würde ich den weg über einen decorator lösen: PHP-Code: identisches verhalten möchte ich meinem DiC beibringen. [php] $di = new di(); $di->bind('iSayHelloService')->to('sayHelloServer'); $di->bind('iSayHelloService')->to('sayHelloServer_LOGGER')->decorated(true); $di->bind('iSayHelloService')->to('sayHelloServer_FOO')->decorated(true); $di->bind('iSayHelloService')->to('sayHelloServer_BAR')->decorated(true); $di->get('iSayHelloService') // returns sayHelloServer_LOGGER(new sayHelloServer_FOO(new sayHelloServer_BAR(new sayHelloServer()))); [php] ist die erklärung verständlicher? |
| | |
| | |
| moderatives Dielektrikum Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Warum wird ein Service an ein Interface gebunden und darüber abgefragt? Korrigiert mich, falls das typisch für DIC/IOC ist, aber ein Interface muss doch nicht zwingend ein gesamtes Objekt beschreiben und auf der anderen Seite können durchaus mehrere Objekte (also auch Services) das selbe Interface implementieren.
__________________ -- One pixel is still too big. Please make it smaller. ASAP. Initiative Mittelstand. Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers. -- |
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
| Besucher kamen über folgende Suchanfragen bei Google auf diese Seite |
| php komposition, komposition php, komposition php wiki, komposition in php, komposition php code, komposition statt vererbung, php class komposition, kompositionen php, guice beispielcode, di php, php klassen komposition |