BZZ - Codingstandards
„The first thing I would say is that when you write a program, think of it primarily as a work of literature. You're trying to write something that human beings are going to read. Don't think of it primarily as something a computer is going to follow. The more effective you are at making your program readable, the more effective it's going to be: You'll understand it today, you'll understand it next week, and your successors who are going to maintain and modify it will understand it. “ Donald Knuth
Symbole
Bezeichner
Bezeichner sind die «Namen» von Klassen, Methoden, Attributen, Variablen und Konstanten.
Sprechende Bezeichner
Ein sprechender Bezeichner sagt etwas über den Sinn und Zweck einer Komponente aus. Durch den Einsatz von sprechenden Bezeichnern werden viele Kommentare überflüssig.
Beispiel
public class category { String[] categories = {"Getränke", "Vorspeisen", "Hauptgang", "Dessert"};public class Project { private String projectTitle; private static final int NUMBER = 10; /** * @param projectTitle * the projectTitle to set */ public void setProjectTitle(String projectTitle) { this.projectTitle = projectTitle; } } public int readCategoryByTitle(String categoryTitle) { int categoryId = -1; for (int i=0; i < categories.length; i++) { if (categories[i].equals(categoryTitle)) { categoryId = i; } } return categoryId; } }
Schreibweise
Durch eine einheitliche Schreibweise verbessern Sie die Lesbarkeit Ihres Sourcecodes.
Beispiel
public class Project { private String projectTitle; private static final int NUMBER = 10; /** * @param projectTitle * the projectTitle to set */ public void setProjectTitle(String projectTitle) { this.projectTitle = projectTitle; } }
Sichtbarkeit von Attributen
Datenkapselung
Der Einsatz von public-Attributen untergräbt das Prinzip der Datenkapselung.
Zugriff auf Attribute
Die konsequente Verwendung von getter/setter-Methoden unterstützt lazy initialization und vermeidet Konflikte mit lokalen Variablen.
Beispiel
public class Project { private String projectTitle; private Category category; private static final int NUMBER = 10; /** * default constructor */ public Project() { setProjectTitle(“”); setCategory(new Category()); } /** * @param projectTitle * the projectTitle to set */ public void setProjectTitle(String projectTitle) { this.projectTitle = projectTitle; } /** * @param category * the category to set */ public void setCategory(Category category) { this.category = category; } }
Darstellung und Formatierung
Eine klare und einheitliche Programmierung erleichtert das Lesen eines Sourcecodes.
Programmblöcke
Ein Programmblock wird zwischen geschweiften Klammern { … } eingefasst.
Beispiel: Variante 1 (K&R style)
if (anredeCode == 1) { return "Herr"; } else { return "Frau"; } try { ... } catch (...) { ... }
Beispiel: Variante 2
if (anredeCode == 1) { return "Herr"; } else { return "Frau"; } try { ... } catch (...) { ... }
Codezeilen
Eine Codezeile sollte immer auf einen Blick erfasst werden können.
Beispiel
if ( ( Integer.parseInt(eingabeMenge) >= mindestMenge && Integer.parseInt(eingabeMenge) <= maximalMenge ) || ( kunde.kundenArt.equals("Stammkunde") && Integer.parseInt(eingabeMenge) > 0 ) ) { .... }
Konstruktoren
Konstruktoren versetzen ein neu erzeugtes Objekt in einen definierten Anfangszustand.
Beispiel
public class Project { private String projectTitle; private Category category; /** * default constructor */ public Project() { setProjectTitle(“”); setCategory(new Category()); } ... }
Anordnung der Methoden
Durch eine geeignete Reihenfolge fällt es leichter, die richtige Methode effizient zu finden.
Beispiel
- Konstruktoren
- Default constructor
- Alternative Konstruktoren
- Methoden die eine Verarbeitung auslösen (z.B. savePerson())
- Methoden die auf ein Ereignis reagieren (Listener, Events)
- Getter/Setter-Methoden
- Getter/Setter mit integrierter Logik
- «Normale» Getter/Setter die Attribute 1 zu 1 lesen oder schreiben.
Kommentare und Dokumentation
Zur Dokumentation des Sourcecodes verwenden wir Javadoc-Kommentare. Dadurch ersparen wir uns eine separate Beschreibung der Klassen und Methoden in einem Textdokument.
Klassenkopf
Der Klassenkopf ist die Visitenkarte einer Klasse. Er informiert den Programmierer über Aufgabe und Version dieser Klasse.
Beispiel
/** * category to which a project is assigned * * @author Marcel Suter * @since 2017-09-19 * @version 1.0 * */
Methodenkopf
Der Methodenkopf liefert alle Angaben über die Aufgabe und Schnittstelle einer Methode.
Beispiel
/** * load a project from the database * * @param projectId the unique id of a project * @param categoryTitle the category title to be searched * @return enum Result * @throws Exception(“duplicate entry”) */
Kommentare
Kommentare sind wie das Salz in der Suppe: Zuwenig und es schmeckt nicht, zu viel und es ist ungeniessbar.
Beispiel
private Connector getConnector() { // create a new connector, if not exists // and establish connection if needed if (this.connector == null) { setConnector(new Connector()); } if (this.connector.getHandle() == null) { this.connector.connect(); } return this.connector; }