Programmierstil
Als Programmierstil (auch Code Conventions, Coding Conventions oder Coding Standards) bezeichnet man einen Satz von Regeln, nach welchen der Quelltext einer Programmiersprache formatiert wird, oder auch die völlige Abwesenheit solcher Regeln, man spricht dann von chaotischem oder schlechtem Programmierstil. Ein Style Checker ist ein Programm, das einen Quelltext auf die Einhaltung eines Programmierstils hin überprüft. Ein Beautifier ist ein Programm, das einen Quelltext gemäß einem Programmierstil formatiert.
Elemente
Der Programmierstil bezieht sich auf:
- Einrückung von untergeordneten Programmelementen (Einrückungsstil)
- Positionierung umschließender Syntaxelemente wie
{}
,[]
,()
,BEGIN
,END
- Einsatz von Leerzeichen und Leerzeilen
- Einsatz von Kommentaren. Die Abwesenheit von Kommentaren ist ein Zeichen für einen schlechten Programmierstil. Ein Programmierer muss immer davon ausgehen, dass sein Code auch von anderen gelesen und verstanden werden muss, dafür sind Kommentare unerlässlich. Heutzutage ist oft auch ein Format für Kommentare einzuhalten, das z.B. Ein- und Ausgabewerte einer Funktion einzeln erläutert und von automatischen Dokumentationsprogrammen wie doxygen oder javadoc verwendet werden kann.
- Namenskonventionen für Symbole. Außerdem sollte der Name eines Symbols schon die Funktion oder Verwendungsweise hinreichend erklären oder andeuten; da heute hinreichend Speicherplatz für den Code zur Verfügung steht, ist die platzsparende Verwendung früherer Zeiten von Kürzeln wie dskmngr nicht mehr gerechtfertigt. Häufig wird für unterschiedliche Arten von Symbolen auch eine unterschiedliche Schreibweise verwendet, um so am Symbolnamen ablesen zu können, ob es sich um eine Variable, eine Funktion / Methode, eine Klasse, eine Konstante etc. handelt.
- Reihenfolge der Deklaration von Symbolen
- Länge und Umfang von Symbolen
- Verschachtelungstiefe untergeordneter Programmelemente
Diese Elemente beziehen sich mehr auf die optische Lesbarkeit eines Programms.
Style Checker können die meisten Kriterien für einen guten Programmierstil bezüglich dieser Elemente überprüfen. Beautifier sind in der Lage, durch Umformatierung des Quelltextes die Einhaltung eines guten Stils bezüglich dieser Elemente zu gewährleisten.
Elemente im weiteren Sinne
Im weiteren Sinne bezieht sich der Programmierstil auch auf:
- Umsetzung eines Programmierparadigmas, wie z.B. der Objektorientierten Programmierung; fehlende Anwendung eines von der Programmiersprache zur Verfügung gestellten bzw. unterstützten Paradigmas kann als schlechter Programmierstil bezeichnet werden.
- Anwendung von Entwurfsmustern
- Refaktorisierung
- Datentransportstile und -richtung (z.B. Push vs. Pull)
- Einsatz passender API-Komponenten
- Typisierung (Wahl des Typs für ein Symbol)
- Vermeidung von Redundanz
- Löschung überflüssiger Programmteile
- Unabhängigkeit verschiedener Programmteile voneinander
- Abstraktionsgrad und Verallgemeinerung
- Wiederverwendbarkeit
- Robustheit
- Fehler- und Ausnahmebehandlung
Diese Elemente beziehen sich im Wesentlichen auf die inhaltliche Verständlichkeit eines Programms.
Die Beurteilung des Programmierstils bezüglich dieser Elemente erfordert ein tiefes semantisches Verständnis des Programmquelltextes. Style Checker und Beautifier sind bisher nicht oder nur äußerst eingeschränkt dazu in der Lage, die Überprufung eines guten Programmierstils bezüglich dieser Elemente durchzuführen bzw. eine Einhaltung zu gewährleisten.
Sinn / Vorteil
Der Zweck eines definierten Programmierstils ist die Erleichterung der Arbeit aller an einem Programmierprojekt beteiligten Teammitglieder. Das bezieht sich insbesondere auf:
- Lesbarkeit
- Verständlichkeit
- Wartbarkeit
Während der Wartung ist die Einhaltung eines definierten Programmierstils noch wichtiger als während der Entwicklung. Als Richtwert gilt, dass 80% der Lebenszeit eines Softwareprodukts auf die Wartung entfallen. Nur selten wird ein Produkt vom ursprünglichen Programmierer gewartet. Umso wichtiger ist es, dass bereits vom ersten Augenblick an ein guter Programmierstil verwendet wurde.
Nachteile
Ein Programmierstil sollte nicht unbedingt wie eine Doktrin ausgelegt werden. Verstöße gegen einen Programmierstil sollten erlaubt sein - wenn sie gut begründet sind!
Umstrittene Elemente
Die folgenden Elemente von Programmierstilen sind umstritten. Es folgt zu jedem umstrittenen Element eine Erörterung inklusive einer Darstellung der Argumente der jeweiligen Befürworter und Gegner. Falls möglich und als allgemein akzeptiert betrachtbar, schließt sich eine Empfehlung bezüglich des umstrittenen Elements an die Erörterung.
Zeilenlänge
Die Begrenzung der Zeilenlänge ist umstritten. Pro:
- Kürzere Zeilen sind in der Regel leichter lesbar als längere.
- Häufig lassen sich die längeren Zeilen semantisch in einzelne Teile untergliedern.
- Die Darstellung erlaubt nur eine begrenzte Zeilenlänge.
- In einem schlechten Editor kann man eine umgebrochene Zeile von einer neuen Zeile nicht unterscheiden.
Contra:
- Insbesondere neuere APIs wie das von Java verwenden lange Symbolnamen. So entstehen Zeilen, die trotz ihrer Länge leicht verständlich sind und deren Umbruch nur zur Einhaltung eines Programmierstils ohne die Erfüllung des eigentlichen Zwecks - Verbesserung der Lesbarkeit - geschehen würde.
- Heutige Editoren können automatisch visuell umbrechen.
- In einem guten Editor kann man eine umgebrochene Zeile deutlich von einer neuen Zeile unterscheiden.
Beispiel (Java):
out = new PrintWriter(new OutputStreamWriter(new BufferedWriter(new FileOutputStream(new File(baseDir, "test.txt"))), "utf-8"));
In einem normalen Java-Programm wäre die Zeile bei einer Einrückungstiefe von 4 Leerzeichen pro Block mindestens 140 Zeichen lang. Das Umbrechen dieser Zeile würde die Lesbarkeit des Programms jedoch unter Umständen eher erschweren als fördern.
Empfehlung: Man sollte im Zweifelsfall immer prüfen, ob das Umbrechen der Zeile die Lesbarkeit tatsächlich erhöht. Tut sie das nicht, sollte man lieber nicht umbrechen. Der Programmierstil dient den Programmierern, nicht umgekehrt.
Positionierung geschweifter Klammern {} für Blöcke in C-basierten Sprachen
Der Einrückungsstil ist wohl der umstrittenste Punkt eines Programmierstils. Eine Aussage darüber, welcher der verschiedenen konkurrierenden Stile der beste ist, kann und will dieser Artikel nicht geben.
Folgende Empfehlungen gelten jedoch als allgemein anerkannt:
- Legen Sie sich innerhalb eines Projekts, Teil-Projekts, Teams oder Unternehmens fest. Die Festlegung kann auch von Faktoren abhängen, sie muss jedoch eindeutig sein. Beispiel: "Für unsere Open Source-Projekte in C und C++ verwenden wir die GNU Coding Standards, für Java grundsätzlich die Code Conventions von SUN und ansonsten die gemäß Allman." Wichtig ist vor allem, dass es eine eindeutige, verbindliche Festlegung gibt.
- Halten sie sich an die Festlegung und setzen sie diese konsequent um.
- Mischen Sie die verschiedenen Stile nicht.
- Erfahrene Programmierer, die mit dem Mischen der verschiedenen Stile keine Probleme haben, sollten dies mit Rücksicht auf weniger erfahrene Team-Mitglieder dennoch nicht tun.
Einrückungstiefe und -zeichen
Ebenfalls häufig diskutiert wird, ob bei der Einrückung Leerzeichen oder Tabulator zu bevorzugen und um wie viele Leerzeichen geschachtelte Elemente einzurücken sein. So schreibt die Code Convention für Java beispielsweise eine Einrückungstiefe von 4 Leerzeichen, die Code Convention für Linux eine Einrückungstiefe von 8 Zeichen vor. Der Vorteil der Einrückung mit Leerzeichen besteht darin, dass die Einrückung unabhängig von den Anzeigeoptionen des Anzeigeprogramms oder Editors stets erhalten bleibt. Tabulatoren zur Einrückung bieten im Gegenzug den Vorteil, dass jeder Entwickler selbst durch die Konfiguration der Tabulatorschrittweite seines Texteditors die dargestellte Einrückungstiefe bestimmen kann. Einigkeit besteht jedoch bezüglich der Auffassung, dass man beide Varianten nicht mischen sollte. Eine Mischung von Tabulatoren und Leerzeichen bei der Einrückung bedeutet, dass ein Teil der Zeilen abhängig von der Tabulatorschrittweite eingerückt wird, ein anderer nicht, was zu einer uneinheitlichen und damit unlesbaren Einrückung führt. Auch die Einrückungstiefe und das Einrückungszeichen werden unter Einrückungsstil eingehender erläutert.