Ja
Sie sollten immer Klammern verwenden ... Sie haben keinen Einfluss auf die Rangfolge ... der Entwickler des Compilers. Hier ist eine Geschichte, die mir über die Nichtverwendung von Klammern passiert ist. Dies betraf über einen Zeitraum von zwei Wochen Hunderte von Menschen.
Grund der realen Welt
Ich habe eine Mainframe-Anwendung übernommen. Eines Tages hörte es aus heiterem Himmel auf zu funktionieren. Das war's ... puh, es hat einfach aufgehört.
Meine Aufgabe war es, es so schnell wie möglich zum Laufen zu bringen. Der Quellcode war seit zwei Jahren nicht mehr verändert worden, aber plötzlich hörte er einfach auf. Ich habe versucht, den Code zu kompilieren und er ist in Zeile XX kaputt gegangen. Ich habe mir Zeile XX angesehen und konnte nicht sagen, was dazu führen würde, dass Zeile XX abbricht. Ich fragte nach den detaillierten Spezifikationen für diese Anwendung und es gab keine. Zeile XX war nicht der Täter.
Ich druckte den Code aus und begann ihn von oben nach unten zu überprüfen. Ich fing an, ein Flussdiagramm zu erstellen, was vor sich ging. Der Code war so verworren, dass ich kaum einen Sinn daraus ziehen konnte. Ich habe es aufgegeben, ein Flussdiagramm zu erstellen. Ich hatte Angst, Änderungen vorzunehmen, ohne zu wissen, wie sich diese Änderungen auf den Rest des Prozesses auswirken würden, zumal ich keine Einzelheiten darüber hatte, was die Anwendung tat oder wo sie sich in der Abhängigkeitskette befand.
Also habe ich beschlossen, am Anfang des Quellcodes zu beginnen und Leerzeichen und Zeilenbremsen hinzuzufügen, um den Code besser lesbar zu machen. In einigen Fällen stellte ich fest, dass sich die Bedingungen zusammentaten AND
und OR
es nicht klar erkennbar war, welche Daten AND
bearbeitet wurden und welche Daten OR
bearbeitet wurden. Also fing ich an, Klammern um die Bedingungen AND
und OR
zu setzen, um sie lesbarer zu machen.
Da ich langsam nach unten ging und es aufräumte, speicherte ich meine Arbeit regelmäßig. Irgendwann habe ich versucht, den Code zu kompilieren und es passierte etwas Merkwürdiges. Der Fehler hatte die ursprüngliche Codezeile übersprungen und war nun weiter unten. So fuhr ich fort, die speparating AND
und OR
Bedingungen mit Pars. Als ich fertig war, klappte es. Stelle dir das vor.
Ich beschloss dann, den Operations Shop zu besuchen und sie zu fragen, ob sie kürzlich neue Komponenten auf dem Hauptrahmen installiert hatten. Sie sagten ja, wir haben kürzlich den Compiler aktualisiert. Hmmmm.
Es stellt sich heraus, dass der alte Compiler den Ausdruck unabhängig davon von links nach rechts ausgewertet hat. Die neue Version des Compilers bewertete auch Ausdrücke von links nach rechts, aber mehrdeutigen Code, was bedeutet, dass eine unklare Kombination von AND
und OR
nicht aufgelöst werden konnte.
Daraus habe ich gelernt ... IMMER, IMMER, IMMER benutze ich Parens, um AND
Bedingungen und OR
Zustände voneinander zu trennen , wenn sie in Verbindung miteinander verwendet werden.
Vereinfachtes Beispiel
IF Product = 191 OR Product = 193 AND Model = "ABC" OR Product = 201 OR Product = 202 AND Model = "DEF" ...
(Code mit mehreren davon übersät)
Dies ist eine vereinfachte Version von dem, was ich angetroffen habe. Es gab auch andere Bedingungen mit zusammengesetzten booleschen Logikanweisungen.
Ich erinnere mich, dass ich es getippt habe, um:
IF ((Product = 191 OR Product = 193) AND Model = "ABC") OR ((Product = 201 OR Product = 202) AND Model = "DEF") ...
Ich konnte es nicht umschreiben, weil es keine Spezifikationen gab. Der ursprüngliche Autor war lange weg. Ich erinnere mich an starken Druck. Ein ganzes Frachtschiff war im Hafen gestrandet und konnte nicht entladen werden, da dieses kleine Programm nicht funktionierte. Keine Warnung. Keine Änderungen am Quellcode. Es dämmerte mir nur, die Netzwerkoperationen zu fragen, ob sie etwas geändert haben, nachdem mir aufgefallen war, dass das Hinzufügen von Parens die Fehler verschob.