Hallo zusammen,
tut mir Leid, dass ich erst jetzt antworte, aber der knappe Halbmarathon hat mich doch ziemlich geschafft.
Die Posts schön zusammenfassen tut es mMn
Furtbichler
Zitat:
Lokale Variablen sind genau dann sinnvoll, wenn sie die Lesbarkeit erhöhen oder einen erneuten redundanten Aufruf ersparen.
Medium hat ebenfalls das DRY-Prinzip angesprochen. Das ist meiner Meinung nach der wichtigste Grund, Variablen überhaupt einzusetzen.
Beispiel: Das von mir viel zelebrierte Auseinanderpflücken eines Strings
(schlagt mir jetzt aber bitte kein RegEx vor)
Delphi-Quellcode:
var
temp : string;
p1, p2 : Integer;
[...]
temp := '<a href="';
p1 := Pos(temp, MyString);
if p1 > 0 then
begin
p1 := p1 + Length(temp);
p2 := PosEx('"', MyString, p1);
MyString := Copy(MyString, p1, p2 - p1);
end;
Hier die drei Variablen ersetzen zu wollen, würde definitiv in einer Menge Schreibarbeit und Kopfkratzen ausarten.
Die von Luckie, Furtbichler, Himitsu und anderen angesprochene vernünftige Benamsung von Variablen spart natürlich einen gewissen Teil dieses Kopfkratzens ein, da habt Ihr vollkommen Recht.
Heute schreibe ich auch "edAusgabePraemie" und nicht mehr "Edit3". Aber ich finde "p1" übersichtlich genug (so heißt es bei mir schon seit langer Zeit) und es muss nicht "iPosStart" heißen, damit ich später noch meinem Gedankengang folgen kann.
Während das DRY-Prinzip nach halbwegs objektiv ist, kommen wir doch mit der Lesbarkeit in einen völlig subjektiven Bereich hinein.
Ich sage (gilt ausschließlich für mich!) dass mich eine Variable, die ich nur ein einziges Mal brauche, eher irritiert, da ich nach dem DRY-Prinzip noch eine weitere Verwendungsstelle erwarte.
Aus einem aktuellen "5h-Projekt": Ich schreibe lieber
arr[i].Datei := StringReplace(Trim(SLt.Strings[2]), ' MiB', '', [rfReplaceAll]);
und nicht
Delphi-Quellcode:
temp_string := Trim(SLt.Strings[2]);
arr[i].Datei := StringReplace(temp_string, ' MiB', '', [rfReplaceAll]);
Ja, das war jetzt ein sehr einfaches Beispiel, bei dem auch
Sir Rufo und Himitsu vermutlich gesagt hätten, dass es "generell [...] ein Grenzfall für die Verwendung einer lokalen Variable" sei.
Dass man das auf der anderen Seite nicht übertreiben muss, steht auch fest. Selbst ich schreibe lieber
Delphi-Quellcode:
d := Copy(SL.Strings[i], 1, 2);
m := Format('%.2d', [FindMonth(Copy(SL.Strings[i], 4, 3))]);
y := Copy(SL.Strings[i], 8, 2);
bib.book[bib.findByTitle('Bordbuch Delta VII')].Date := y + '-' + m + '-' + d;
und nicht einen unverstehbaren und unwartbaren Spaghetticode wie
bib.book[bib.findByTitle('Bordbuch Delta VII')].Date := Copy(SL.Strings[i], 8, 2) + '-' + Format('%.2d', [FindMonth(Copy(SL.Strings[i], 4, 3))]) + '-' + Copy(SL.Strings[i], 1, 2);
Die von
Uwe Raabe angesprochene Auswertbarkeit im Debugger ist natürlich ebenfalls ein Vorteil, der mir auch schon das eine oder andere Mal aus der Patsche geholfen hat.
(Auf der anderen Seite gibt es aber auch OutputDebugString(...), das ebenfalls gute Dienste leistet, besonders in Threads)
Es gibt wirklich Vorteile für die Verwendung von lokalen Variablen: Das DRY-Prinzip und die Debugbarkeit seien da mal genannt.
Was die bessere Lesbarkeit anbelangt:
Ich bin nach wie vor der Meinung, dass nicht jede Variable nötig ist.
Beispielsweise ist mir eine kürzere (von der Anzahl der Zeilen) Methode lieber als eine längere. Bei der kürzeren müssen zwangsläufig einige Befehle zusammengefasst werden, was die einzelne Zeile länger werden lässt.
Es ist aber für mich wichtiger, um einen Überblick zu bekommen, schnell erkennen zu können, was diese Methode macht. Dafür nehme ich in Kauf, dass ich bei der einen oder anderen Befehlszeile einen Moment länger überlegen muss (solange es wie gesagt nicht in Spaghetticode ausartet).
Ich denke, man muss sich dabei irgendwo in der Mitte treffen.
Wie immer in kurz: Ihr sagt mehrheitlich, dass
die Verwendung von (lokalen) Variablen positiv gesehen werden kann, da sie der Lesbarkeit anträglich sind.
Danke und tschüss
Das sollte jetzt keine Belehrung an Euch sein, sondern eher meine selbstreflektive Zusammenfassung der Dinge, die Ihr geschrieben habt.