Was ist der mögliche Nachteil, wenn Deklarationen in innere Blöcke anstatt zu Beginn der Funktion eingefügt werden?

9

An dem Ort, an dem ich arbeite, gibt es explizite Richtlinien für die Platzierung von Deklarationen von Variablen. Demnach ist es erforderlich, sie auf globaler Ebene und / oder am Anfang von Funktionen zu platzieren und nicht in inneren Blöcken (wie einer for-Schleife). Da sie von Personen spezifiziert wurden, die erfahrener sind als ich, bin ich mir sicher, dass es einen guten Grund dafür geben muss, aber ich kann nicht herausfinden, was das sein könnte. Es wäre schön zu wissen, ob es Vorteile bei der Kompilierung / Laufzeit gibt, wenn sie in einem größeren Umfang deklariert werden.

TCSGrad
quelle

Antworten:

8

Ich sehe zwei Hauptvorteile:

  • Die Wiederverwendung von Variablennamen mit einem anderen Typ wird verhindert.
  • Zu einem früheren Zeitpunkt wird klar, dass eine Routine überarbeitet werden muss. Die Variablen oben werden ziemlich schnell zu einem großen Durcheinander, und dieses Durcheinander ist leicht zu erkennen.

Jeder Compiler, der sein Geld wert ist, optimiert ohnehin den Umfang der Variablen, sodass es sich lediglich um ein Formatierungsproblem handelt.

Für meine zwei Cent würde ich immer noch die innerste Deklaration der Variablen bevorzugen, um die Absicht des Gültigkeitsbereichs zum Compiler zu transportieren. Wenn Sie beabsichtigten, auf eine Variable nur innerhalb einer Schleife zuzugreifen, können Sie beim Kompilieren eine spätere Referenz abrufen, wenn Sie die Variable in der Schleife deklarieren.

Thiton
quelle
3

Der einzige Vorteil, den ich bisher gefunden habe, ist die Einfachheit des Codes. Sie wissen immer, wo Sie nach Variablendeklarationen suchen müssen, und jeder im Team verwendet denselben Codierungsstil. Diese Dinge erleichtern die Code-Wartung, aber ich bin mir nicht sicher, ob sie das Schreiben von besserem Code erleichtern. Ich meine nicht, dass Sie schlechteren Code schreiben, nur dass es manchmal schwieriger ist, Code so gut zu schreiben. Trotzdem ist es hilfreich, wenn das Entwicklungsteam groß ist oder seine Mitglieder häufig mithilfe von Codestandards wechseln.

Gus
quelle
3

Dies klingt nach einer Entscheidung zur Wahrung der Konsistenz. Es verhindert auch die Verwendung gleicher Namen für verschiedene Variablen in benachbarten Bereichen und erhöht die Lesbarkeit. Wie Gus betont, wissen Sie auch, wo Sie nach Variablen suchen müssen. Ich denke, das Prinzip des engsten Anwendungsbereichs ist jedoch besser, da es die variable Unordnung oben verhindert. Die äußerste Deklaration ähnelt der Deklaration privater Mitglieder einer Klasse als erste IMO.

perreal
quelle
3

Jede Sprache kann sich in Stil und Praxis unterscheiden. Das Folgende ist aus JSF-AV-Regeln , auf die Stroustrup als die von ihm bevorzugten Codierungsstandards verweist.

AV-Regel 136
Declarations should be at the smallest feasible scope

Die Begründung hierfür wird beschrieben als

This rule attempts to minimize the number of live variables that must be simultaneously considered. Furthermore, variable declarations should be postponed until enough information is available for full initialization

Wenn Sie sich in C ++ befinden, wird es bevorzugt, Variablen zu deklarieren, wenn Sie sie benötigen.

Clark Gable
quelle
3

Ich bin mir nicht sicher, ob Sie dies als Best Practice bezeichnen können. Wenn ich Richtlinien für ein neues C-Projekt einrichte, sage ich immer, dass es besser ist, die Variablen in der Nähe des Verwendungsortes zu deklarieren. Aus zwei Gründen ist es einfacher, den Code später umzugestalten (dh beim Extrahieren einer Methode). Es hilft dem Compiler auch, eine bessere Optimierung durchzuführen.

Mit dieser Meinung bin ich nicht allein. Hier ist eine Frage, die das gleiche Problem angeht : /software/56585/where-do-you-declare-variables-the-top-of-a-method-or-when-you-need -them Die Antwort hier ist, sie dort zu deklarieren, wo Sie sie verwenden. Die gleiche Praxis wird im Buch 'Clean Code' von Robert C. Martin beschrieben.

Wenn Sie jedoch einen älteren C-Standard (C-89) verwenden, müssen Sie lokale Variablen oben in der Funktion definieren. Vielleicht ist die Richtlinie ein Überbleibsel aus der Zeit, als C-89 verwendet wurde? Es ist wahrscheinlich besser, die Person, die die Richtlinien geschrieben hat, zu fragen, warum die Regel noch vorhanden ist.

Johan
quelle
2

Wenn sich die Deklaration in einer if-Klausel befindet, die nur selten (wenn überhaupt) ausgeführt wird, aber viel Speicher benötigt, ist Ihr Speicherbedarf (meistens) geringer als wenn Sie alles zu Beginn der Funktion zuweisen.

Wenn es sich innerhalb einer Schleife befindet, müssen Sie den Speicher wiederholt neu zuweisen. Dies kann in Bezug auf die Leistung kostspielig sein.

Es gibt Gründe, Dinge in beide Richtungen zu tun.

NWS
quelle
1

Der alte C-Standard von 1989 erlaubt nur Variablendeklarationen am Anfang eines Blocks.

Nur seit C99 sind Deklarationen überall erlaubt. Vielleicht hat Ihr Platz noch nicht auf C99 umgestellt.

Patrick
quelle
Wir verwenden C99 - aber was noch wichtiger ist, ich habe nach den Auswirkungen der Deklaration im innersten Block und nicht zu Beginn der Funktion gesucht. Vielleicht war ich nicht klar genug ...
TCSGrad
1

Es scheint, als ob diejenigen, die diese Entscheidung getroffen haben, an eine Zeit gewöhnt sind, in der es an der Spitze stand, Erklärungen an die Spitze zu setzen, und sich dafür entschieden haben, nicht zu einer Präferenz zu wechseln, um näher an dem Ort zu erklären, an dem sie verwendet werden.

Ich bin mir nicht sicher, wie hilfreich diese Konsistenz ist. Einige IDEs erleichtern wahrscheinlich das Auffinden von Dingen als andere. Für globale Variablen ist dies sinnvoll, aber wenn Ihre Funktion so lang ist, dass es schwierig ist, Variablendeklarationen zu finden, haben Sie größere Probleme.

JeffO
quelle