Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Globale Variablen, typisierte Konstanten (https://www.delphipraxis.net/31181-globale-variablen-typisierte-konstanten.html)

Alienhere 5. Okt 2004 18:13


Globale Variablen, typisierte Konstanten
 
Bin zwar alt, aber neu hier im Forum und per Modem unterwegs :shock:

Gelegentlich habe ich hier Abfälliges zu globalen Variablen und typisierten Konstanten gelesen :pale:

Was spricht dagegen? Falls es dazu bereits Threads geben sollte, antwortet doch bitte mit einem Link darauf!

Vielen Dank!

mfg

omata 5. Okt 2004 19:33

Re: Globale Variablen, typisierte Konstanten
 
Moin,

globale Variablen sind böse weil...

Das Programm wird unübersichtlich (wo kommt die Variable her, wo wird sie geändert, ...)

Wenn man mit Klassen arbeitet und mehrere Instanzen einer Klasse anlegt und diese dann auf eine globale Variable zugreifen, dann passiert nur noch müll.

Auch wenn man mal eben was ausprobieren will, sollte man gleich ordentlich programmieren und das bedeutet so wenig wie möglich mit globalen Variablen arbeiten. Eigentlich benötigt man gar keine globalen Variablen, man kann alles auch ohne lösen.

typisierte Konstanten sind nicht von vorteil, weil man ihnen Werte zuweisen kann. Das sind dann keine Konstanten mehr. Sie sind nur von vorteil, wenn man sie als formale Paramter in Methoden benutzt, weil dann die Geschwindigkeit der Methodenaufrufe erhöht werden kann.

MfG
Thorsten

Chewie 5. Okt 2004 19:54

Re: Globale Variablen, typisierte Konstanten
 
Zitat:

Zitat von omata
typisierte Konstanten sind nicht von vorteil, weil man ihnen Werte zuweisen kann. Das sind dann keine Konstanten mehr. Sie sind nur von vorteil, wenn man sie als formale Paramter in Methoden benutzt, weil dann die Geschwindigkeit der Methodenaufrufe erhöht werden kann.

Da muss ich dir widersprechen, wenn man nämlich typisierte Konstanten nicht als Konstanten, sondern als Variablen ansieht, kann man statische Variablen, wie man sie aus den C-ähnlichen Sprachen kennt, nachbilden:

Delphi-Quellcode:
procedure DoSomething;
const
  Counter: Integer = 0;
begin
  //irgendwas machen

  Inc(Counter);
end;
Counter ist hier im Scope der Prozedur gültig, der Wert bleibt aber über die Laufzeit der Prozedur hinaus erhalten.

omata 5. Okt 2004 20:03

Re: Globale Variablen, typisierte Konstanten
 
Moin,

ok das sehe ich ein.
Es gibt durchaus sinnvolle Einsatzgebiete für typisierte Konstanten.
Die Möglichkeit der Initialisierung im Deklarationsteil ist sehr sinnvoll.

Ich denke ich war zusehr mit dem verteufeln von globalen Variablen beschäftigt, dass ich da einen Runt-Umschlag gemacht habe.

Danke für deinen Hinweis .


MfG
Thorsten

Christian Seehase 5. Okt 2004 20:04

Re: Globale Variablen, typisierte Konstanten
 
Moin Chewie,

Zitat:

Zitat von Chewie
Counter ist hier im Scope der Prozedur gültig, der Wert bleibt aber über die Laufzeit der Prozedur hinaus erhalten.

man könnte diesen Satz dann aber z.B. wie folgt ergänzen:

, was dann zur Folge hat, dass die Prozedur keinen definierten Zustand hat, wenn man sie aufruft. ;-)
(es kann zumindest unübersichtlich werden den Anfangszustand zu kennen)

Hansa 5. Okt 2004 21:11

Re: Globale Variablen, typisierte Konstanten
 
Ich würde mich mal zu allererst an folgende Richtlininien halten:

1. Konstanten nur für konstante Werte benutzen und nicht versuchen hieraus dann doch über Umwege eine Variable zu machen und sie zu verändern.

2. Variable nicht für Konstanten zu benutzen, die sich normalerwiese nie ändern.

3. Gültigkeitsbereiche so gering wie nöglich zu halten.

In der Praxis sieht es aber dann etwas gemischter aus. Warum soll man keinerlei globalen Variablen / Konstanten benutzen ? :shock: Die Mwst. bspw. ist bei mir global, denn ich habe keine Lust in zig Prozeduren, diese als Parameter mitzuschleppen. Das gibt mehr Durcheinander, als es wert ist.

Schleifenvariablen, oder soche, die wirklich nur kurz gebraucht werden niemals global definieren. Man stelle sich einmal ein i vor, das überall lokal als integer definiert ist, aber an einer Stelle ist keine lokale Definition vorhanden und das Programm greift von alleine auf ein global definiertes i zu !! Dann krachts aber mit Sicherheit irgendwann. :mrgreen:

Chewie 6. Okt 2004 12:53

Re: Globale Variablen, typisierte Konstanten
 
Zitat:

Zitat von Christian Seehase
man könnte diesen Satz dann aber z.B. wie folgt ergänzen:

, was dann zur Folge hat, dass die Prozedur keinen definierten Zustand hat, wenn man sie aufruft. ;-)
(es kann zumindest unübersichtlich werden den Anfangszustand zu kennen)

Einen definierten Zustand hat sie schon, nur erkennt man ihn von außerhalb nicht ;)
Aber das ist nichts anderes wie eine private Variable einer Klasse: Wenn der Wert der Variablen nur die Prozedur selbst was angeht, dann muss dieser Wert nicht von außen übergeben werden. Sinn macht es z.B. beim Protokollieren in eine Textdatei, in der man mit einem Zähler z.B. die Zeilennummer reinschreiben kann.

woki 6. Okt 2004 14:58

Re: Globale Variablen, typisierte Konstanten
 
Zuweisbare typisierte Konstanten
Zitat:

Zitat von Chewie
Zitat:

Zitat von Christian Seehase
man könnte diesen Satz dann aber z.B. wie folgt ergänzen:

, was dann zur Folge hat, dass die Prozedur keinen definierten Zustand hat, wenn man sie aufruft. ;-)
(es kann zumindest unübersichtlich werden den Anfangszustand zu kennen)

Einen definierten Zustand hat sie schon, nur erkennt man ihn von außerhalb nicht ;)
Wenn der Wert der Variablen nur die Prozedur selbst was angeht, dann muss dieser Wert nicht von außen übergeben werden. Sinn macht es z.B. beim Protokollieren in eine Textdatei, in der man mit einem Zähler z.B. die Zeilennummer reinschreiben kann.

Sinn machen sie also dann, wenn nur die prozedur selbst, aber nicht der Aufrufer den Wert kennen muß oder kann, und der Wert aufgrund vorheriger, instanzübergreifender Aufrufe bestimmt werden muß. Der Aufrufer kann den Wert gar nicht übegeben, weil er ihn gar nicht kennt. Sinnvolle Verwendung findet dies z.B. bei der Implementation einer Singleton - Klasse. Es gibt also Dinge, für die typisierte Konstanten die elganteste, oder gar einzig sinnvolle Möglichkeit der Implementation in Object-Pascal darstellen. Ungeschickt ist nur die Deklaration (das Ding solte eigentlich nicht const heißen), nicht was das Ding tut.

Globale Variable
Variable sind Dinge, die vom Programm geändert werden. Hier verstößt die Verwendung Globaler Variablen gegen das Kapselungsprinzip, macht das Programm unübersichlicher. Verpacken in eine Singletonklasse und Zugriff über Getter und Setter erhöht die Übersichtlichkiet des Programms und verringert die Gefahr falscher Zugriffe auf die Variable.
Die Formvarable (Form1 :TForm) sind globale Variable, man schaue sich einfach mal an, was passeiert, wenn von einer Form, die sich ein zugehöriges Datenmodul erzeugt, mehrere Instanzen exisistieren, und dann wundern.

Globale Konstanten
Hier will ich nicht unbedingt etwas gegen sagen, außer daß Verpacken in eine Singeltonklasse es eventuell leichter machen könnten, später mal Dinge daran transparent für den Rest des Programmes zu ändern. Z.B. wenn bei es bei Internationalisierung plötzlich nicht mehr einen Mehrwertsteuersatz gibt, und man das Programm einfach auf andere Sprachen (und damit Mehrwertsteuersätze) umschalten können will.

Grüsse
Woki


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