Wer braucht Singletons in PHP?
Beachten Sie, dass fast alle Einwände gegen Singletons aus technischer Sicht kommen - aber sie sind auch in ihrem Umfang SEHR begrenzt. Speziell für PHP. Zuerst werde ich einige Gründe für die Verwendung von Singletons auflisten und dann die Einwände gegen die Verwendung von Singletons analysieren. Erstens Menschen, die sie brauchen:
- Personen, die ein großes Framework / eine große Codebasis codieren, die in vielen verschiedenen Umgebungen verwendet werden, müssen mit zuvor vorhandenen, unterschiedlichen Frameworks / Codebasen arbeiten, wobei viele verschiedene, sich ändernde, sogar skurrile Anforderungen von Kunden / Vorgesetzten implementiert werden müssen / Management / Referatsleiter tun.
Das Singleton-Muster ist in sich geschlossen. Wenn Sie fertig sind, ist eine Singleton-Klasse für jeden Code, in den Sie sie aufnehmen, starr und verhält sich genau so, wie Sie ihre Methoden und Variablen erstellt haben. Und es ist immer das gleiche Objekt in einer bestimmten Anfrage. Da es nicht zweimal als zwei verschiedene Objekte erstellt werden kann, wissen Sie, was ein Singleton-Objekt an einem bestimmten Punkt in einem Code ist - selbst wenn der Singleton in zwei, drei verschiedene, alte, sogar Spaghetti-Codebasen eingefügt wird. Dies erleichtert die Entwicklung - selbst wenn in diesem Projekt viele Personen arbeiten, wissen Sie, was ein Singleton ist, was er tut und wie er funktioniert, wenn Sie sehen, dass ein Singleton an einem Punkt in einer bestimmten Codebasis initialisiert wird Wenn es sich um die traditionelle Klasse handelt, müssen Sie nachverfolgen, wo das Objekt zuerst erstellt wurde. welche Methoden darin bis zu diesem Punkt im Code aufgerufen wurden, und sein besonderer Zustand. Wenn Sie jedoch einen Singleton dort ablegen, und wenn Sie beim Codieren die richtigen Debugging- und Informationsmethoden und das Tracking im Singleton abgelegt haben, wissen Sie genau, was es ist. Dies erleichtert Menschen, die mit unterschiedlichen Codebasen arbeiten müssen, die Integration von Code, der zuvor mit unterschiedlichen Philosophien erstellt wurde, oder von Personen, mit denen Sie keinen Kontakt haben. (das heißt, Anbieter-Projekt-Unternehmen-was auch immer gibt es nicht mehr, keine Unterstützung nichts). Dies erleichtert es Menschen, die mit unterschiedlichen Codebasen arbeiten müssen, mit der Notwendigkeit, Code zu integrieren, der früher mit unterschiedlichen Philosophien erstellt wurde, oder von Personen, mit denen Sie keinen Kontakt haben. (das heißt, Anbieter-Projekt-Unternehmen-was auch immer gibt es nicht mehr, keine Unterstützung nichts). Dies erleichtert es Menschen, die mit unterschiedlichen Codebasen arbeiten müssen, mit der Notwendigkeit, Code zu integrieren, der früher mit unterschiedlichen Philosophien erstellt wurde, oder von Personen, mit denen Sie keinen Kontakt haben. (das heißt, Anbieter-Projekt-Unternehmen-was auch immer gibt es nicht mehr, keine Unterstützung nichts).
- Personen, die mit APIs , Diensten und Websites von Drittanbietern arbeiten müssen .
Wenn Sie genauer hinschauen, unterscheidet sich dies nicht allzu sehr von dem früheren Fall - APIs, Dienste und Websites von Drittanbietern sind wie externe, isolierte Codebasen, über die Sie KEINE Kontrolle haben. Alles kann passieren. Mit einer Singleton-Sitzung / Benutzerklasse können Sie also JEDE Art von Sitzungs- / Autorisierungsimplementierung von Drittanbietern wie OpenID , Facebook , Twitter und vielen mehr verwalten - und Sie können diese ALLE gleichzeitig über das gleiche Singleton-Objekt ausführen - die leicht zugänglich ist, in einem bekannten Zustand zu einem bestimmten Zeitpunkt in dem Code, in den Sie sie einstecken. Sie können sogar mehrere Sitzungen mit mehreren verschiedenen APIs / Diensten von Drittanbietern für den GLEICHEN Benutzer in Ihrer eigenen Website / Anwendung erstellen und mit ihnen alles tun, was Sie möchten.
Natürlich kann all dies auch mit herkömmlichen Methoden unter Verwendung normaler Klassen und Objekte abgeglichen werden - der Haken dabei ist, dass Singleton aufgeräumter und ordentlicher ist und daher im Vergleich zur herkömmlichen Verwendung von Klassen / Objekten in solchen Situationen leichter zu handhaben / zu testen ist.
- Menschen, die sich schnell entwickeln müssen
Das global ähnliche Verhalten von Singletons erleichtert das Erstellen von Code jeder Art mit einem Framework, das eine Sammlung von Singletons enthält, auf denen aufgebaut werden kann. Sobald Sie Ihre Singleton-Klassen gut erstellt haben, sind die etablierten, ausgereiften und festgelegten Methoden leicht verfügbar und verfügbar überall und jederzeit konsistent einsetzbar. Es dauert einige Zeit, um Ihre Klassen zu reifen, aber danach sind sie absolut solide und konsistent und nützlich. Sie können so viele Methoden in einem Singleton verwenden, wie Sie möchten. Dies erhöht zwar den Speicherbedarf des Objekts, spart jedoch viel mehr Zeit für eine schnelle Entwicklung - eine Methode, die Sie in einer bestimmten Instanz von nicht verwenden Eine Anwendung kann in einer anderen integrierten Anwendung verwendet werden, und Sie können einfach eine neue Funktion festlegen, die der Client / Chef / Projektmanager mit nur wenigen Änderungen anfordert.
Du hast die Idee. Kommen wir nun zu den Einwänden gegen Singletons und dem unheiligen Kreuzzug gegen etwas Nützliches :
- Der wichtigste Einwand ist, dass dies das Testen erschwert.
Und tatsächlich ist dies bis zu einem gewissen Grad der Fall, auch wenn es leicht gemildert werden kann, indem geeignete Vorsichtsmaßnahmen getroffen und Debugging-Routinen in Ihre Singletons codiert werden, mit der Erkenntnis, dass Sie einen Singleton debuggen werden. Aber sehen Sie, dies ist nicht zu verschieden von JEDER anderen Codierungsphilosophie / -methode / -muster, die es gibt - es ist nur so, dass Singletons relativ neu und nicht weit verbreitet sind, so dass die aktuellen Testmethoden mit ihnen vergleichsweise inkompatibel sind. Dies unterscheidet sich jedoch in keinem Aspekt der Programmiersprachen - unterschiedliche Stile erfordern unterschiedliche Ansätze.
Ein Punkt, bei dem dieser Einwand insofern unbegründet ist, als er die Tatsache ignoriert, dass die Gründe, aus denen Anwendungen entwickelt wurden, nicht für das „Testen“ sind und das Testen nicht die einzige Phase / der einzige Prozess ist, die in eine Anwendungsentwicklung einfließen. Anwendungen werden für den Produktionseinsatz entwickelt. Und wie ich im Abschnitt "Wer braucht Singletons?" Erklärt habe, können Singletons die Komplexität, einen Code mit und INNERHALB vieler verschiedener Codebasen / Anwendungen / Dienste von Drittanbietern funktionieren zu lassen, erheblich reduzieren. Die Zeit, die beim Testen verloren gehen kann, ist die Zeit, die bei der Entwicklung und Bereitstellung gewonnen wird. Dies ist besonders nützlich in Zeiten der Authentifizierung / Anwendung / Integration von Drittanbietern - Facebook, Twitter, OpenID, viele mehr und wer weiß, was als nächstes kommt.
Obwohl es verständlich ist, arbeiten Programmierer je nach Karriere unter sehr unterschiedlichen Umständen. Und für Leute, die in relativ großen Unternehmen mit definierten Abteilungen arbeiten und unterschiedliche, definierte Software / Anwendungen auf komfortable Weise und ohne das bevorstehende Schicksal von Budgetkürzungen / Entlassungen und die damit verbundene Notwendigkeit, eine Menge Dinge mit vielen verschiedenen Dingen zu erledigen, erledigen Eine billige / schnelle / zuverlässige Mode, Singletons scheinen nicht so notwendig zu sein. Und es kann sogar ein Ärgernis / Hindernis für das sein, was sie BEREITS haben.
Aber für diejenigen, die in den schmutzigen Gräben der "agilen" Entwicklung arbeiten müssen und viele verschiedene (manchmal unvernünftige) Anforderungen von ihrem Kunden / Manager / Projekt implementieren müssen, sind Singletons aus zuvor erläuterten Gründen eine Rettung.
- Ein weiterer Einwand ist, dass der Speicherbedarf höher ist
Da für jede Anforderung von jedem Client ein neuer Singleton vorhanden ist, kann dies ein Einwand für PHP sein. Bei schlecht konstruierten und verwendeten Singletons kann der Speicherbedarf einer Anwendung höher sein, wenn viele Benutzer zu einem bestimmten Zeitpunkt von der Anwendung bedient werden.
Dies gilt jedoch für JEDEN Ansatz, den Sie beim Codieren von Dingen verfolgen können. Die Fragen, die gestellt werden sollten, sind: Sind die Methoden, Daten, die von diesen Singletons gespeichert und verarbeitet werden, unnötig? Wenn sie für viele der Anforderungen erforderlich sind, die die Anwendung erhält, werden diese Methoden und Daten auch dann in Ihrer Anwendung in der einen oder anderen Form über den Code vorhanden sein, wenn Sie keine Singletons verwenden. Es wird also eine Frage, wie viel Speicher Sie sparen, wenn Sie ein traditionelles Klassenobjekt 1/3 in die Codeverarbeitung initialisieren und es 3/4 darin zerstören.
Auf diese Weise wird die Frage ziemlich irrelevant - es sollte KEINE unnötigen Methoden geben, Daten, die in Objekten in Ihrem Code enthalten sind - unabhängig davon, ob Sie Singletons verwenden oder nicht. Dieser Einwand gegen Singletons wird insofern sehr lustig, als davon ausgegangen wird, dass es unnötige Methoden und Daten in den Objekten gibt, die aus den von Ihnen verwendeten Klassen erstellt wurden.
- Einige ungültige Einwände wie "macht die Aufrechterhaltung mehrerer Datenbankverbindungen unmöglich / schwieriger"
Ich kann diesen Einwand nicht einmal verstehen, wenn alles, was man braucht, um mehrere Datenbankverbindungen, mehrere Datenbankauswahlen, mehrere Datenbankabfragen und mehrere Ergebnismengen in einem bestimmten Singleton aufrechtzuerhalten, sie nur in Variablen / Arrays im Singleton hält, solange sie werden gebraucht. Dies kann so einfach sein, wie sie in Arrays zu halten, obwohl Sie jede Methode erfinden können, die Sie verwenden möchten, um dies zu bewirken. Aber lassen Sie uns den einfachsten Fall untersuchen, die Verwendung von Variablen und Arrays in einem bestimmten Singleton:
Stellen Sie sich vor, das Folgende befindet sich in einem bestimmten Datenbank-Singleton:
$ this -> connection = array (); (falsche Syntax, ich habe es einfach so eingegeben, um Ihnen das Bild zu geben - die richtige Deklaration der Variablen lautet public $ connection = array (); und ihre Verwendung ist natürlich $ this-> connection ['connectionkey'])
Auf diese Weise können Sie mehrere Verbindungen gleichzeitig in einem Array einrichten und beibehalten. Gleiches gilt für Abfragen, Ergebnismengen usw.
$ this -> query (QUERYSTRING, 'queryname', $ this-> connection ['Participulrconnection']);
Das kann einfach eine Abfrage an eine ausgewählte Datenbank mit einer ausgewählten Verbindung durchführen und einfach in Ihrer speichern
$ this -> Ergebnisse
Array mit dem Schlüssel 'Queryname'. Natürlich müssen Sie dafür Ihre Abfragemethode codieren lassen - was trivial ist.
Auf diese Weise können Sie praktisch unendlich viele verschiedene Datenbankverbindungen und Ergebnismengen verwalten (sofern die Ressourcenbeschränkungen dies natürlich zulassen), so oft Sie sie benötigen. Und sie stehen JEDEM Code an einem bestimmten Punkt in einer bestimmten Codebasis zur Verfügung, in die diese Singleton-Klasse instanziiert wurde.
Natürlich müssten Sie natürlich die Ergebnismengen und Verbindungen freigeben, wenn sie nicht benötigt werden - aber das versteht sich von selbst und ist nicht spezifisch für Singletons oder andere Codierungsmethoden / -stile / -konzepte.
An diesem Punkt können Sie sehen, wie Sie mehrere Verbindungen / Status zu Anwendungen oder Diensten von Drittanbietern in demselben Singleton verwalten können. Nicht so anders.
Kurz gesagt, Singleton-Muster sind letztendlich nur eine andere Methode / Stil / Philosophie, mit der man programmieren kann, und sie sind genauso nützlich wie JEDE andere, wenn sie an der richtigen Stelle und auf die richtige Weise verwendet werden. Welches ist nicht anders als alles.
Sie werden feststellen, dass in den meisten Artikeln, in denen Singletons verprügelt werden, auch Hinweise darauf enthalten sind, dass "Globale" "böse" sind.
Seien wir ehrlich - ALLES, was nicht richtig benutzt, missbraucht, missbraucht wird, ist böse. Das ist nicht auf irgendeine Sprache, irgendein Kodierungskonzept, irgendeine Methode beschränkt. Wenn Sie jemanden sehen, der pauschale Aussagen wie "X ist böse" macht, laufen Sie vor diesem Artikel davon. Die Chancen stehen sehr hoch, dass es das Produkt einer eingeschränkten Sichtweise ist - auch wenn die Sichtweise das Ergebnis jahrelanger Erfahrung in etwas Bestimmtem ist -, was im Allgemeinen das Ergebnis einer zu starken Arbeit in einem bestimmten Stil / einer bestimmten Methode ist - einem typischen intellektuellen Konservatismus.
Dafür können endlose Beispiele angeführt werden, die von "Globals sind böse" bis zu "Iframes sind böse" reichen. Vor ungefähr 10 Jahren war es Häresie, sogar die Verwendung eines Iframes in einer bestimmten Anwendung vorzuschlagen. Dann kommt Facebook, iframes überall und schau, was passiert ist - iframes sind nicht mehr so böse.
Es gibt immer noch Menschen, die hartnäckig darauf bestehen, dass sie "böse" sind - und manchmal auch aus gutem Grund -, aber wie Sie sehen, besteht ein Bedürfnis, wenn Iframes dieses Bedürfnis erfüllen und gut funktionieren, und deshalb bewegt sich die ganze Welt einfach weiter.
Das wichtigste Kapital eines Programmierers / Programmierers / Softwareentwicklers ist ein freier, offener und flexibler Geist.