7

Ich möchte Observer Pattern in meine App implementieren (nicht php, deshalb verwende ich die Symfony-Komponente nicht).Warum verwendet Symfony EventDispatcher willkürliche Namen für Ereignisse anstelle von klassenbasierter Propagierung?

Ich fand es seltsam, dass die Komponente keine Klassen verwendet, um Ereignisse zu propagieren oder zu hören, da dies das Abhören des gesamten Baums von Ereignissen durch Vererbung erlauben würde.

Ich kann nicht den einzigen Vorteil der Verwendung von Namen-basierte Listener sehen, würden Sie mir mit meinem Nachdenken helfen?

Antwort

8

Symfony2, meiner Meinung nach, bevorzugt Kohäsion über Kopplung und deshalb verwenden sie dieses Muster (Mediator pattern).

Von Symfony docs:

objektorientierten Code, um sicherzustellen, Code Erweiterbarkeit einen langen Weg gegangen. Durch das Erstellen von Klassen mit klar definierten Verantwortlichkeiten wird Ihr Code flexibler und ein Entwickler kann sie mit Unterklassen erweitern, um ihr Verhalten zu ändern. Aber wenn er will seine Änderungen mit anderen Entwicklern teilen, die auch ihre eigenen Unterklassen gemacht haben, ist Code Vererbung nicht mehr die Antwort.

Betrachten Sie das real-world Beispiel, wo Sie ein Plugin-System für Ihr Projekt bereitstellen möchten. Ein Plugin sollte in der Lage sein, Methoden hinzuzufügen oder etwas zu tun vor oder nach einer Methode ausgeführt wird, ohne andere Plugins zu stören. Dies ist kein einfaches Problem zu lösen mit Single-Vererbung, und mehrfache Vererbung (war es mit PHP möglich) hat seine eigenen Nachteile.

Die Symfony2 Event Dispatcher-Komponente implementiert das Mediator-Muster in einer einfachen und effektiven Weise, um all diese Dinge möglich zu machen und Ihre Projekte wirklich erweiterbar zu machen.