Datenbankzugriffsschicht ohne mit Singletons um sich zu schmeißen?



  • dot schrieb:

    aaaaaaaaaüö schrieb:

    Wann würdet ihr dann überhaupt Singletons verwenden? Garnie?

    Exakt, zumindest nicht für einen globalen Zustand. Dafür ist und war Singleton nie gedacht (falls dir aufgefallen ist hab ich immer von "Singleton" gesprochen, die "" waren durchaus Absicht).

    Die Frage bleibt. Wann würdet ihr dann überhaupt Singletons verwenden? Bis jetzt war ein Singleton für dich für garnichts gedacht.



  • Korrekt. Potentielle Anwendungsfälle für ein Singleton sind extrem selten und man kann drüber diskutieren inwiefern der Pattern überhaupt den Grundfesten der OOP widerspricht. Ich hab schon viele Singletons gesehen und jeder einzige davon war ein Designfehler. Singleton wird eben ständig als bunte Verpackung für eine globale Variable verwendet. Das ist aber nicht wofür Singleton gedacht ist und nur weil man die globale Variable nichtmehr direkt als solche erkennt ist sie noch lange nicht verschwunden. Die Tatsache dass ein globaler Zugriffspunkt existiert ist eine Konseqzenz aber nicht der Sinn des Singleton Pattern.



  • volkard schrieb:

    aaaaaaaaaüö schrieb:

    Was hinder Teammember 46 daran dein Programm so zu erweitern und 2 DatabaseConnections anzulegen?

    Nichts. Und das ist normalerweise absolut ok.
    Was hindert den Programmierer daran, eine zweite Datei zu öffnen?
    Klar darf man nicht zweimal zugleich in die selbe Datei schreiben.
    Das war aber nie ein Problem.

    Verwendest du private und protected oder programmierst du wie in Python in C++?



  • dot schrieb:

    Korrekt. Es gibt extrem wenige Anwendungen für Singleton und man kann drüber diskutieren inwiefern der Pattern überhaupt den Grundfesten der OOP widerspricht. Ich hab schon viele Singletons gesehen und jeder einzige davon war ein Designfehler. Singleton wird eben ständig als bunte Verpackung für eine globale Variable verwendet. Das ist aber nicht wofür Singleton gedacht ist und nur weil man die globale Variable nichtmehr direkt als solche erkennt ist sie noch lange nicht verschwunden. Die Tatsache dass ein globaler Zugriffspunkt existiert ist eine Konseqzenz aber nicht der Sinn des Singleton Pattern.

    Wie kannst du behaupten, du weißt wofür Singletons gedacht sind, wenn du behauptest, dass sie für nichts gedacht sind?



  • Ich verwende eigentlich ausschließlich private und public, protected nur recht selten und wenn dann auf keinen Fall für Datenmember.



  • aaaaaaaaaüö schrieb:

    Wie kannst du behaupten, du weißt wofür Singletons gedacht sind, wenn du behauptest, dass sie für nichts gedacht sind?

    Ich habe nicht behauptet dass Singletons für nichts gedacht sind, nur dass potentielle Anwendungsfälle für ein Singleton extrem selten sind. Woher ich weiß wofür Singletons gedacht sind? Ganz einfach:

    Design Patterns, S. 127 schrieb:

    Use the Singleton pattern when

    • There must be exactly one instance of a class [...]
    • [...]

    Mit dem Singleton Pattern drückst du aus dass es eine inhärente Eigenschaft des Typs ist dass es nur eine einzige Instanz geben darf. Genau das sicherzustellen ist der Zweck des Singleton Pattern (hence the name). Und das ist etwas grundlegend Anderes als "ich brauch nur eine Instanz". Und mit globalen Variablen hats noch weniger was zu tun.

    Das Problem ist nicht das Singleton Pattern an sich sondern die Tatsache dass es praktisch überall, verhältnismäßig viel zu oft und dabei ständig falsch verwendet wird. Nämlich als "Ersatz" für eine globale Variable.



  • Tja, das ist genau der Fall den ich beschreiben hab. Wenn es nur eine DatabaseConnection geben darf, damit DatabaseConnection funktioniert, dann mach ich halt ein Singleton draus. Das hat garnichts mit Ersatz für globale Variable zu tun. Da würde ich mal behaupten, dass es eher ein Designfehler ist, diese eine DatabaseConnection genau einmal anzulegen und überall rumzugeben und wenn das einer nicht macht geht es nicht mehr.



  • aaaaaaaaaüö schrieb:

    Wenn es nur eine DatabaseConnection geben darf, damit DatabaseConnection funktioniert [...]

    Warum sollte es nur eine DatabaseConnection geben dürfen damit diese funktioniert, klingt irgendwie nach ziemlicher Frickelei!?

    Wenn du mich fragst widerspricht das dem Konzept einer DatabaseConnection mir vorzuschreiben wie oft ich zu welcher Datenbank zu verbinden habe. Eine DatabaseConnection soll konzeptuell gefälligst auch einfach nur das sein: Eine Verbindung zu einer Datenbank. Und wenn meine Anwendung nur eine braucht dann macht sie nur eine und wenn sie mit 10 verschiedenen Datenbanken arbeiten will dann macht sie 10. Und wenn diese eine konkrete XYZDatabaseConnection da intern mehrere Verbindungen offen hält und meine Anfragen auf diese verteilt weil dies auf dieser konkreten Verbindung zu diesem konkreten Server in Kombination mit diesem konkreten Datenbanksystem momentan der performanteste Weg ist dann soll sie das bitteschön intern machen. Das ist ihr Job. Von außen interessieren mich solche Implementierungsdetails nicht. Und wenn ich Code hab der mit einer speziellen Datenbank arbeitet dann soll der diese spezielle DatabaseConnection verwenden. Nirgendwo brauch ich da ein Singleton oder gewinne auch nur irgendwas durch die Verwendung eines solchen.



  • dot schrieb:

    aaaaaaaaaüö schrieb:

    Wenn es nur eine DatabaseConnection geben darf, damit DatabaseConnection funktioniert [...]

    Warum sollte es nur eine DatabaseConnection geben dürfen damit diese funktioniert, klingt irgendwie nach ziemlicher Frickelei!?

    Wenn du mich fragst widerspricht das dem Konzept einer DatabaseConnection mir vorzuschreiben wie oft ich zu welcher Datenbank zu verbinden habe. Eine DatabaseConnection soll konzeptuell gefälligst auch einfach nur das sein: Eine Verbindung zu einer Datenbank. Und wenn meine Anwendung nur eine braucht dann macht sie nur eine und wenn sie mit 10 verschiedenen Datenbanken arbeiten will dann macht sie 10.

    Ob es eine oder 10 Datenbanken gibt legt man in Pflichtenheften oder ähnlichem fest. Außerdem hatten wir gerade vorher gesagt, dass es nur eine geben soll und du wolltest die dann lieber überall herrumreichen, statt ein Singleton zu verwenden. Davon bin ich aus gegangen. Wieso sollte das "Überall rumreichen" Design überhaupt irgendwas bringen, wenn man, warum auch immer, plötzlich zwei Datenbanken braucht? Dann musst du überall zwei DatabaseConnections als Parameter einführen, wenn du ein irgendeiner unteren Funktion beide Datenbanken brauchst.



  • aaaaaaaaaüö schrieb:

    volkard schrieb:

    aaaaaaaaaüö schrieb:

    Was hinder Teammember 46 daran dein Programm so zu erweitern und 2 DatabaseConnections anzulegen?

    Nichts. Und das ist normalerweise absolut ok.
    Was hindert den Programmierer daran, eine zweite Datei zu öffnen?
    Klar darf man nicht zweimal zugleich in die selbe Datei schreiben.
    Das war aber nie ein Problem.

    Verwendest du private und protected oder programmierst du wie in Python in C++?

    Du willst doch gar nicht dazulernen, sondern nur provozieren.


Anmelden zum Antworten