Grundsatzfrage: Variablen innerhalb von Schleifen oder außerhalb deklarieren?

  • Java

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von bastimw.

    Grundsatzfrage: Variablen innerhalb von Schleifen oder außerhalb deklarieren?

    Hallo^^
    Mal eine Grundsatzfrage, und zwar heißt es doch "Man soll den Gültigkeitsbereich von Variablen so klein wie möglich halten" (hab ich irgendwo mal gelesen und das macht für mein Denken auch Sinn). Ich mache mal ein VB.NET Beispiel:

    Variante1:

    VB.NET-Quellcode

    1. Dim Summe As Double = 0
    2. Dim Differenz As Double
    3. For i = 1 To MAX
    4. Differenz = 1.0 / i
    5. Summe = Summe + Differenz
    6. Next


    Variante2:

    VB.NET-Quellcode

    1. Dim Summe As Double = 0
    2. For i = 1 To MAX
    3. Dim Differenz As Double = 1.0 / i
    4. Summe = Summe + Differenz
    5. Next


    Zeitlich gesehen messe ich da keinerlei Unterschied. Ich glaube von picoflop mal etwas gelesen zu haben, dass im IL-Code alle Variablen einer Methode beim Aufruf einfach durchnummeriert und deklariert werden - also ähnlich wie in Variante1. Ich finde Variante2 besser, denn die Variable Differenz wird man außerhalb des Schleifenblock nicht mehr brauchen. Außerdem finde ich es hässlich eine Variable zu deklarieren, ihr aber keinen Startwert zuzuweisen. Der IL-Code sollte also bei beiden Varianten identisch sein, man kann also sagen, dass es lediglich um die Lesbarkeit geht.

    Meine eigentliche Frage: Verhält sich das unter Java genauso?

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Heutzutage fällt sowas in den Bereich unnötiger Mikrooptimierung. Im Falle von lokalen Variablen wird jeder vernünftige Compiler (mit eingeschalteter Optimierung) beide Varianten gleich behandeln.

    P.S.: Ich meine mit "Compiler" eigentlich "Java-Compiler". Also insbesondere nicht "C++-Compiler" oder so. ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Renati“ ()

    @bastimw
    könntest du deine Aussage bitte begründen, damit ich nachvollziehen kann warum ich das so machen sollte. Warum sollte ich Variante 1 nehmen und nicht Variante 2 (siehe meine Beispiele oben)?

    Ich finde V2 besser. Die Variable Differenz wird nur innerhalb des Schleifenblocks bebraucht, außerhalb ist sie unnütz und siftet höchstens Verwirrung. Ich würde solche Variablen innerhalb der Schleife deklarieren. Ich meine ansonsten könnte ich ja auch gleich eine Zählervariable "i as integer" klassenweit verfügbar machen - macht kein mensch.

    Das man Klassenvariablen am Anfang schreibt und einen Datentyp angibt ist klar xD
    Alles eben nach dem Motto "Man soll den Gültigkeitsbereich von Variablen so klein wie möglich halten"

    lg

    Renati schrieb:

    Heutzutage fällt sowas in den Bereich unnötiger Mikrooptimierung. Im Falle von lokalen Variablen wird jeder vernünftige Compiler (mit eingeschalteter Optimierung) beide Varianten gleich behandeln.

    Nein, tut er nicht. Ich würde den IL-Compiler mal als vernünftig bezeichnen, und (zumindest meines Wissens nach) optimiert er dies nicht automatisch. Ergo: Durch die 1. Variante kann man einen Geschwindigkeitszuwachs erreichen verglichen mit der 2.
    in deiner kleinen Funktion mag das noch gehen, ab und an läßt sich nicht alles in kleien subroutinen oder funktionen packen, dann wirds schnell sehr unübersichtlich, außerdem lassen sich Variablen die man direkt am Anfang deklariert später noch mal nachreichen. Manchen Compilern ist es egal, manchen nicht, die perfekte Schnittmenge wäre es daher diese an den Anfang zu schreiben. Datentyp zuweisen sollte Standard sein und ne Initialisierung gehört auch dazu.

    Dim meinelongVariable as long = 0 - selbst für Variablennamen gibt es im Normalerweise Bestimmungen