Programmierkonventionen

Programme sollten immer so geschrieben werden, dass sie für andere (Tutoren, weitere Entwickler) nicht unnötig schwer zu verstehen sind:

Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. — Damian Conway

Trotzdem gibt es nicht eine "richtige" Art zu programmieren. Grob lassen sich aber drei Felder ausmachen, in denen es bestimmte Regeln gibt:

Bezeichner

Klassen, Methoden und Variablen sollten immer sinnvoll benannt werden (bis auf Ausnahmen wie Laufvariablen in Schleifen), aber nicht übermässig lang sein. Wenn mehrere Wörter verbunden werden, sollten die Wörter entweder mit _ getrennt werden oder jedes Wort mit einem Großbuchstaben begonnen werden. Klassennamen sollten immer mit einem Großbuchstaben beginnen, Variablen und Methoden mit einem Kleinbuchstaben.

Negativbeispiele:

  int sL(String[] a) {
    int r = 0;
    for (int i = 0; i < a.length; i++) {
      r = r + a[i].length();
    }
    return r;
  }
   
  int summeDerLaengenDerStringsEinesStringArrays(String[] stringArray) {
    int summeDerLaengenDerStrings = 0;
    for (int wievieltesAngeschautesElement = 0; wievieltesAngeschautesElement < stringArray.length; wievieltesAngeschautesElement++) {
      summeDerLaengenDerStrings = summeDerLaengenDerStrings + stringArray[wievieltesAngeschautesElement].length();
    }
    return summeDerLaengenDerStrings;
  } 
   

Ein sinnvoller Mittelweg zwischen diesen Beispielen ist die folgende Funktion:

  int sumOfLengths(String[] daten) {
    int res = 0;
    for (int i = 0; i < daten.length; i++) {
      res = res + daten[i].length();
    }
    return res;
  } 
   

Einrückung

Anweisungen sollten jeweils in ihrer eigenen Zeile stehen. Jede semantische Ebene sollte um mindestens ein Leerzeichen eingerückt werden. Eine Ebene ist z.B. das "Innere" eines bedingten Codeblocks oder ein Schleifenkörper. Die zugehörigen schließenden geschweiften Klammern sollten dabei so stehen, dass klar ist, auf welche öffnende Klammer sie sich beziehen.

Negativbeispiele:

  while (foo()) { if (x < y) 
      x = y; r = x*y;
  }
   
  for (int i = 12; i > 0; i--) {
    for (int j = i*i; j > 0; j >> 1) {
      foo(); }}
    bar();
   

Klarere Versionen sind die folgenden:

  while (foo()) { 
    if (x < y){
      x = y;
    }
    r = x*y;
  }
   
  for (int i = 12; i > 0; i--) {
    for (int j = i*i; j > 0; j >> 1) {
      foo(); 
    }
  }
  bar();
   

Kommentare

Einzeilige Kommentare werden mit // eingeleitet, mehrzeilige Kommentare mit /* begonnen und mit */ beendet. Ein Kommentar sollte kurz und prägnant dokumentieren, welche Funktionalität der kommentierte Programmteil hat. Ist ein Kommentar ähnlich lang wie der kommentierte Code und ergänzt ihn nicht um wertvolle zusätzliche Informationen, ist er nicht nötig und sollte entfernt werden.

Für Klassen sollte jeweils vermerkt werden, welche Funktionalität zur Verfügung gestellt wird; für Methoden ist ggf. zu notieren, welche Seiteneffekte sie haben oder welche nicht im Typ der Parameter kodierten Voraussetzungen zutreffen müssen.

Local Variable Type Inference

Seit der Version 10 unterstützt Java das automatische Ableiten des Typs lokaler Variablen. So akzeptiert der Java Compiler beispielsweise folgenden Code, bei dem er den Typ der Variablen e automatisch als int ableitet.

    int[] a = { 1, 2, 3 };
    for (var e : a) {
      System.out.println(e);
    }
   

Wir betrachten diese Funktionalität als ein fortgeschrittenes Programmierkonstrukt, welches erfahrenen Programmierern dabei hilft, lesbaren Code zu schreiben. Programmieranfängern empfehlen wir, diese Funktionalität nicht zu nutzen, da sie Informationen versteckt, welche dem Programmieranfänger dabei helfen würden, den Code zu verstehen.