AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi [Tutorial] Singletons in Delphi
Tutorial durchsuchen
Ansicht
Themen-Optionen

[Tutorial] Singletons in Delphi

Ein Tutorial von MisterNiceGuy · begonnen am 29. Jan 2010 · letzter Beitrag vom 1. Feb 2010
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von MisterNiceGuy
MisterNiceGuy
Registriert seit: 1. Jul 2003
Hallo alle miteinander,

ich habe heute mal ein kurzes Tutorial über Singletons in Delphi geschrieben.
Das ganze umfasst eine kurze Erklärung über den Begriff "Singleton" und eine
Beispielimplementierung. Ich habe versucht das ganze so einfach wie möglich zu
halten

Runterladen kann man das ganze hier und auf meinem Blog: klick
Angehängte Dateien
Dateityp: pdf singletons_in_delphi_139.pdf (17,2 KB, 633x aufgerufen)
Wenn mich jemand sucht, ich bin im Kühlschrank!

Informationen über das Duale Studium
www.jofre.de
 
Benutzerbild von stoxx
stoxx
 
#11
  Alt 30. Jan 2010, 06:58
in neueren Delphi-Versionen würde man aber statt der Variablen in der Unit eine class var benutzen ..

Delphi-Quellcode:
TBundeskanzler = class
private
  class var Bundeskanzler : TBundeskanzler;

end
;
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin
 
#12
  Alt 30. Jan 2010, 13:35
Zitat von TBx:
ähm, räusper ...
das widerspricht sich total. Von einem Singelton kann es nicht mehr als eine Instanz geben, sonst wäre es ja keines .....
Der Witz am Singleton ist doch, dass man es eben doch leicht so abändern kann, dass man mehrer Instanzen zulassen kann. Ansonsten könnte man ja auch einfach alles klassenseitig implementieren.
Leo S.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

 
Delphi 2007 Professional
 
#13
  Alt 30. Jan 2010, 15:49
Singletons sollte man durchaus kritisch sehen
Letztendlich handelt es sich dabei um globale Objekte; also im Prinzip das Gleiche wie globale Variablen.
Globale Variablen und Singletons machen uns Programmierer das Leben schwer, weil sie unangenehme Seiteneffekte hervorrufen.

Wer Englisch versteht sollte sich unbedingt mal dieses Video The Clean Code Talks - "Global State and Singletons" auschauen.
Es könnte die Meinung über Singletons grundlegend ändern...
  Mit Zitat antworten Zitat
alzaimar

 
Delphi 2007 Enterprise
 
#14
  Alt 30. Jan 2010, 16:42
Ich finde das Tutorial gut, aber besser wäre es, wenn es sich noch an die Styleguidelines bezüglich Nomenklatur halten würde.
Felder beginnen mit 'f', keine 'ungarische Notation' bzw. Verklausulierung des Datentyps, und Underscores sollten vermieden werden.

Zum Google-Video fällt mir nur ein, das es natürlich wichtig ist, auf die Gefahren hinzuweisen, die sich hinter solchen Praktiken verbergen, aber man muss schon die richtigen Schlüsse daraus ziehen.
Die Dogmen der 'modernen' Softwareentwicklung sind wirklich sinnvoll:
1. Globale Variablen sind böse. Mein Programm ist eine globale Variable, ebenso alle Formulare und Datenmodule.
2. Goto's sind böse. Mein Programm besteht letztendlich aus (fast) nichts anderem.
3. Singletons sind böse. Neben dem Programm verzichte ich damit auf Caches, Dictionaries, Logger, Drucker, Festplatten und Bildschirme etc.. Oh, und letztendlich auf den User.

Also ich weiss nicht. Ich LIEBE es, gegen Dogmen zu verstoßen. Und verdiene mein Geld damit. Allerdings auch nur deshalb, weil ich nicht inflatorisch gegen Dogmen verstoße.

Ach so, bei jedem Argument gehört ein und ein dahinter,

Zurück zum Tutorial: Ich würde folgenden Gegenvorschlag machen:
Delphi-Quellcode:
unit SingletonUnit;
interface
type
  TSingleton = class
  protected
  // Verbergen der dem Singleton-Prinzip widersprechenden Methoden, so kann man dann nicht mal 'aus Versehen'
  // ein Singleton freigeben.
    constructor Create;
    destructor Destroy;
    procedure Free;
  public
  // Es ist nur das sichtbar, was das Singleton kann
    procedure PublicMethod();
  end;

// Automatische 'Lazy initialization'
function Singleton: TSingleton;

implementation
var
  SingletonInstance: TSingleton;

function Singleton: TSingleton;
begin
  if SingletonInstance = nil then
    SingletonInstance := TSingleton.Create;
  Result := SingletonInstance;
end;

{ TSingleton }

constructor TSingleton.Create;
begin
  inherited;
end;

destructor TSingleton.Destroy;
begin
  inherited;
end;

procedure TSingleton.Free;
begin
  inherited Free;
end;

procedure TSingleton.PublicMethod;
begin
  // Do Something;
end;

initialization
  SingletonInstance := nil;
finalization
  SingletonInstance.Free;
end.
  Mit Zitat antworten Zitat
Benutzerbild von MisterNiceGuy
MisterNiceGuy

 
Delphi 7 Personal
 
#15
  Alt 31. Jan 2010, 02:31
Hi, danke für eure Hinweise

@mr2: InterlockedCompareExchange funktioniert nicht mit Create als 2. Parameter. Hast du das getestet?
Jonas
  Mit Zitat antworten Zitat
schlecki

 
Delphi XE2 Enterprise
 
#16
  Alt 31. Jan 2010, 14:39
Hallo,

nochmal zum Problem mit dem Konstruktor: Es kann nichts mehr versteckt werden, was bereits in einer Elternklasse veröffentlich wurde. Man kann dann zwar nicht genau diesen Konstruktor aufrufen, trotzdem ist es möglich, eine Instanz dieser Klasse zu erzeugen.

Besser ist es, wenn man soetwas macht:

Delphi-Quellcode:
TSingleton = class(TObject)
private
  constructor _Create();
public
  constructor Create();
end;

{...}

constructor TSingleton.Create();
begin
  raise Exception.Create('Use TSingleton.getInstance!');
end;

constructor TSingleton._Create();
begin
  inherited Create;
  {...}
end;
Auf diesem Weg ist es nicht mehr möglich, eine Instanz dieser Klasse ohne den eigenen Konstruktor zu erzeugen.
  Mit Zitat antworten Zitat
alzaimar

 
Delphi 2007 Enterprise
 
#17
  Alt 31. Jan 2010, 17:23
Soweit ich das überschaue, bekommt man soetwas nicht bullet-proof hin, d.h. es ist immer möglich, das jemand mutwillig das Konzept unterminiert, z.B. durch Typecasting. Aber ich denke, darum muss man sich nicht kümmern, das ist imho etwas spitzfindig, denn wir entwickeln Klassen und Konzepte nicht für unsere Feinde, sondern Kollegen.

Es geht doch eher darum, das man ein Singleton nicht mehrfach instantiiert oder versehentlich freigibt, weil man das Konzept nicht begriffen hat, und nicht, das man es unter allen umständen verbietet. Dann würde ich -glaube ich- einen Sentinel schreiben, der alle Instanzen außer der ersten gnadenlos abschießt und den (End-)Benutzer mit einer entsprechenden Meldung verwirrt. Natürlich könnte man auch das wieder umgehen usw. Also, WTF.
  Mit Zitat antworten Zitat
schlecki

 
Delphi XE2 Enterprise
 
#18
  Alt 31. Jan 2010, 17:34
Darum gehts hier doch gar nicht. Wenn man nicht weiß, dass es sich um ein Singleton handelt, bekommt man es auch nicht mit, wenn man es mal mit TSingleton.Create aufruft.
Bei mir kommt eben ein Hinweis, wie man die Klasse richtig verwendet. Auch unter Kollegen kann so ein Hinweis ganz nett sein, bevor man ev. stundenlang den Fehler sucht, warum die Konfiguration oder sowas nicht korrekt geschrieben wird.

Edith sagt:

Hast du eigentlich schon mal folgendes probiert?

Delphi-Quellcode:
type
  TSingleton = class(TObject)
  private
    constructor Create;
  end;
und dann in einer anderen Unit(!):
Delphi-Quellcode:
var
  s: TSingleton;
begin
  s := TSingleton.Create;
end;
Das kompiliert ganz wunderbar, nur der aufgerufene Konstruktor ist der von TObject. Wunderbar, was? Und das alles ganz ohne Typecast.

Und nochwas, ich versuche, meine Sachen immer so sicher wie möglich zu machen. Warum? Vielleicht habe ich ja eine Bibliothek oder Komponente erstellt, die ich mit Sourcecode weiterverteilen möchte. Und dann macht man es den Benutzern doch wesentlich einfacher, die eigene Arbeit korrekt zu verwenden.
  Mit Zitat antworten Zitat
alzaimar

 
Delphi 2007 Enterprise
 
#19
  Alt 1. Feb 2010, 05:38
Echt? Ich hab nur in der Codevervollständigung keinen Vorschlag mehr für Create gefunden, glaub ich jedenfalls.
Wenn das gar nicht stimmt und nichts bringt, ist es natürlich für die Katz.

Kennst Du denn eine absolut saubere Implementierung eines Singletons in Delphi? Ich glaub, das geht gar nicht.
Delphi ist eben keine moderne Programmiersprache, in C# ist es mit einigen wenigen Zeilen Code getan.
  Mit Zitat antworten Zitat
schlecki

 
Delphi XE2 Enterprise
 
#20
  Alt 1. Feb 2010, 07:59
Zitat von alzaimar:
Kennst Du denn eine absolut saubere Implementierung eines Singletons in Delphi? Ich glaub, das geht gar nicht.
Delphi ist eben keine moderne Programmiersprache, in C# ist es mit einigen wenigen Zeilen Code getan.
Eine absolut saubere Implentierung kenn ich auch nicht. Aber im Normalfall reicht die Version mit der Exception im Create.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz