26.6 Ausdrücke
Ausdrücke begegnen uns in Programmen unentwegt. Da sie so eine große Bedeutung haben, ist auf gute Lesbarkeit und Strukturierung zu achten. Einige Punkte fallen besonders ins Gewicht:
|
Shift-Operatoren als Ersatz für arithmetische Operationen sind zu vermeiden. Für einen Compiler oder eine optimierende Laufzeitumgebung ist es gleich, ob er eine Zahl um zwei Stellen nach links shiftet oder mit vier multipliziert - der generierte Code sollte optimiert derselbe sein. |
|
Um die Reihenfolge der Operationen in komplexen Ausdrücken zu enthüllen, sind Klammern zu setzen. Bezüglich der Auswertungsreihenfolge gibt es in Java einige Fallen. Die Abfrage, ob zwei Werte kleiner als eine Zahl sind, ist mit dem Ausdruck a&b < 10 falsch gelöst; die Interpretation ist a&(b<10), also ist diese Anweisung doppelt falsch, außer, wenn a ein boolean ist. Ungeschickt eingestreute Leerzeichen können hier ganz schnell falsche Ausführungsreihenfolgen suggerieren, deshalb ist besondere Vorsicht geboten. |
|
Glücklicherweise unterstützt die Syntax von Java es nicht, Wahrheitsausdrücke aus Vergleichen mit in einen Ausdruck einzubringen, der nicht den Typ boolean hat. In C ist es kein Problem, beispielsweise durch a=27*(b<10) einer Zahl a genau dann den Wert 27 zuzuweisen, wenn b kleiner 10 ist. (Ist b<10 wahr, dann ist dieser Ausdruck wahr und somit ist a=1*27=27. Ist b aber größer oder gleich 10, dann ergibt der Vergleich b<10 eine 0 und a=0*27=0.) In diesem Fall brauchen wir noch nicht einmal auf eine if-Verzweigung zurückzugreifen, denn mit dem trinären Operator geht es auch: a = (b < 10) ? 27 : 0. |
Auch wenn wir meinen, dass
a = (b = c + d) + e;
eine Vereinfachung im Vergleich zu
b = c + d;
a = b + e;
ist, sollten wir mit einer Zuweisung pro Zeile auskommen.
Zahlenliterale, also unbenannte Konstanten, sollten wir in Ausdrücken vermeiden. Da sie die Werte später ändern können (wie die Mehrwertsteuer), fehlt die Übersicht, wo der Quellcode überall geändert werden muss und wo der zufällig gleiche Wert die gleiche Bedeutung hat. Daher führt ein guter Programmierer Konstanten ein. Sie werden in Java mit final deklariert. Von Konstanten mit besonderer Bedeutung, so genannten »Magic Numbers«, ist abzuraten. Wenn der Wert einer solchen magischen Variable später geändert wird, zaubert das Programm auf einmal etwas ganz anderes daraus, da sich die Änderung an vielen Programmstellen auswirkt. Wir sollten Konstanten definieren für numerische Werte (zum Beispiel PI, Umrechnungsfaktoren) oder Werte von Aufzählungstypen.
|