Delphi-PRAXiS
Seite 1 von 2  1 2   

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 01: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 02: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 02: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 02: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 02: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 02:42

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

Perlsau 19. Mai 2014 07:42

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

Sir Rufo 19. Mai 2014 07: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 08: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 08: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 :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 Uhr.
Seite 1 von 2  1 2   

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