Singleton macht im Web bei PHP Verwendung keinen Sinn?
Zerko
- php
Mahlzeit....
Vor einiger Zeit habe ich im Rahmen eines Talks eines namenhaften Experten aus Deutschland eine Aussage gehört, welche mich relativ erschüttert hat.
Genauer gesagt handelte es sich um PHP Design Patterns und um das Singleton Muster. Folgende Aussagen wurden getroffen:
Würde mich über eure Feedback freuen :)
Gruß,
Zerko
Hallo,
Singleton kommt aus Multithreading und ist in PHP daher kein echter Singleton nach dem ursprünglichen Sinn - sollte deshalb in PHP nicht verwendet werden
Singleton kommt aus Multithreading? Sorry, das ist Quark. Wenn man Multithreading betreibt, muss man bei Singletons besonders aufpassen, damit man nicht aus Versehen zwei davon bekommt oder irgend etwas anderes boeses passiert (siehe den Wikipedia-Artikel dazu) - aber vom Prinzip her werden Singletons grundsaetzlich auch in Programmen ohne Threading eingesetzt.
Letztendlich ist ein Singleton nur eine extravagante Moeglichkeit, globale Daten im Programm zu speichern - analog zu "normalen" globalen Variablen. Der Vorteil von Singletons ist, gegenueber globalen Variablen, dass man durch das OOP eine bessere Kapselung der Daten erreicht.
Natuerlich bleiben auch bei einem Singleton alle anderen Nachteile von globalen Variablen erhalten, d.h. es gibt sehr gute Gruende sich zweimal zu ueberlegen, ob man das wirklich einsetzen will oder nicht lieber auf etwas wie Dependency Injection setzt. Das hat aber nichts mit Threading zu tun.
Zu einem anderen Aspekt der obigen Aussage moechte ich nur folgendes sagen: Es gibt etliche andere Programmierkonzepte, die in PHP nicht 1:1 so sind, wie sie urspruenglich waren - das Argument, dass das in PHP anders ist, ist aber noch LANGE kein Grund, es in PHP nicht einzusetzen. Das Kriterium sollte doch letztendlich sein: Womit kann ich den besten, simpelsten, effizientesten, wartbarsten, etc. Code schreiben an dieser Stelle? Und _das_ sollte man einsetzen - und nicht eben auf Grund irgend einer puristischen Ideologie suboptimalen Code schreiben.
Abstrakte Methoden und Klassen sollten nicht verwendet werden
Wenn dieser "Experte" keine Begruendung dafuer geliefert hat, kannst Du das getrost ignorieren. Zwar braucht man meiner persoenlichen Erfahrung nach abstrakte Methoden und Klassen in PHP sehr selten (weil man das oft durch Interfaces besser machen kann), aber das heisst nicht, dass sie nicht grundsaetzlich nuetzlich sind. Und es ist garantiert nichts verwerfliches dabei, die zu verwenden.
Zusammengefasst: Ich halte beide Aussagen fuer Quatsch.
Viele Gruesse,
Christian
Moin!
Singleton kommt aus Multithreading und ist in PHP daher kein echter Singleton nach dem ursprünglichen Sinn - sollte deshalb in PHP nicht verwendet werden
Zu einem anderen Aspekt der obigen Aussage moechte ich nur folgendes sagen: Es gibt etliche andere Programmierkonzepte, die in PHP nicht 1:1 so sind, wie sie urspruenglich waren - das Argument, dass das in PHP anders ist, ist aber noch LANGE kein Grund, es in PHP nicht einzusetzen. Das Kriterium sollte doch letztendlich sein: Womit kann ich den besten, simpelsten, effizientesten, wartbarsten, etc. Code schreiben an dieser Stelle? Und _das_ sollte man einsetzen - und nicht eben auf Grund irgend einer puristischen Ideologie suboptimalen Code schreiben.
Singletons sind böse, gerade weil sie ein angehübschter Container für globalen Zustand sind. Man kann damit arbeiten, klar. Globale Variablen zerstören ja auch nicht instant das bekannte Universum. Aber sie haben eben den Nachteil, dass sie extrem schlecht testbar sind, und dass sie in der Regel irgendeinen eher obskuren globalen Zustand enthalten, den man nicht auf den ersten Blick erkennen kann. Und der sich, wenn irgendwas anderes, was auf diesen globalen Zustand auch Einfluss genommen hat, plötzlich wegfällt, vollkommen unerwartet verändern kann.
Deshalb: Hände weg von Singletons, sie fördern undurchsichtige, schwer testbare Programmstrukturen.
Und obendrein, das ist natürlich auch richtig, kann PHP gar keine wirklich ultra-globalen Singletons liefern, jegliches Singleton ist immer nur im Rahmen der einen gerade laufenden Skript-Instanz einzigartig - parallele Requests erzeugen in parallelen Skript-Instanzen immer parallele Instanzen des Singletons.
Abstrakte Methoden und Klassen sollten nicht verwendet werden
Wenn dieser "Experte" keine Begruendung dafuer geliefert hat, kannst Du das getrost ignorieren. Zwar braucht man meiner persoenlichen Erfahrung nach abstrakte Methoden und Klassen in PHP sehr selten (weil man das oft durch Interfaces besser machen kann), aber das heisst nicht, dass sie nicht grundsaetzlich nuetzlich sind. Und es ist garantiert nichts verwerfliches dabei, die zu verwenden.
Interfaces sind nett, wenn man für seine zu implementierenden Klassen vorschreiben will, welche Methoden zu implementieren sind, aber nicht, mit welchem Code das zu geschehen hat.
Abstrakte Klassen eignen sich ganz hervorragend dann, wenn man seinen zu implementierenden Klassen obendrein noch eine gemeinsame nutzbare Codebasis mit an die Hand geben will, und lediglich einzelne Methoden individuell implementiert werden sollen.
Beide Arbeitsweisen gehören für mich absolut zum Handwerkszeug vernünftiger OOP. Insofern ist diese Aussage ohne Begründung nicht viel wert. Und selbst mit Begründung hätte ich Zweifel, ob ich der Meinung zustimmen könnte.
- Sven Rautenberg
Hallo Sven,
Singletons sind böse, gerade weil sie ein angehübschter Container für globalen Zustand sind. Man kann damit arbeiten, klar. Globale Variablen zerstören ja auch nicht instant das bekannte Universum. Aber sie haben eben den Nachteil, dass sie extrem schlecht testbar sind, und dass sie in der Regel irgendeinen eher obskuren globalen Zustand enthalten, den man nicht auf den ersten Blick erkennen kann. Und der sich, wenn irgendwas anderes, was auf diesen globalen Zustand auch Einfluss genommen hat, plötzlich wegfällt, vollkommen unerwartet verändern kann.
Deshalb: Hände weg von Singletons, sie fördern undurchsichtige, schwer testbare Programmstrukturen.
Als Faustregel ist das sicherlich in Ordnung, ich würde das persönlich aber lange nicht so dogmatisch sehen. (Anmerkung: Außer, es handelt sich um Bibliotheken. Globaler State hat in Bibliotheken nichts verloren.)
Und obendrein, das ist natürlich auch richtig, kann PHP gar keine wirklich ultra-globalen Singletons liefern, jegliches Singleton ist immer nur im Rahmen der einen gerade laufenden Skript-Instanz einzigartig - parallele Requests erzeugen in parallelen Skript-Instanzen immer parallele Instanzen des Singletons.
Wenn ich eine Desktopapplikation zweimal ausführe, die mit Singletons geschrieben wurde, erhalte ich in jeder Instanz natürlich auch ein anderes Singleton. Insofern gibt es 'ultra-globale' Singletons schlichtweg nicht. Irgendwo ist immer eine Grenze.
Zwar braucht man meiner persoenlichen Erfahrung nach abstrakte Methoden und Klassen in PHP sehr selten (weil man das oft durch Interfaces besser machen kann), aber das heisst nicht, dass sie nicht grundsaetzlich nuetzlich sind. Und es ist garantiert nichts verwerfliches dabei, die zu verwenden.
[Erklärung zu Interfaces, abstrakte Klassen]
Beide Arbeitsweisen gehören für mich absolut zum Handwerkszeug vernünftiger OOP. Insofern ist diese Aussage ohne Begründung nicht viel wert. Und selbst mit Begründung hätte ich Zweifel, ob ich der Meinung zustimmen könnte.
Deinen Erklärungen zu Interfaces / abstrakten Klassen kann ich generell zustimmen, meine Aussage "durch Interfaces besser" bezog sich lediglich auf "meine persönliche Erfahrung": In 99% aller Fälle, in denen ich irgendwie in PHP eine abstrakte Klasse angefangen habe zu schreiben, habe ich später festgestellt, dass ich das, was ich wollte, eigentlich besser mit einem Interface hätte lösen können. Das hat nichts damit zu tun, dass ich abstrakte Klassen nicht mag, ich hab auch kein Problem, sie zu verwenden, wenn sie das beste Mittel zur Wahl sind - aber zumindest in den Problemstellungen, die ich bisher in PHP gelöst habe (andere Programmiersprachen sind etwas anderes!), war meine Erfahrung eben die, dass ich so gut wie nie eine abstrakte Klasse gebraucht habe.
Viele Grüße,
Christian