AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Class Var vs Var

Ein Thema von Perlsau · begonnen am 19. Mai 2014 · letzter Beitrag vom 19. Mai 2014
Antwort Antwort
Seite 1 von 2  1 2   
Perlsau
(Gast)

n/a Beiträge
 
#1

Class Var vs Var

  Alt 19. Mai 2014, 01:24
Delphi-Version: 2009
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 ...
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Class Var vs Var

  Alt 19. Mai 2014, 02:17
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#3

AW: Class Var vs Var

  Alt 19. Mai 2014, 02:30
Class vars sind nix anderes als globale Variablen mit nem zusätzlichen Scope - daher:
Ähh ... was bedeutet Scope?

1. Ja - das sie ja an die Klasse gebunden sind und nicht an die Instanz
Das ist erfreulich
2. Nein, solange keine Methoden oder Sichtbarkeitsmodifizierer kommen sind alle nachfolgenden class vars.
Auch das erleichtert die Arbeit sehr
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?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Class Var vs Var

  Alt 19. Mai 2014, 08:04
Ähh ... was bedeutet Scope?
Scope

P.S. Meine Predigt, warum globale Variablen schlecht sind, spar ich mir heute mal
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

AW: Class Var vs Var

  Alt 19. Mai 2014, 08:19
Merci, da hätt ich auch selber draufkommen können, bei Widipedia zu suchen

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
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Class Var vs Var

  Alt 19. Mai 2014, 10:50
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".
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Class Var vs Var

  Alt 19. Mai 2014, 12:55
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Class Var vs Var

  Alt 19. Mai 2014, 02:34
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:

class property Fehlermeldung : String read fFehlerMeldung write fFehlerMeldung;

Geändert von Bjoerk (19. Mai 2014 um 02:41 Uhr) Grund: Edit:
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#9

AW: Class Var vs Var

  Alt 19. Mai 2014, 02:39
Du meinst, ich muß auch die jeweiligen Getter- und Setter-Methoden, die auf Klassenvariablen zugreifen, und die jeweiligen Properties als Klassenmethoden bzw. Klassenproperties deklarieren?
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Class Var vs Var

  Alt 19. Mai 2014, 02:42
Ja. Manchmal will der Compiler auch ein ; static; dahinter.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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 +1. Es ist jetzt 02:04 Uhr.
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 by Thomas Breitkreuz