Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Class Var vs Var (https://www.delphipraxis.net/180411-class-var-vs-var.html)

Perlsau 19. Mai 2014 00:24

Delphi-Version: 2009

Class Var vs Var
 
Gesetzt den Fall, ich benötige einige Variablen global im ganzen Programm und richte mir dafür eine Klasse ein, die von allen anderen Units, die diese Variablen benötigen, verwendet wird. Wenn ich nun z.B. unter Public eine Variable namens AppendModus : Boolean; deklariere, hat doch jede Unit, die eine Instanz dieser Klasse erzeugt, auch eine andere Instanz dieser Variablen. Nun habe ich kürzlich irgendwo in den Weiten des Forums gelesen, daß man zu diesem Zweck Klassenvariablen deklariert:
Delphi-Quellcode:
TYPE
  TGlobalix = CLASS
    PRIVATE { Private-Deklarationen }

    PUBLIC { Public-Deklarationen }
      Class Var FehlerMeldung,
                DB_Pfad,
                Pfad_Main,
                Modustext      : String;

      Class Var StartModus,
                AppendModus,
                EditModus      : Boolean;
  END;
Dazu hab ich mehrere Fragen:

1. Verfügt jede Instanz dieser Klasse über dieselben Werte der in Class Var deklarierten Variablen?

2. Muß ich vor jeder Deklaration Class Var schreiben oder sind alle Variablen, die ich nach der Anweisung Class Var hinschreibe, Klassenvariablen?

3. Sollte man hier besser mit Properties arbeiten und dann nur über die Setter- und Getter-Methoden setzen und abfragen?

Ich habe bereits damit experimentiert und z.B. den AppendModus von FormMain aus auf True gesetzt, dann vom Datenmodul aus abgefragt und das korrekte Resultat erhalten. Bin mir allerdings nicht sicher, ob man sich darauf verlassen kann ...

Stevie 19. Mai 2014 01:17

AW: Class Var vs Var
 
Class vars sind nix anderes als globale Variablen mit nem zusätzlichen Scope - daher:
1. Ja - das sie ja an die Klasse gebunden sind und nicht an die Instanz
2. Nein, solange keine Methoden oder Sichtbarkeitsmodifizierer kommen sind alle nachfolgenden class vars.
3. Ich persönlich verwende für Felder nur private oder protected, daher Getter und Setter für Zugriff von außen.

Perlsau 19. Mai 2014 01:30

AW: Class Var vs Var
 
Zitat:

Zitat von Stevie (Beitrag 1259238)
Class vars sind nix anderes als globale Variablen mit nem zusätzlichen Scope - daher:

Ähh ... was bedeutet Scope?

Zitat:

Zitat von Stevie (Beitrag 1259238)
1. Ja - das sie ja an die Klasse gebunden sind und nicht an die Instanz

Das ist erfreulich :)
Zitat:

Zitat von Stevie (Beitrag 1259238)
2. Nein, solange keine Methoden oder Sichtbarkeitsmodifizierer kommen sind alle nachfolgenden class vars.

Auch das erleichtert die Arbeit sehr :-D
Zitat:

Zitat von Stevie (Beitrag 1259238)
3. Ich persönlich verwende für Felder nur private oder protected, daher Getter und Setter für Zugriff von außen.

Okay, dann sieht das in Zukunft so bei mir aus:
Delphi-Quellcode:
TYPE
  TGlobalix = CLASS
    PRIVATE { Private-Deklarationen }
      Class Var fFehlerMeldung,
                fDB_Pfad,
                fPfad_Main,
                fModustext : String;
                fStartModus,
                fAppendModus,
                fEditModus : Boolean;

      Function GetfFehlerMeldung : String;
      Procedure SetfFehlerMeldung(Const Value : String);

    PUBLIC { Public-Deklarationen }
      Property Fehlermeldung : String read GetfFehlerMeldung write SetfFehlerMeldung;
      ...
  END;

IMPLEMENTATION
{TGlobalix}

Function TGlobalix.GetfFehlermeldung : String;
begin
  Result := fFehlermeldung;
end;

Procedure TGlobalix.SetfFehlerMeldung(Const Value : String);
begin
  fFehlerMeldung := Value;
end;

...
Die Properties, die auf Klassenvariablen zugreifen, muß man vermutlich nicht besonders kennzeichnen, oder?

Bjoerk 19. Mai 2014 01:34

AW: Class Var vs Var
 
Du kannst auch auf eine Instanz ganz verzichten und einfach TGlobalix.AppendModus verwenden. Dasselbe auch für Methoden (class procedures, class functions). Properties ja (hier class property).

Edit:
Sehe gerade deinen Code. Wie gesagt hier class property und die Getter als class function und die Setter als class procedure oder auch so:

Delphi-Quellcode:
class property Fehlermeldung : String read fFehlerMeldung write fFehlerMeldung;

Perlsau 19. Mai 2014 01:39

AW: Class Var vs Var
 
Du meinst, ich muß auch die jeweiligen Getter- und Setter-Methoden, die auf Klassenvariablen zugreifen, und die jeweiligen Properties als Klassenmethoden bzw. Klassenproperties deklarieren?

Bjoerk 19. Mai 2014 01:42

AW: Class Var vs Var
 
Ja. Manchmal will der Compiler auch ein ; static; dahinter.

Perlsau 19. Mai 2014 06:42

AW: Class Var vs Var
 
@Stevie & @Bjoerk:
Besten Dank für eure wertvollen Auskünfte :thumb:

Sir Rufo 19. Mai 2014 06:44

AW: Class Var vs Var
 
Zitat:

Zitat von Bjoerk (Beitrag 1259242)
Ja. Manchmal will der Compiler auch ein ; static; dahinter.

AFAIK will der bei
Delphi-Quellcode:
class property
das immer als
Delphi-Quellcode:
static
haben (bei mir wenigstens) :)

Stevie 19. Mai 2014 07:04

AW: Class Var vs Var
 
Zitat:

Zitat von Perlsau (Beitrag 1259239)
Ähh ... was bedeutet Scope?

Scope

P.S. Meine Predigt, warum globale Variablen schlecht sind, spar ich mir heute mal ;)

Perlsau 19. Mai 2014 07:19

AW: Class Var vs Var
 
Zitat:

Zitat von Stevie (Beitrag 1259248)

Merci, da hätt ich auch selber draufkommen können, bei Widipedia zu suchen :oops:

Zitat:

Zitat von Stevie (Beitrag 1259248)
P.S. Meine Predigt, warum globale Variablen schlecht sind, spar ich mir heute mal ;)

Du meinst, globale Variablen wären in jedem Fall und unter allen Umständen "schlecht" und in allen Fällen grundsätzlich vermeidbar? Wenn ja, wozu gibt's die dann überhaupt? Im großen & ganzen stimme ich den zahlreichen Plädoyers gegen den Einsatz globaler Variablen durchaus zu, aber doch nicht grundsätzlich :?

Bjoerk 19. Mai 2014 09:50

AW: Class Var vs Var
 
Dein TGlobalix Beispiel ist sozusagen ja nur die akademische Variante von proceduralen globalen Variablen. Globale Klassen sind eher sinnvoll für Klassen vom "Typ SysUtils". Globale Variablen haben mich mal fast meine Existenz gekostet. Ernsthaft, ich war kurz vom Hinschmeißen. Mein Code (ca. 250.000 Zeilen) war schlicht nicht mehr wartbar. Hat ein Jahr gedauert bis ich die eliminiert hatte (Ohne Christian und Detlef hätte ich’s wohl überhaupt nicht geschafft). Seither versuche ich mich im Wesentlichen an die "Guinnes Directive" zu halten: "Variablen so weit verstecken wie möglich". :)

Stevie 19. Mai 2014 11:55

AW: Class Var vs Var
 
Zitat:

Zitat von Perlsau (Beitrag 1259249)
Du meinst, globale Variablen wären in jedem Fall und unter allen Umständen "schlecht" und in allen Fällen grundsätzlich vermeidbar? Wenn ja, wozu gibt's die dann überhaupt? Im großen & ganzen stimme ich den zahlreichen Plädoyers gegen den Einsatz globaler Variablen durchaus zu, aber doch nicht grundsätzlich :?

Ich wage, zu behaupten, dass es theoretisch ganz ohne geht - allerdings steht dem meist die Praxis (und bestehender Code) gegenüber und in manchen Fällen ist es einfacher und pragmatischer, eine globale Variable zu benutzen, anstatt das ganze System von links auf rechts zu krempeln. Dennoch sollte man manchmal zweimal drüber nachdenken, ob sich das dargestellte Problem nicht anders lösen lässt.

Sir Rufo 19. Mai 2014 12:19

AW: Class Var vs Var
 
Und nicht globale Variablen und globale Abhängigkeiten vermischen.

Globale Variablen haben als Teilaspekt auch die globale Abhängigkeit, aber zudem auch noch weitere Nebeneffekte, wie das unkontrollierte und ungeschützte Verändern der Werte.

Mit den Abhängigkeiten kann man sich noch arrangieren, das Verändern kann einem das Leben schwer machen (warum ist denn da jetzt 42 drin :shock:)

Dejan Vu 19. Mai 2014 12:33

AW: Class Var vs Var
 
Zitat:

Zitat von Stevie (Beitrag 1259321)
Ich wage, zu behaupten, dass es theoretisch ganz ohne geht

Also ganz ohne globale Konstanten/Variablen/Abhängigkeiten wirst Du eine Anwendung denn doch nicht hinbekommen. I/O z.B. wird kaum ohne gehen. Du kannst das zwar als Wrapper kapseln und per DI auflösen, aber irgendwer muss ja von außen die Abhängigkeit injizieren, und so hat der äußerste Anwendercode eben diese globale Abhängigkeit, spätestens der Wrapper selbst.

Die Frage, die sich da natürlich stellt ist die: Wenn nur eine einzige Klasse etwas globales verwendet (weil es im Framework nun einmal global ist), gilt das dann? :stupid:

Sir Rufo 19. Mai 2014 13:28

AW: Class Var vs Var
 
Also ohne globale Variablen (die da)
Delphi-Quellcode:
interface

var
  GlobalBadVar : TSomeType;
ja, darauf kann man komplett verzichten.

Globale Konstanten sind egal (die ändern sich ja eh nicht)

Ohne Globale Abhängigkeiten -> NEIN
Denn selbst mit DI hat man einen globalen ServiceLocator und damit schon mal eine Abhängigkeit.

Allerdings hat man eben nur eine und mehr sollten es im Idealfall nicht werden. Und diese Abhängigkeit sollte auch sehr flexibel sein.

Aber du hast schon damit Recht, man braucht halt einen Nagel wo man alles dran aufhängt, sonst baut man ein Luftschloß ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:33 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