Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Verwenden von Pointern (https://www.delphipraxis.net/172360-verwenden-von-pointern.html)

Klaus01 29. Dez 2012 09:23

AW: Verwenden von Pointern
 
..ein Singleton hat den Charme, dass davon nur eine Instanz erstellen kann.
Von einer globalen Klasse können jede Menge Instanzen erstellt werden.

Grüße
Klaus

Furtbichler 29. Dez 2012 10:38

AW: Verwenden von Pointern
 
Zitat:

Zitat von Klaus01 (Beitrag 1196974)
Nutze das Singleton Pattern.
[DELPHI]
type
TDeineKlasse = class(TObject)
...

Bei meinem älteren Delphi (BDS 2006) hindert mich niemand daran, beliebig viele Instanzen der TDeineKlasse mit dem 'Create'-Konstruktor zu erstellen (obwohl der Konstruktor ja als privat deklariert ist).

Ich würde für ein Singleton eher so vorgehen:
Delphi-Quellcode:
type
   TSingleton = Class
   private
       class var fInstance: TSingleton;
       class var fRefCnt : Integer;
       class function NewInstance: TObject; Override;
       procedure FreeInstance; override;
    End;
implementation

{ TSingleton }

procedure TSingleton.FreeInstance;
begin
  if fRefCnt=1 then begin
    inherited FreeInstance;
    fInstance:=Nil;
  end;
  dec (fRefCnt);
end;

class function TSingleton.NewInstance: TObject;
begin
  if fInstance=Nil then
    fInstance := TSingleton(inherited NewInstance);
  Result := fInstance;
  inc(fRefCnt);
end;
end.
Dann muss ich gar nicht wissen, das das ein Singleton ist, sondern kann mir immer, wenn ich es brauche, eine Instanz erstellen. Die Objektlogik mappt das ja auf die eine Instanz. Zudem habe ich so keine Möglichkeit, mehrere Instanzen zu erstellen.

Ich persönlich halte das für sauberer, als umständlich über 'GetInstance' auf die globalen Daten zuzugreifen.

Bjoerk 29. Dez 2012 11:41

AW: Verwenden von Pointern
 
Alternative: Wenn die Forms nur modal angezeigt werden, könnte auch jede Form ihre eigene Instanz haben. Hierzu die Klasse von TPersitent ableiteten und in Settern die jeweils aktuellen Werte mit Assign kopieren.

Furtbichler 29. Dez 2012 14:45

AW: Verwenden von Pointern
 
Zitat:

Zitat von Bjoerk (Beitrag 1197047)
Alternative: Wenn die Forms nur modal angezeigt werden, könnte auch jede Form ihre eigene Instanz haben. Hierzu die Klasse von TPersitent ableiteten und in Settern die jeweils aktuellen Werte mit Assign kopieren.

Das ist aber von hinten durch die Brust ins Auge.

Bjoerk 29. Dez 2012 15:37

AW: Verwenden von Pointern
 
Zitat:

Zitat von Furtbichler (Beitrag 1197059)
Das ist aber von hinten durch die Brust ins Auge.

Würde ich einem Singleton ggf. dennoch vorziehen. Hast du mal Code mit Singletons gewartet? I can tell you.. Notfalls höchstens meine Variante #8.

Furtbichler 29. Dez 2012 19:41

AW: Verwenden von Pointern
 
Wo ist der unterschied zwischen einem 'zwangsweise' einmalig erzeugtem Objekt und einem, das per Konvention nur einmal erstellt wird (Form1, Application etc.)?

Beispiel: Ein Datenmodul wird nur einmal instantiiert und verwendet, obwohl es problemlos mehrere Instanzen geben könnte. Eine Singleton-Klasse dagegen sorgt dafür, das man nicht mehrere Instanzen erstellen *kann*.

Unterm Strich kommt jedoch das Gleiche heraus und 'zu warten' gibt es da nicht viel.

PS: Ich habe deine Variante (#8) vor einiger Zeit mal umgesetzt: Für mich war das sehr umständlich und auch unnötig.

Da ist mir meine Variante (die das Singleton-Verhalten komplett kapselt) allemal lieber. Dies ist auch gängige Praxis in anderen OOP-Sprachen. Ich kenne das z.B. von log4net (ein Logger für C#): Dort, wo man einen Logger benötigt, holt (=instantiiert) man sich mal eben einen. Ob das ein Singleton ist oder nicht, weiß ich nicht und es interessiert mich auch nicht.

Erkläre mir doch mal, was Du unter 'ein Singleton-Objekt warten' verstehst.

stahli 29. Dez 2012 20:46

AW: Verwenden von Pointern
 
Ich würde auch nicht zwanghaft an einem bestimmten (übertriebenen) Prinzip festhalten.

Die einfachste funktionierende Lösung ist die beste.
Wenn ich ein Framework baue, das in vielen Projekten verwendet werden soll, ist ggf. eine etwas allgemeinere Lösung mit mehr Implementierungsaufwand notwendig.

Wenn es (wie ich Getox verstanden habe) nur um die Instanziierung eines BL-Objektes geht, kann das im Initialisierungsabschnitt der Unit oder im Mainform erledigt werden, ohne dass man dadurch irgendwelche Probleme erhält.
Der Entwickler weiß ja selbst, ob und wann er eine Instanz erzeugt.

Manchmal tun mir die Neueunsteiger wirklich leid wenn sie eine einfache Lösung suchen und dann hier mit Grundsatzdebatten erschlagen werden... :wink:

jaenicke 29. Dez 2012 21:46

AW: Verwenden von Pointern
 
Zitat:

Zitat von Klaus01 (Beitrag 1196974)
estelle Dir eine Unit mit der "globalen Klasse".
Diese Unit kannst Du in alle Forms einbinden.

Da fehlt aber noch die Freigabe, am einfachsten via class destructor (der wird nach ggf. dem finalization Abschnitt der Unit aufgerufen). Und der Konstruktor wird Create geschrieben, nicht create. Zudem sieht für mich eine entsprechende Property schöner aus:
Delphi-Quellcode:
type
  TDeineKlasse = class(TObject)
  private
    class var
      FInstance: TDeineKlasse;
    constructor Create;
    class function GetInstance: TDeineKlasse; static;
  public
    class destructor Destroy;
    class property Instance: TDeineKlasse read GetInstance;
  end;

implementation

class function TDeineKlasse.GetInstance: TDeineKlasse;
begin
  if not Assigned(FInstande) then
    FInstance := TDeineKlasse.Create;

  Result := FInstance;
end;

class destructor TDeineKlasse.Destroy;
begin
  if Assigned(FInstance) then
    FInstance.Free;
end;

stahli 29. Dez 2012 22:01

AW: Verwenden von Pointern
 
Ab wann gibt es im Delphi eigentlich Klassenvariablen und Klassenkonstruktoren?

Die Funktionalität ist die gleiche wie eine Realisierung im Initialization- und Finalization-Abschnitt einer Unit.
Ältere Delphi-Versionen können das nicht (also evtl. vom TE nicht verwendbar).

Vielleicht ist es auch für das Verständnis eines Delphi-Neulings nicht immer unbedingt zweckmäßig.

Furtbichler 29. Dez 2012 22:05

AW: Verwenden von Pointern
 
Zitat:

Zitat von stahli (Beitrag 1197096)
Manchmal tun mir die Neueunsteiger wirklich leid wenn sie eine einfache Lösung suchen und dann hier mit Grundsatzdebatten erschlagen werden... :wink:

:oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:20 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz