coolblue: Technik der Deklaration und Geltungsbereiche

Hallo,

was bevorzugt ihr von den folgenden zwei Beispielen?

Beispiel 1:

for(my $cta=0 ; $cta <= 10 ; $cta++) {
   for(my $ctb=0 ; $ctb <= 10 ; $ctb++) {}
}

if ...
print ...

for(my $cta=0 ; $cta <= 10 ; $cta++) {
   for(my $ctb=0 ; $ctb <= 10 ; $ctb++) {}
}

Beispiel 2:

my $cta;
my $ctb;

for($cta=0 ; $cta <= 10 ; $cta++) {
   for($ctb=0 ; $ctb <= 10 ; $ctb++) {}
}

if ...
print ...

for($cta=0 ; $cta <= 10 ; $cta++) {
   for($ctb=0 ; $ctb <= 10 ; $ctb++) {}
}

Um meine Frage etwas zu vertiefen... welche Art der Deklaration eigenet sich wohl am besten? Reicht es, ganz zu Anfang eines Scripts alle Variablen zu deklarieren (ausgenommen für sub Funktionen), oder ist es aus Sicherheitsgründen besser, alle Variablen auf ihren Geltungsbereich zu beschränken, zum Beispiel in einer for-Schleife.
Oder ist soetwas nicht planbar, da es wohl immer Variablen geben wird, die im gesamten Programm immer wieder gebraucht werden?

Eine weitere Frage zu my und our: verbraucht die Deklaration mit our mehr Speicher?

Viele Grüße,
coolblue

--

never say oops after you submitted a job :-)
_der_Ton_macht_die_Musik_!!!_
  1. Hallo coolblue,

    Um meine Frage etwas zu vertiefen... welche Art der Deklaration eigenet sich wohl am besten? Reicht es, ganz zu Anfang eines Scripts alle Variablen zu deklarieren (ausgenommen für sub Funktionen), oder ist es aus Sicherheitsgründen besser, alle Variablen auf ihren Geltungsbereich zu beschränken, zum Beispiel in einer for-Schleife.

    Variablen immer so lokal wie irgend möglich deklarieren. Alles andere begünstigt Fehler. Womöglich hinterlässt eine for-Schleife die Variable nicht so, wie Du das erwartest. Wenn Du dann vergisst, die wieder zurückzusetzen, merkst Du das u.U. nicht gleich.

    Was willst Du denn durch das zentrale deklarieren erreichen?

    Eine weitere Frage zu my und our: verbraucht die Deklaration mit our mehr Speicher?

    Ich weiß nicht, wie Perl seine Variablen verwaltet, aber wenn es einen solchen  Unterschied geben sollte, so ist er vernachlässigbar.

    Grüße

    Daniel

    1. Hallo Daniel,

      Was willst Du denn durch das zentrale deklarieren erreichen?

      mein Ziel ist, die Deklaration von Variablen nicht auf tausende von Zeilen zu verstreuen, sondern möglichst zu zentralisieren, um den Überblick darüber halten zu können, welche Variablennamen schon in Benutzung sind.

      Ein weiteres Beispiel: ich habe mir die Struktur angeeignet, für for Schleifen das Muster $ct (ct=count) einzusetzen. Der Counter wird bei mir in for-Schleifen grundsätzlich auf einen Anfangswert gesetzt, Beispiel $ct=0, $ct=100. Sollte in der Schleife weitere Counter auftreten, nummeriere ich Sie mit Buchstaben durch ($cta, $ctb ...). Für diesen Zweck wäre doch eine Zentrale Deklarierung optimal. Oder doch nicht?

      Viele Grüße,
      coolblue

      --

      never say oops after you submitted a job :-)
      _der_Ton_macht_die_Musik_!!!_
      1. Hallo coolblue,

        Was willst Du denn durch das zentrale deklarieren erreichen?

        mein Ziel ist, die Deklaration von Variablen nicht auf tausende von Zeilen zu verstreuen, sondern möglichst zu zentralisieren, um den Überblick darüber halten zu können, welche Variablennamen schon in Benutzung sind.

        Dabei wird die eine zentrale, globale Deklaration nicht viel helfen, da du je nachdem, in welchem Block du dich befindest, unterschiedliche Variablen gültig sind.

        Ein weiteres Beispiel: ich habe mir die Struktur angeeignet, für for Schleifen das Muster $ct (ct=count) einzusetzen. Der Counter wird bei mir in for-Schleifen grundsätzlich auf einen Anfangswert gesetzt, Beispiel $ct=0, $ct=100. Sollte in der Schleife weitere Counter auftreten, nummeriere ich Sie mit Buchstaben durch ($cta, $ctb ...). Für diesen Zweck wäre doch eine Zentrale Deklarierung optimal. Oder doch nicht?

        Nein, da du diese Variablen auch nur lokal, also innerhalb der Schleife benötigst, gibt es keinen grund, sie global zu deklarieren.

        Schöne Grüße,

        Johannes

        --
        Das sage ich deshalb, weil ich Hompagebauer bin und Ahnung davon .
        ss:| zu:) ls:[ fo:) de:] va:) ch:) n4:| rl:) br:< js:| ie:{ fl:( mo:}
        1. Hallo,

          Dabei wird die eine zentrale, globale Deklaration nicht viel helfen, da du je nachdem, in welchem Block du dich befindest, unterschiedliche Variablen gültig sind.

          Genau das meinte ich ja, immer zu Anfang eines Blocks, einer sub-Funktion alle Variablen zu deklarieren.

          Viele Grüße,
          coolblue

          --

          never say oops after you submitted a job :-)
          _der_Ton_macht_die_Musik_!!!_
      2. Hallo coolblue,

        Also lokal in den einzelnen Prozeduren müssen die Variablen ja auf jeden Fall sein. Sonst kannst Du keine Rekusion mehr verwenden und es entsteht sowieso ein enormes Chaos.
        Innerhalb einer Prozedur solltest Du die Deklarationen gar nicht auf tausende von Zeilen verteilen können, weil man Prozeduren nicht so lang macht ;-)

        Ich finde, es stiftet eher Verwirrung, wenn Du am Anfang solche Hilfsvariablen wie Zähler deklarierst. Es ist dann nicht sofort klar, wozu die Variable gebraucht wird und wie lang sie gebraucht wird.
        Wenn Du sie in der for-Schleife deklarierst, weiß man sofort, dass es eine Zählervariable ist und das die nur dort gilt. Und wenn man weiter unten auf eine Variable gleichen Namens stößt, weiß man, dass die nicht mit der weiter oben zu tun hat.
        Ich deklariere z.B. auch andere Hilfsvariablen, die ich nur innerhalb eines Blocks brauche, lokal.
        z.B. zwei Werte vertauschen:
        if(blablub) {
          int temp = wert1;
          wert1 = wert2;
          wert2 = temp;
        }

        Für solche Variablen findet man oft keine Bezeichnung, die klar beschreibt, wofür sie gut sind. Daher ist es meiner Meinung nach einfacher, wenn sie nur in einem sehr engen Kontext herumschwirren, in dem noch erkennbar ist, was man damit macht.

        Grüße

        Daniel

        1. Hallo Daniel,

          Ich finde, es stiftet eher Verwirrung, wenn Du am Anfang solche Hilfsvariablen wie Zähler deklarierst. Es ist dann nicht sofort klar, wozu die Variable gebraucht wird und wie lang sie gebraucht wird.

          hmmm... wenn ich das als Master of Destaster nicht weiß, dann habe ich etwas falsch gemacht.

          Wenn Du sie in der for-Schleife deklarierst, weiß man sofort, dass es eine Zählervariable ist und das die nur dort gilt. Und wenn man weiter unten auf eine Variable gleichen Namens stößt, weiß man, dass die nicht mit der weiter oben zu tun hat.

          Ok, sehe ich ein!

          Viele Grüße,
          coolblue

          --

          never say oops after you submitted a job :-)
          _der_Ton_macht_die_Musik_!!!_