AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Designfrage zu Klassen- und Instanzproperties

Ein Thema von DeddyH · begonnen am 9. Jun 2021 · letzter Beitrag vom 9. Jun 2021
Antwort Antwort
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.237 Beiträge
 
Delphi 10.4 Sydney
 
#1

Designfrage zu Klassen- und Instanzproperties

  Alt 9. Jun 2021, 12:03
Ich hätte für eine Konfigurationsklasse gern die Möglichkeit, eine sagen wir mal initiale global verfügbare Instanz anzulegen als auch eine (temporäre) lokale. Meine bisherige Umsetzung:
Delphi-Quellcode:
type
  TMyConfig = class
  strict private
    class var FInstance: TMyConfig;
    class function GetInstance: TMyConfig; static;
    class destructor ClassDestroy;
  private
    FFeld: integer;
  public
    property Feld: integer read FFeld write FFeld;
    class property Instance: TMyConfig read GetInstance;
  end;

...

class function TMyConfig.GetInstance: TMyConfig;
begin
  if not Assigned(FInstance) then
    FInstance := TMyConfig.Create;
  Result := FInstance;
end;

class destructor TMyConfig.ClassDestroy;
begin
  FInstance.Free;
end;
Meine Frage: ist das ein gangbarer Weg, oder baue ich mir hier ein Anti-Pattern, das mir früher oder später um die Ohren fliegt?
Danke fürs Lesen
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.612 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Designfrage zu Klassen- und Instanzproperties

  Alt 9. Jun 2021, 12:44
Das nennt sich „Singleton“. Such mal danach, einmal tief Luft holen und dann lesen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.237 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Designfrage zu Klassen- und Instanzproperties

  Alt 9. Jun 2021, 12:46
Danke, das ist mir bekannt, auch, dass das oft als verpönt angesehen wird. Ich nutze es aber gern als Alternative zu globalen Variablen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.378 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Designfrage zu Klassen- und Instanzproperties

  Alt 9. Jun 2021, 13:08
Wenn es wirklich nur eine Instanz für diese Klasse in deinem Programm geben soll, dann spricht m.M. nichts gegen deinen Ansatz. Die Alternative wäre, diese eine Instanz jeweils als Parameter oder anderweitig mitzugeben wo sie gebraucht wird. Das halte ich aber für völlig unpragmatisch und in vielen Fällen für kontraproduktiv.

Natürlich gibt es andere Ansätze, mit denen diese Singleton-Instanz vermieden werden kann, wobei in den meisten Fällen dann doch intern wieder nur eine Instanz vorgehalten wird, was ja auch eigentlich die Vorgabe in diesem Anwendungsfall ist. Jetzt irgendwelche Klimmzüge zu machen, um formal dem Singleton-Shaming zu entgehen, erscheint mir nicht wirklich sinnvoll.

Wenn du es etwas flexibler haben möchtest, dann implementiere eine Factory-Funktionalität, die du bei Bedarf anpassen kannst um ein anderes Verhalten für Tests oder als Mock zu ermöglichen.
Delphi-Quellcode:
type
  TMyConfigClass = class of TMyConfig;
  TMyConfig = class
  strict private
    class var FMyConfigClass: TMyConfigClass;
    class var FInstance: TMyConfig;
    class function GetInstance: TMyConfig; static;
    class destructor ClassDestroy;
  private
    FFeld: integer;
  public
    property Feld: integer read FFeld write FFeld;
    class property Instance: TMyConfig read GetInstance;
    class property MyConfigClass: TMyConfigClass read FMyConfigClass write FMyConfigClass;
  end;

class function TMyConfig.GetInstance: TMyConfig;
begin
  if not Assigned(FInstance) then begin
    if Assigned(FMyConfigClass) then
      FInstance := FMyConfigClass.Create
    else
      FInstance := TMyConfig.Create;
  end;
  Result := FInstance;
end;

class destructor TMyConfig.ClassDestroy;
begin
  FInstance.Free;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.237 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Designfrage zu Klassen- und Instanzproperties

  Alt 9. Jun 2021, 13:17
Danke, Uwe, so flexibel benötige ich das gar nicht. Mir geht es darum, dass es eine "Hauptinstanz" geben soll, auf die ich überall, wo sie benötigt wird, zugreifen kann. Will ich aber eine andere Konfiguration testen, ohne mir die Hauptinstanz zu zerstören, erzeuge ich einfach eine weitere, stelle sie entsprechend ein, schaue, ob sie so funktioniert und kann im Erfolgsfall dann in der Hauptinstanz die neuen Werte zuweisen. So war mein Denkansatz.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.187 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Designfrage zu Klassen- und Instanzproperties

  Alt 9. Jun 2021, 13:29
Ich habe so etwas mal mit 2 globalen Variablen und einer Funktion realisiert:

Delphi-Quellcode:
globVarMain: TObject = nil;
globVarTmp: TObject = nil;

function MyVar: TObject;
begin
  if Assigned(globVarTmp) then
    Exit(globVarTmp);
  if not Assigned(globVarMain) then
    globVarMain := TObject.Create;
  Exit(globVarMain);
end;
Wenn globVarTmp etwas zugewiesen wird, wird die Instanz verwendet, sonst die Main-Variable.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.259 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Designfrage zu Klassen- und Instanzproperties

  Alt 9. Jun 2021, 15:53
Dann nimm doch einen Record
Delphi-Quellcode:
var
  MyConfig = record
    Feld: integer;
  end;
Delphi-Quellcode:
var
  MyConfig = record
  private
    FFeld: integer;
  public
    property Feld: integer read FFeld write FFeld;
  end;
Kannst den Typen auch einzeln deklarieren

und seit Delphi 10.4.2 gibt es aus für Records sowas Constructor/Destructor, bzw. Class Constructor/Class Destructor,
also Initialize/Finalize (Custom Managed Records)

oder direkt ALLES als Class
Delphi-Quellcode:
type
  MyConfig = class abstract
  strict private class var
    FFeld: integer;
  public
    class property Feld: integer read FFeld write FFeld;
  end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 9. Jun 2021 um 15:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.819 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: Designfrage zu Klassen- und Instanzproperties

  Alt 9. Jun 2021, 18:43
Abgesehen davon, dass dein GetInstance nicht thread-safe ist, sieht das in Ordnung aus.
Wie bei so vielen Prinzipien, (Anti-)Patterns etc ist es wichtig zu verstehen, warum sie generell als gut/schlecht angesehen werden.

Dir muss halt klar sein, dass du durch ein TMyConfig.Instance in deinem konsumierenden Code dir sowieso eine hartcodierte Abhängigkeit einhandelst - wie "schlimm" das ist, kommt darauf an, was alles in TMyConfig steckt oder auch nicht. Da du aber mit dem class function Instance Ansatz daran gehst und nicht wie oft anders implementiert NewInstance etc überschreibst um auf Biegen und Brechen zu verhindern, dass irgendjemand jemals eine 2. Instanz davon erzeugt ist das imho weniger problematisch.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.237 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Designfrage zu Klassen- und Instanzproperties

  Alt 9. Jun 2021, 20:23
Danke, dann lasse ich das jetzt so.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 04:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf