![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
|
Hallo,
ich habe eine Frage zu den Anwendungsbereichen des Observer-Patterns in PHP. Ich beschäftige mich gerade etwas intensiver mit dem Model-View-Controller in PHP, also wie dieses Muster in PHP am besten umgesetzt wird. Ich habe bislang nur ansatzweise in Java damit gearbeitet, so dass ich mich zumeist auf dieses Beispiel und die dazugehörige Erläuterung bezogen habe: Dort ist die Struktur folgendermaßen: Code:
Model ----- View implements Observer ----- Controller implements Observable Sagen wir, ich habe eine Anwendung, die sich auf das MVC-Pattern stützen will. An welcher Stelle kommt denn dort das Observer-Pattern zum Einsatz? In obigem Link ist ja ein Beispiel dargestellt, aber irgendwie scheine ich nicht in der Lage zu sein den Transfer auf z.B. ein Content-Management-System o.Ä. durchzuführen. Ich wäre erfreut Eure Erfahrungen mit den Mustern (MVC, Observer) im Produktiveinsatz kennenzulernen und Informationen über die Anwendungsbereiche zu erhalten. Ich danke Euch im Voraus. Grüße, Ben. |
|
|
|
|
|
Nach oben #2 |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
|
Eine Lektüre für das Wochenende!
Nicht ganz einfach, aber sehr interessant. Lese jetzt ca. 40 Minuten und ich finde es sehr gut geschrieben. Auf jeden Fall lohnenswert! Grüße, Ben. |
|
|
|
|
|
Nach oben #3 |
|
Gast
Beiträge: n/a
|
Das ganze funktioniert grundsätzlich so:
Du hast eine Observerable Klasse und eine Observer Klasse. Jedes Objekt das von der Observer Klasse erbt wird in dem dem Konstruktor übergebenen Observerable Objekt in einem Array als Referenz gespeichert. Die notifyOberservers Methode der Observerable Klasse ruft automatisch für jedes Obeserver Objekt eine update Methode auf. Diese update Methode führt eben irgendetwas aus, z.B. Daten in der DB updaten oder sonst was. Ich habe jetzt auch gleich mal eine kleines Beispiel zusammengetippt, damit es leichter zu verstehen ist. Hoffe ich zumindest Beispiel: PHP-Code:
Code:
update function ob class B called update function ob class C called MfG Jay |
|
|
|
Nach oben #4 |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
|
Nett, dass du geantwortest hast, aber meine Frage eigentlich eher, an welcher Stelle ich das anwende.
Das, was du mir da jetzt beschrieben hast steht eigentlich genauso in oben verlinktem Artikel bei phppatterns.com. Kannst du mir eventuell ein weiteres Anwendungsbeispiel geben? Das obige .. nunja, wie gesagt .. ich schaff einfach nicht den Transfer. |
|
|
|
|
|
Nach oben #5 |
|
Gast
Beiträge: n/a
|
Hmm ... mir fällt jetzt dazu eigentlich kein Praxisbeispiel ein.
Du musst dir halt immer nur folgendest merken:
Dritt ein Event auf, so werden für alle anderen Objekte eben automatisch die update Methoden aufgerufen. Hoffe ich hab dir etwas geholfen. Mfg Jay |
|
|
|
Nach oben #6 |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
|
Jou, das Prinzip hatte ich verstanden (hast du aber trotzdem gut dargestellt!
Ich habe darüber nachgedacht, wie man dieses Observer-Muster in ein "MVC-System" integrieren könnte und vor allem, an welchen Stellen dies sinnvoll wäre. Ich habe irgendwie im Hinterkopf, dass ich mit diesem Entwurfsmuster eine Aktion des Users realisieren und darauf reagieren kann. Dies ist ja auch bei phppatterns.com so dargestellt. Es wird ein Beitrag in einem Forum geschrieben und daraufhin wird eine Mail an alle User geschickt, die sich informieren lassen wollen, wenn eine neue Nachricht geschrieben wurde. Das ist ein gutes Beispiel .. aber es kann ja nicht das einzig sinnvolle sein, oder? Die Frage richtet sich natürlich nicht nur an Jay, sondern an alle, die das hier lesen. Ich werde jetzt erstmal aufhören darüber nachzudenken. Ist schon spät. Freue mich aber über weitere Beiträge von Euch. Grüße, Ben. |
|
|
|
|
|
Nach oben #7 |
|
Projektleiter
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
|
Ähm... ganz kurz und knapp: Nein, nein, nein und nochmals nein!
Das Observer-Pattern dient dazu, ein anderes Objekt zu beobachten - im speziellen auf Änderungen. Nun überlege doch mal, welche Objekte sich zu beobachten lohnen und durch wen. Um's kurz zu machen: Das View muss definitiv nicht beobachtet werden (weder vom Model noch vom Controller). Der Controller ist dafür verantwortlich, Model und View zusammen zu bringen, also macht es ebenfalls keinen Sinn, dass zu beobachten. Bleibt nur noch das Model übrig und siehe da: Das stimmt. View (Observer) observiert Model (Observable). Ein Beispiel kann ich dir jetzt so spontan nicht liefern, weil ich nicht sehen kann, wo das in einer Webseite Sinn machen soll - auch das Beispiel auf phpPatterns ist extrem dünn. Da wäre ein globaler EventBus sinnvoller gewesen, aber gut... Generell solltest du dir aber folgendes merken: Es ist _nicht_ gut, Design Patterns zu verwenden. Design Patterns bedeuten _immer_ zusätzliche Komplexität. Deshalb solltest du nicht versuchen, die irgendwo zu verwenden, sondern sie nur dann einsetzen, wenn sie wirklich notwendig sind. In deinem Fall klingt es so, als ob du unbedingt irgendwo ein Observer-Pattern einbauen willst, ob das nun notwendig ist oder nicht. Um's auf den Punkt zu bringen: Observer-Pattern == EventListener in Java |
|
|
|
|
|
Nach oben #8 | ||
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
|
Zitat:
Man lese Zitat:
Genau sowas in der Art, wie du es jetzt geschrieben hast will ich ja hören. Was meinst du mit "EventBus"? |
||
|
|
|
|
|
Nach oben #9 |
|
Projektleiter
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
|
Beim malen viel mir auf, dass es auf funktionieren würde (bei diesem Beispiel), wenn den EventBus weglassen würde und stattdessen direkt den PostManager zum Observable machen würde.
EventBus hat den Vorteil, dass statt one-to-many Beziehungen (ein Observable, viele Observer) auch many-to-many Beziehungen (mehrere Observable, mehrere Observer) möglich sind und die Observer nicht wissen müssen, wen sie da eigentlich observieren. d.h. es entstehen weniger hard-codierte Beziehungen und das ganze bleibt deutlich dynamischer. |
|
|
|
|
|
Nach oben #11 |
|
Projektleiter
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
|
Ok... dann etwas Code dazu:
PHP-Code:
|
|
|
|
|
|
Nach oben #12 | |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
|
Ahso. Ja, ist besser.
Dein Beispiel gefällt mir. Lässt sich ja als Alternative sehen. Warum genau würdest du jetzt aber sagen, dass deine Variante vorteilhafter ist? Du sprichst ja davon, dass ich durch Entwurfsmuster die Komplexität erhöhe (was imho bei strukturierter Anwendung nicht unbedingt was Schlimmes sein muss!). Dein Beispiel ist aber nun ja nicht weniger komplex bzw. in diesen Fällen finde ich beide Beispiele eher simpel. Dann noch etwas zu deinem Beispielquelltext. Es müsste doch heißen "PostEvent implements/extends Event" oder? Weiterhin weiß ich nicht so ganz, was du in der UML-Grafik mit "source Weiterhin Zitat:
Danke dir. Grüße, Ben. |
|
|
|
|
|
|
Nach oben #13 |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
|
Soderle.
Ich habe noch einige weitere Fragen zu deinem Quellcode. Einige Punkte sind mir nicht klar, weil ich teilweise irgendwie keinen Anwendungsfall für sie habe ...
Ich wollte das von dir skizzierte Prinzip (welches mir recht gut gefällt) gerne auf ein minimales Newssystem übertragen. Dabei kam es zu obigen Fragestellungen. Ich freue mich auf Beantwortung. Grüße, Ben. |
|
|
|
|
|
Nach oben #14 | |||||||||
|
Projektleiter
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
|
Den Code hatte ich in ein ner Minute zusammengewürfelt, weil ich weg musste.
Zitat:
Wenn die Listener dann immer noch agieren sollen, dann hast du das Problem, dass du die alle auch noch bei diesem neuen Code registrieren musst. Bei meiner Variante ist dieser Fall bereits abgedeckt - der Code ist also flexibler. (1 zu n gegen n zu m) Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Im oberen Beispiel würde eine Änderung des Models (PostManager und Post) über die Datenschicht (EventBus) an ein paar Controller (PostMailer, FeedUpdater) weiterleiten, die dann ein neues View erzeugen würden. Das ist so ziemlich das sinnvollste, was ich mir unter Observer und Web-Applikationen vorstellen kann. Der Ursprung des Observer-Patterns ist ja doch etwas anders: Ein Controller ändert das Model, dass Model benachrichtigt die Observer, die "zufällig" dem View entsprechen. Eine solche Änderung kann aber bei PHP-Scripts gar nicht erst stattfinden, weil Daten nicht wirklich persistent sind. Es wird kein Zustand gespeichert. Posts werden ausgelesen, geändert und neu erstellt. Aber dafür werden jedesmal neue Posts erzeugt. Deshalb macht das normale Observer-Pattern keinen Sinn. Ein Datenobjekt in PHP ist nicht mehr als eine Klasse mit Attributen und Business-Logic, aber sie muss eben nicht observiert werden. Zitat:
(ServiceLocator) Zitat:
PHP-Code:
PHP-Code:
Kurz genug? |
|||||||||
|
|
|