Frage

Betrachten Sie Martin Fowlers Muster der Enterprise -Anwendungsarchitektur und das Muster des Front -Controllers: http://martinfowler.com/eaacatalog/frontcontroller.htmlAnscheinend verwendet es das Singleton -Muster. Nun, ich habe ein Paket von Klassen in der PHP -Anwendung, die zusammenarbeiten (wie das Controller -Paket von Zend), und es gibt eine Klasse, die sie alle verwendbar macht, und da es einen vielen Konzepten von Front Controller ähnelt, habe ich es Packagename_Front genannt. Aber es sollte keine Singleton -Klasse sein (im Gegensatz zum Frontcontroller). Also lasse ich es immer noch den Namen vorne haben? Wenn nicht, wie nenne ich das? Da es sich um ein ziemlich großes Paket handelt, muss ich nur die Konventionen wie möglich verfolgen (nicht auf dogmatische Weise!), Daher wäre es für andere Entwickler lesbar.

Weitere Informationen: Es ist nichts mit Controllern zu tun. Es ist nur ein Objekt, das wie zend_form funktioniert (das die Verwendung aller anderen Objekte wie zend_form_element_x und Zend_validat in ein Objekt konsolidiert), aber ich kann es nicht einfach packagenamen benennen. Es muss Packagename sein, und ich bin einfach nicht Vater, was etwas sein sollte. Vielleicht "Handler"? ... Ich möchte nur sicherstellen, dass jemand, wenn jemand seinen Namen liest, nicht verwirrt ist, dass seine Rolle im gesamten Paket ist :)

War es hilfreich?

Lösung

Anscheinend, es Frontcontroller Verwendet das Singleton -Muster.

FrontController muss nicht als Singleton implementiert werden. Das Buch schlägt so etwas nicht vor. Das Beispiel im Buch verwendet einen Servlet für den Handler.

Nur weil eine Klasse nur einmal in einer Anwendung benötigt wird, rechtfertigt die Implementierung als Singleton nicht. Es fehlt der Zweck des Singletons, der es ist erzwingen Eine Klasse kann nur eine Instanz haben und Bieten Sie globalen Zugang dazu. Wenn Sie nur einmal eine bestimmte Instanz benötigen, berücksichtigen Sie Erstellen Sie einfach einen stattdessen.

Viele Menschen sind heutzutage (einschließlich Erich Gamma von Gof Fame) den Singleton als Code -Geruch und entmutigen seine Verwendung. In einer gemeinsam genutzten Architektur kann der Singleton die Instanzen in der aktuellen Anfrage ohnehin nur einschränken, sodass die Verwendung in PHP begrenzt ist. Der globale Zugriff auf ein Objekt kann ohne das Singleton -Muster entweder durch das (böse) globale Schlüsselwort oder statische Methoden erreicht werden. Der globale Zugang schafft immer unnötige Kopplung. Der bessere Weg wäre die Verwendung der Abhängigkeitsinjektion, die den zusätzlichen Vorteil hat, dass weniger Kopplung und damit bessere Wartbarkeit bereitgestellt werden.

Also lasse ich es immer noch den Namen vor Ort haben? Wenn nicht, wie nenne ich das? Da es sich um ein ziemlich großes Paket handelt, muss ich es nur so weit wie möglich Konventionen verfolgen (nicht auf dogmatische Weise!)

Es gibt keine solche Konvention über die Benennung von Kursen Vorderseite Klassen meines Wissens. Was Sie beschreiben, könnte ein sein Fassade oder ein Tor obwohl. Sind Sie sicher, dass Sie die Klasse nicht nach dem Paketennamen benennen können? Immerhin die Zend_Form Paket hat a Zend_Form Klasse auch.

Andere Tipps

Nur aus reiner Designansicht klingt es so, als würden Sie diese Packagename_front als Fassade verwenden, wenn Sie sagen:

Es gibt eine Klasse, die sie alle nutzbar macht

Fowlers Implementierung des Musters sagt:

Der Front -Controller konsolidiert alle Anforderungsbearbeitung, indem sie Anforderungen über ein einzelnes Handler -Objekt kanalisiert

Dies zeigt, dass ein Singleton möglicherweise zur Implementierung der Front -Controller -Klasse verwendet wird, aber er hat es sicherlich nicht ein, sie zu verwenden. Er erwähnt es aber nicht ausdrücklich.

Ich denke nicht, dass es wichtig ist, ob es ein Singleton ist oder nicht. Stellen Sie nur sicher, dass dies der einzige Kanal für Anfragen ist, und Sie haben das Muster erfolgreich verwendet. :)

Die Idee hinter dem Singleton -Muster besteht darin, sicherzustellen, dass es nur eine Instanz eines Objekts gibt, das nur in einer einzigen Instanz existieren soll. Der Front -Controller fällt sehr gut in diese Kategorie, so dass es vielleicht ratsam sein würde, ein Singleton -Muster zu folgen.

Wenn Ihr Code jedoch immer sicherstellt, dass der Konstruktor nur einmal aufgerufen wird, ist Platz für Ihr Nicht-Singleton-Musterobjekt.

Meine 2 Cent hier, da ich kein Buchautor oder so bin.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top