Programmierstil
aus Wikipedia, der freien Enzyklopädie
Als Programmierstil (engl. code conventions, coding conventions, coding standards) bezeichnet man einen Satz von Regeln, nach welchen der Quelltext einer Programmiersprache formatiert wird. Bei völliger Abwesenheit solcher Regeln spricht man von chaotischem oder schlechtem Programmierstil.
Inhaltsverzeichnis |
[Bearbeiten] 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 früher übliche platzsparende Verwendung 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. (Siehe auch Ungarische Notation)
- 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.
[Bearbeiten] Elemente im weiteren Sinne
Im weiteren Sinne bezieht sich der Programmierstil auch auf:
- Umsetzung eines Programmierparadigmas, wie zum Beispiel der Objektorientierten Programmierung; Nicht-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 Überprüfung eines guten Programmierstils bezüglich dieser Elemente durchzuführen bzw. eine Einhaltung zu gewährleisten.
[Bearbeiten] 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.
[Bearbeiten] 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. Dies kann in Einzelfällen beispielsweise (beim Programmierstil im engeren Sinne) durch optimierte Platzausnutzung den Überblick verbessern, durch Betonung bestimmter Einzelheiten der Verständlichkeit dienen oder als ad-hoc-Sonderregel für besondere Codeteile die Ziele des Programmierstils mit anderen Mitteln verfolgen.
[Bearbeiten] 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.
[Bearbeiten] Zeilenlänge
Oft wird eine Begrenzung der Zeilenlänge als guter Programmierstil angesehen. Dies ist allerdings umstritten. Für eine solche Begrenzung spricht, dass
- kürzere Zeilen in der Regel leichter lesbar als längere sind,
- sich häufig längere Zeilen semantisch in einzelne Teile untergliedern lassen,
- die Darstellung nur eine begrenzte Zeilenlänge erlaubt und
- sich in manchen Editoren umbrochene Zeilen nicht von neuen Zeile unterscheiden.
Gegen eine Begrenzung der Zeilenlänge spricht allerdings, dass
- insbesondere neuere APIs lange Symbolnamen verwenden. 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 automatisch visuell umbrechen können und
- in vielen Editoren eine umbrochene Zeile deutlich von einer neuen Zeile unterscheidbar ist.
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 vier 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.
Ein Beispiel (ebenfalls Java; Umbrüche von Eclipse erzeugt), das sehr viel mehr von Umbrüchen profitiert:
public ModelAndView handleList(HttpServletRequest request, HttpServletResponse response) throws ServletException { //... }
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.
[Bearbeiten] 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.
[Bearbeiten] 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 seien. 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.
[Bearbeiten] Vordefinierte Regelwerke zum Thema Programmierstil
Einige Qualitätsnormen im Softwareumfeld fordern explizit die Anwendung bestimmter Regelwerke. So verlangen unter anderem sowohl die IEC 61508 als auch CMMI und SPICE die Anwendung von Regelwerken.
Die bekanntesten Regelwerke dürfen die folgenden sein:
- MISRA-C für die C-Programmierung im automobilen Umfeld
- GNU coding standards für C-Programme im Umfeld der Free Software Foundation