Zum Hauptinhalt springen

Guter Programmierstil

Wenn unsere Programme komplexer werden, wird es immer schwieriger, einen guten Überblick über den Code zu behalten. Insbesondere wenn wir später nochmal Änderungen am Code vernehmen müssen, ist es hilfreich, wenn er übersichtlich und nachvollziehbar geschrieben ist. In der Vorlesung haben wir zwischendurch immer mal wieder angemerkt, wie ordentlicher und strukturierter Java-Code aussehen soll, damit man selbst und andere ihn gut lesen können. Folgende Regeln sollten Sie kennen:

Sinnvolle Einrückung

Der Programmcode ist sinnvoll eingerückt, einheitlich mit entweder Tabs oder Leerzeichen. So wird z. B. bei Verschachtelungen von Kontrollstrukturen optisch einfacher ersichtlich, welcher Code zu welchem Block gehört.

for (int[] row: neighborhood) {
for (int number: row) {
System.out.print(number);
System.out.print(" ");
}
System.out.println();
}
for (int[] row: neighborhood) {
for (int number: row) {
System.out.print(number);
System.out.print(" ");
}
System.out.println();
}

Setzen von Klammern und Leerzeichen

Klammern und Leerzeichen (z. B. um Operatoren) werden in einem einheitlichen Stil gesetzt. Stilwechsel stören den Lesefluss, ähnlich wie unterschiedliche Schriftarten mitten in einem Aufsatz.

double p⁢ = Double.parseDouble(args[0]);
double q⁢=Double.parseDouble(args[1]);
double p⁢ = Double.parseDouble(args[0]);
double q⁢ = Double.parseDouble(args[1]);

Ein Statement pro Zeile

In jeder Zeile steht nur ein Statement. Dadurch kann man beim Lesen nicht so leicht Befehle, die zwischendurch passieren, überlesen.

if ((rowIndex + columnIndex) % 2 == 0) System.out.print("*"); else System.out.print(" ");
if ((rowIndex + columnIndex) % 2 == 0) {
System.out.print("*");
} else {
System.out.print(" ");
}

Sprechende Namen

Variablen und Methoden sind sinnvoll benannt. So wissen wir immer, was dort gespeichert ist bzw. was eine Methode tut, ohne ihren Quelltext lesen zu müssen.

if ((i1 + i2) % 2 == 0) {
System.out.print("*");
} else {
System.out.print(" ");
}
if ((rowIndex + columnIndex) % 2 == 0) {
System.out.print("*");
} else {
System.out.print(" ");
}

CamelCase

Variablen und Methoden werden in lowerCamelCase benannt, Programme/Klassen in UpperCamelCase, Konstanten in SNAKE_CASE. Damit sehen wir auf den ersten Blick, ob wir gerade eine Variable oder einen Objekttypen vor uns haben.

public boundingBox get_bounding_box() {
return new boundingBox(Position, Width, Height);
}
public BoundingBox getBoundingBox() {
return new BoundingBox(position, WIDTH, HEIGHT);
}

Einmalige Variablennutzung

Eine Variable hat einen Zweck (und ist entsprechend benannt) und wird nicht ein paar Zeilen später für einen anderen Zweck „recyclet“. Andere Personen oder man selbst könnten sonst verwirrt werden.

public void nullstellen(double a, double b) {
if(a != 0) {
a = -b / a;
System.out.println(a);
}
}
public void nullstellen(double a, double b) {
if(a != 0) {
double nullstelle = -b / a;
System.out.println(nullstelle);
}
}

Aufteilung in Klassen und Methoden

Der Code ist sinnvoll in Klassen und Methoden aufgeteilt. Dadurch ist es nicht notwendig, alle Details zu lesen, um den Zweck eines Programms zu erkennen, und man kann Programmteile wiederverwenden.

Sinnvolle Sichtbarkeit

Instanzvariablen haben minimale Sichtbarkeit. Damit sind sie gegen versehentliche Änderung von anderen Klassen (bzw. Personen) geschützt und die Interna der Klasse können später angepasst werden, ohne dass andere Klassen kaputt gehen.

public class Rechteck {
public int breite;
public int hoehe;
public class Rechteck {
private int breite;
private int hoehe;

Benannte Konstanten

Wiederkehrende Konstanten (z. B. 86400) sind in finalen Variablen gespeichert. Aus dem Namen sollte ersichtlich werden, was der Wert bedeutet (z. B. SECONDS_PER_DAY).

return verstricheneZeit > 86400;
return verstricheneZeit > SEKUNDEN_PRO_TAG;

Sinnvolle Kommentare

Komplexere Codestellen sind kommentiert. Das bietet sich z. B. dann an, wenn die Funktionsweise einer Methode nicht 100%ig durch ihren Namen erklärt werden kann.

Andersherum sollten Kommentare nicht wiederholen, was der Code schon offensichtlich aussagt.

// Setze binBreite gleich dem ersten Argument
int binBreite = Integer.parseInt(args[0]);
int binBreite = Integer.parseInt(args[0]);

Hilfreiche Fehlermeldungen

Mögliche Fehlerfälle werden mit sprechender Fehlermeldung behandelt. Benutzer:innen finden es sehr doof, wenn eine Anwendung z. B. nur „DB Error“ ausgibt, ohne zu sagen, was das Problem war.

Verständlichkeit wichtiger als Kürze

Längerer, aber einfacher verständlicher Code ist kompaktem, aber schwierig nachvollziehbarem Code voruziehen. Beispielsweise sollte man Konstruktionen wie j = ++i; vermeiden.

zahlen[anzahl++] = neueZahl;
zahlen[anzahl] = neueZahl;
anzahl++;
Vorschau

Im Programmierpraktikum werden Sie noch mehr Regeln kennen lernen, damit insbesondere große Programme einfach verändert werden können.