Wie bereits erwähnt, gibt es hierzu zwei Denkschulen.
1) Deklarieren Sie alles an der Spitze der Funktionen, da das Jahr 1987 ist.
2) Erklären Sie am nächsten zum ersten Gebrauch und im kleinstmöglichen Umfang.
Meine Antwort darauf lautet BEIDES! Lassen Sie mich erklären:
Für lange Funktionen macht 1) das Refactoring sehr schwierig. Wenn Sie in einer Codebasis arbeiten, in der die Entwickler gegen die Idee von Subroutinen sind, haben Sie zu Beginn der Funktion 50 Variablendeklarationen, von denen einige möglicherweise nur ein "i" für eine for-Schleife sind, die genau am Ende steht unten in der Funktion.
Daraus entwickelte ich eine Erklärung zur obersten PTBS und versuchte, Option 2) religiös zu machen.
Ich bin wegen einer Sache zu Option eins zurückgekehrt: kurzen Funktionen. Wenn Ihre Funktionen kurz genug sind, haben Sie nur wenige lokale Variablen. Da die Funktion kurz ist und Sie sie oben in die Funktion einfügen, sind sie immer noch nahe an der ersten Verwendung.
Das Anti-Muster "deklarieren und auf NULL setzen", wenn Sie oben deklarieren möchten, aber einige für die Initialisierung erforderliche Berechnungen nicht durchgeführt haben, wird ebenfalls behoben, da die zu initialisierenden Elemente wahrscheinlich als Argumente empfangen werden.
Jetzt denke ich also, dass Sie an der Spitze der Funktionen deklarieren und so nah wie möglich an der ersten Verwendung sein sollten. Also BEIDE! Und der Weg, dies zu tun, führt über gut unterteilte Unterprogramme.
Wenn Sie jedoch an einer langen Funktion arbeiten, sollten Sie die Dinge am nächsten verwenden, da dies das Extrahieren von Methoden erleichtert.
Mein Rezept ist das. Nehmen Sie für alle lokalen Variablen die Variable und verschieben Sie ihre Deklaration nach unten, kompilieren Sie sie und verschieben Sie die Deklaration kurz vor dem Kompilierungsfehler. Das ist die erste Verwendung. Tun Sie dies für alle lokalen Variablen.
int foo = 0;
<code that uses foo>
int bar = 1;
<code that uses bar>
<code that uses foo>
Definieren Sie nun einen Bereichsblock, der vor der Deklaration beginnt, und verschieben Sie das Ende, bis das Programm kompiliert wird
{
int foo = 0;
<code that uses foo>
}
int bar = 1;
<code that uses bar>
>>> First compilation error here
<code that uses foo>
Dies wird nicht kompiliert, da es mehr Code gibt, der foo verwendet. Wir können feststellen, dass der Compiler den Code durchgehen konnte, der bar verwendet, weil er nicht foo verwendet. Zu diesem Zeitpunkt gibt es zwei Möglichkeiten. Die mechanische besteht darin, das "}" einfach nach unten zu bewegen, bis es kompiliert ist, und die andere Möglichkeit besteht darin, den Code zu überprüfen und festzustellen, ob die Reihenfolge geändert werden kann in:
{
int foo = 0;
<code that uses foo>
}
<code that uses foo>
int bar = 1;
<code that uses bar>
Wenn die Reihenfolge geändert werden kann, ist dies wahrscheinlich das, was Sie möchten, da dies die Lebensdauer temporärer Werte verkürzt.
Eine andere Sache, die zu beachten ist, ist, dass der Wert von foo zwischen den Codeblöcken, die es verwenden, beibehalten werden muss, oder könnte es in beiden nur ein anderes foo sein. Beispielsweise
int i;
for(i = 0; i < 8; ++i){
...
}
<some stuff>
for(i = 3; i < 32; ++i){
...
}
Diese Situationen erfordern mehr als mein Verfahren. Der Entwickler muss den Code analysieren, um zu bestimmen, was zu tun ist.
Der erste Schritt ist jedoch, die erste Verwendung zu finden. Sie können dies visuell tun, aber manchmal ist es einfacher, die Deklaration zu löschen, zu kompilieren und sie einfach wieder über die erste Verwendung zu setzen. Wenn sich diese erste Verwendung in einer if-Anweisung befindet, legen Sie sie dort ab und prüfen Sie, ob sie kompiliert wird. Der Compiler identifiziert dann andere Verwendungen. Versuchen Sie, einen Bereichsblock zu erstellen, der beide Verwendungszwecke umfasst.
Nachdem dieser mechanische Teil fertig ist, ist es einfacher zu analysieren, wo sich die Daten befinden. Wenn eine Variable in einem großen Bereichsblock verwendet wird, analysieren Sie die Situation und prüfen Sie, ob Sie dieselbe Variable nur für zwei verschiedene Dinge verwenden (z. B. ein "i", das für zwei for-Schleifen verwendet wird). Wenn die Verwendungen nicht zusammenhängen, erstellen Sie für jede dieser nicht verwendeten Verwendungen neue Variablen.