Singleton einmal anders


Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).

Moderatoren: Jan, Steff

Singleton einmal anders

Beitragvon ralf.wenzel » 31.12.2018, 10:23

Moin,

das Standard-Singleton ist definiert durch eine öffentliche, statische Methode GET_INSTANCE( ) und einem statischen privaten Attribut SINGLETON, das die Instanz enthält. GET_INSTANCE ( ) prüft nun, ob SINGLETON leer ist (wenn nicht, wird die Instanz erzeugt) und gibt den (nun in jedem Falle gefüllten Inhalt an den Aufrufer zurück.

Was spricht dagegen:

Im CLASS-CONSTRUCTOR( ) wird SINGLETON gefüllt, dann ist sie beim Aufruf von GET_INSTANCE( ) auf keinen Fall leer. So spart man sich das Prüfen und Erzeugen in GET_INSTANCE( ). Man könnte auch SINGLETON öffentlich und schreibgeschützt deklarieren, dann kann man sich auch GET_INSTANCE( ) schenken, denn spätestens beim ersten Lesezugriff auf das Attribut wird der Klassenkomstruktor aufgerufen.

Mir fallen ein paar Gegenargumente ein, auf welche kommt ihr?


Ralf
ralf.wenzel
Top Expert
 
Beiträge: 3306
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 201 mal
Ich bin: Freiberufler/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Singleton einmal anders

Beitragvon ewx » 31.12.2018, 13:57

Du kannst get_instance keine Parameter mehr mitgeben.
Ansonsten: warum nicht?
ewx
Top Expert
 
Beiträge: 3839
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 322 mal

Re: Singleton einmal anders

Beitragvon black_adept » 31.12.2018, 14:09

  • Dann ist's kein Singleton Design-Pattern mehr und manche Leute lieben Design-patterns.
  • GET_INSTANCE könnte Parameter beinhalten - dann müsste der Klassenkonstruktor für alle möglichen Parameterwertkombinationen was vorhalten und das statische Attribut wäre wahrscheinlich eine Tabelle. Und wenn die Anzahl der möglichen Parameterwerte Legion ist...
  • Es könnte sein, dass beim Aufruf des CC noch keine Instanz erzeugt werden kann sondern erst später ( warum auch immer ). Da du zig mal GET_INSTANCE aufrufen kannst könnte es auch mal eine Situation geben, wo es dann halt klappt
  • Es könnte sein, dass die Art des Singletons sich erst beim 1. echten Aufruf ergibt und dann fix ist
  • Die Klasse verwaltet mehr als ein Singleton, aber nicht alle werden zwangsläufig verwendet
  • Die Verwendung des korrekt implementierten Design-Patterns ohne Rücksicht auf Verluste ergibt politische und religiöse Vorteile
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de
black_adept
Top Expert
 
Beiträge: 3139
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 534 mal
Ich bin: Freiberufler/in

Re: Singleton einmal anders

Beitragvon ewx » 31.12.2018, 14:20

black_adept hat geschrieben:Die Klasse verwaltet mehr als ein Singleton, aber nicht alle werden zwangsläufig verwendet

Dann ist es m.E. kein Singleton mehr.
ewx
Top Expert
 
Beiträge: 3839
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 322 mal

Re: Singleton einmal anders

Beitragvon ralf.wenzel » 31.12.2018, 14:20

black_adept hat geschrieben:
  • Dann ist's kein Singleton Design-Pattern mehr und manche Leute lieben Design-patterns.
  • GET_INSTANCE könnte Parameter beinhalten - dann müsste der Klassenkonstruktor für alle möglichen Parameterwertkombinationen was vorhalten und das statische Attribut wäre wahrscheinlich eine Tabelle. Und wenn die Anzahl der möglichen Parameterwerte Legion ist...
  • Die Verwendung des korrekt implementierten Design-Patterns ohne Rücksicht auf Verluste ergibt politische und religiöse Vorteile



Auf den ersten und letzten Punkt bin ich auch gekommen — wobei ich eher praktische Vorteile sehe als religiöse. Denn wenn ich ein Pattern sehe, weiß ich gleich, wie es funktioniert, das weiß ich bei anderen Konstrukten nicht.

Ich hätte noch eines, verwandt mit deinem Mittleren: Ich kann nicht verschiedene get_instances für verschiedene Fälle vorhalten. Das ist meine Variante um nicht auf diskrete (also auf eine zählbare Grundgesamtheit beruhende) Parameter zurückzugreifen. So kann kann man den Fall abdecken, dass der Constructor diskrete Parameter erwartet (den man ja von außen nicht aufrufen kann, weil privat. So kann ich von der Klasse LCL_COLOR statt einer GET_INSTANCE( schwarz ) eine GET_INSTANCE_SCHWARZ( ) verwenden, ohne prüfen zu müssen, ob schwarz eine (zulässige) Farbe ist.

Außerdem - und das ist mein zentrales Argument - kann man eine so erzeugte Instanz nur auf Umwegen zurücksetzen, weil der Klassenkonstruktor nie wieder aufgerufen wird. Bei GET_INSTANCE muss ich nur die Instanz löschen, ohne dass der Aufrufer das wissen muss.

ewx hat geschrieben:
black_adept hat geschrieben:Die Klasse verwaltet mehr als ein Singleton, aber nicht alle werden zwangsläufig verwendet

Dann ist es m.E. kein Singleton mehr.


Das ist richtig. Das wäre ein Multiton, praktisch ein Singleton, bei dem das Attribut SINGLETON eine Tabelle ist. Hab ich auch schon verwendet, um die Instanzen verwalten zu können. Dazu muss ich wissen, welche es gibt.



Ralf *dankt für die Diskussion und wünscht allen einen guten Rutsch
ralf.wenzel
Top Expert
 
Beiträge: 3306
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 201 mal
Ich bin: Freiberufler/in


Zurück zu ABAP Objects®

  Aktuelle Beiträge   
Umrechnung Stück in KG
jetzt von wreichelt 2 Antw.
gelöst Sel.Screen in Subscreen - VA06
vor 16 Stunden von bapimueller 2 Antw.
gelöst Prüfen Konfiguration Kundenauftrag gene Type
vor 22 Stunden von mfromg 0 Antw.
Auswertung Orders erhalt per Mail oder FAX oder beides
vor 16 Stunden von ewx 2 Antw.
SAP und Gamification
Gestern von ewx 1 Antw.

  Ähnliche Beiträge beta
Singleton
17.01.2017, 18:29 von Hastalavista 11 Antw.
Singleton vs. statische Klasse
25.03.2015, 19:57 von a-dead-trousers 11 Antw.
gelöst Doppelklick funktioniert nur einmal... :(
29.04.2013, 22:41 von black_adept 3 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder