„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
Bezeichner sind die «Namen» von Klassen, Methoden, Attributen, Variablen und Konstanten.
Ein sprechender Bezeichner sagt etwas über den Sinn und Zweck einer Komponente aus. Durch den Einsatz von sprechenden Bezeichnern werden viele Kommentare überflüssig.
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; } }
Durch eine einheitliche Schreibweise verbessern Sie die Lesbarkeit Ihres Sourcecodes.
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; } }
Der Einsatz von public-Attributen untergräbt das Prinzip der Datenkapselung.
Die konsequente Verwendung von getter/setter-Methoden unterstützt lazy initialization und vermeidet Konflikte mit lokalen Variablen.
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; } }
Eine klare und einheitliche Programmierung erleichtert das Lesen eines Sourcecodes.
Ein Programmblock wird zwischen geschweiften Klammern { … } eingefasst.
if (anredeCode == 1) { return "Herr"; } else { return "Frau"; } try { ... } catch (...) { ... }
if (anredeCode == 1) { return "Herr"; } else { return "Frau"; } try { ... } catch (...) { ... }
Eine Codezeile sollte immer auf einen Blick erfasst werden können.
if ( ( Integer.parseInt(eingabeMenge) >= mindestMenge && Integer.parseInt(eingabeMenge) <= maximalMenge ) || ( kunde.kundenArt.equals("Stammkunde") && Integer.parseInt(eingabeMenge) > 0 ) ) { .... }
Konstruktoren versetzen ein neu erzeugtes Objekt in einen definierten Anfangszustand.
public class Project { private String projectTitle; private Category category; /** * default constructor */ public Project() { setProjectTitle(“”); setCategory(new Category()); } ... }
Durch eine geeignete Reihenfolge fällt es leichter, die richtige Methode effizient zu finden.
Zur Dokumentation des Sourcecodes verwenden wir Javadoc-Kommentare. Dadurch ersparen wir uns eine separate Beschreibung der Klassen und Methoden in einem Textdokument.
Der Klassenkopf ist die Visitenkarte einer Klasse. Er informiert den Programmierer über Aufgabe und Version dieser Klasse.
/** * category to which a project is assigned * * @author Marcel Suter * @since 2017-09-19 * @version 1.0 * */
Der Methodenkopf liefert alle Angaben über die Aufgabe und Schnittstelle einer Methode.
/** * 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 sind wie das Salz in der Suppe: Zuwenig und es schmeckt nicht, zu viel und es ist ungeniessbar.
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; }