Prof. Dr. Pape - Java Programmierrichtlinien - Ausdrücke

Deutsch

Quelltextformatierung - Ausdrücke

Zurück zur Übersicht

Leerzeichen bei Operatoren

Regel: Setzte vor und nach jedem binären Operator ein Leerzeichen.
Begründung: Damit Ausdrücke bei langen Bezeichnern lesbarer werden.

Beispiel

a = 1 + 7 * (5 / a);
flaecheninhalt = kreisradius * kreisradius * 3.14159265;

Begründung

Operatoren sind wichtig, um zusammengehörige Teilausdrücke zu identifizieren und zu verstehen. Da sie im Gegensatz zu Bezeichnern oder Zahlen sehr kurz sind „verschwinden“ sie für menschlichen Leser sehr schnell. Durch Hinzufügen der Leerzeichen werden die Operatoren wieder hervorgehoben.

Umbrechen von überlangen Ausdrücken

Regel: Breche überlange Zeilen wie folgt um:
  • bei arithmetischen Operatoren vor einem Operator mit der schwächsten Bindung (Operatoren so auswählen, dass nicht zu viele Zeilenumbrüche entstehen)
  • bei Methodenaufruf oder Parameterdeklaration nach einem Komma
  • rücke den umgebrochenen Teil soweit nach rechts ein, dass er sich unterhalb des zugehörigen linken Teilausdrucks des Operators befindet mit zwei bis vier zusätzlichen Leerzeichen
Begründung: Damit Quelltexte lesbarer werden.

Beispiel

				   |     <-- soll das "Zeilenende" markieren
a * a * a + 3 * a * a * b + 3 * a * b * b + b * b *b

Nicht bei *, sondern bei + umbrechen (+ bindet schwächer als *)

a * a * a + 3 * a * a * b
     + 3 * a * b * b + b * b *b
                                   |
x1 * 3 + (a + b + 6) * ((x2 + 8) + x3 / 11)

Bei + umbrechen im zweiten Faktor, wäre schlecht, da durch Einrücken, dann x3 / 11 über die Grenze hinausragt. Deswegen besser bei * umbrechen.

x1 * 3 + (a + b + 6)
            * ((x2 + 8) + x3 / 11)
public Address(String strasse,
               String hausnummer,
               int postleitzahl,
               String ortsname) {
  ...
}

Begründung

Damit die Operatoren bei komplexeren Ausdrücken mit längeren Bezeichner oder Zahlen nicht so leicht überlesen werden und die Struktur eines Ausdrucks besser erkennbar ist.

Vergleich mit Booleschen Werten

Regel: Vergleiche Boolesche Werte in einem Booleschen Ausdruck nicht mit == auf true oder false. Verwende stattdessen bei true, den Booleschen Ausdruck selbst und bei false dessen Negation (bei != entsprechend umgekehrt)
Begründung: Quelltexte werden leserlicher

Beispiel

Anstatt folgenden Booleschen Ausdruck

schaltjahr == true && volljaehrig == false

verwende besser

schaltjahr && ! volljaehrig

Begründung

Bei Verwendung der Getter-Methoden mit vorangestellten is und Aussprache von ! als „nicht“ oder „not“, werden Boolesche Ausdrücke so kürzer und verständlicher.

isSchaltjahr() && ! isVolljaehrig()

Liest sich als "ist ein Schaltjahr und nicht volljähhrig"

Operatorenreihenfolge

Regel: Bei mathematischen Vergleichen wie 0 < i < j < n behalte die Reihenfolge der Operatoren und Variablen in der Implementierung bei.
Begründung: Quelltexte werden verständlicher.

Beispiel

if (0 < i && i < j && j < n) {

}

Oder für i = j = 7 < n

if (i == j && j == 7 && 7 < n) {

}

Begründung

Der resultierende Ausdruck ist dann sehr nah an der mathematischen Schreibweise orientiert und leichter verständlich, da er die ursprüngliche zu implementierende Form beibehält.

Vermeide Seiteneffekte

Regel: Ein Ausdruck sollte keine Seiteneffekte haben, das heisst, ein Ausdruck sollte keine Zustandsänderungen durchführen.
Regel: Insbesondere sollten Funktionen keine Seiteneffekte haben.
Begründung: Vermeidung von Programmierfehlern und bessere Verständlichkeit von Quelltexten.

Beispiel

Welchen Wert hat a, nachdem die letzte Anweisung ausgeführt wurde?

int a = 1;

a = (a = 2) + (a += a) * (a = 1 + a);

Begründung

Ausdrücke werden in Programmen zur Abfrage von Werten und Zuständen verwendet. Wie bei mathematischen Ausdrücken, erwartet ein Mensch beim Lesen von Java-Ausdrücken normalerweise nicht, dass diese auch Zustände ändern könnten. Tun sie dies doch, dann sind derartige Ausdrücke oft für einen Menschen sehr schlecht zu verstehen. Das liegt unter anderem daran, das durch den Vorrang von Operatoren und Klammerungen, die Teilausdrücke nicht sequentiell von links nach rechts ausgewertet werden: gleichzeit die Zustandsänderungen und die Ablaufreihenfolge zu erfassen, ist für einen Menschen sehr schwierig.

Wenn in Booleschen Ausdrücken die "Kurzschluss"-Operatoren || oder && enthalten sind, werden nicht immer alle Teile des Ausdrucks ausgewertet. Dies kann zu ungewollten Fehlern führen: In (a > 1 || b++ < 0) wird b nur um Eins erhöht, wenn a <= 1 gilt. Bei Verwendung von | wirde b immer erhöht.

Funktionen werden normalerweise in Ausdrücken verwendet. Deswegen sollte aus oben genannten Gründen eine Funktion Seiteneffekt-frei sein. In Fällen, in denen das nicht möglich ist, müssen die Seiteneffekte immer unmissverständlich dokumentiert werden. Dazu kommt, dass die Zustandsänderung bei Verwendung von Funktionen im Ausdruck im Ausdruck selbst nicht gesehen werden kann.

Vermische Kurzschlußoperatoren nie mit "normalen" Booleschen Operatoren

Regel: Vermische nie die Kurzschlußoperatoren (&&,||) mit den "normalen" Booleschen Operatoren (&, ^, |) in einem Ausdruck
Begründung: Fehlervermeidung und Wartbarkeit

Beispiel

Welchen Wert hat folgender Ausdruck?

 false && true | true

Überlegen Sie sich den Wert. Anschließend überprüfen Sie den Ausdrück mit Java.

Begründung

&& bindet schwächer als |. Deswegen ist der Wert des Ausdrucks false und nicht true, wie es "logischerweise" sein müsste.