stilrichtlinie
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | stilrichtlinie [2020-07-27 14:25] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Stilrichtlinie ====== | ||
+ | engl. coding style guide | ||
+ | |||
+ | > // Wo Inhalt ist, fügen sich die Formen von selbst. // | ||
+ | >> --- Leo Tolstoi, Tagebücher, | ||
+ | |||
+ | Meine Festlegungen für die Gestaltung von C++-Quelltexten. | ||
+ | Die hier empfohlenen Schreibweisen haben sich für mich als günstig erwiesen. | ||
+ | Merke: Richtlinien sind Empfehlungen, | ||
+ | In begründeten Fällen weiche ich vom Standardschema ab. | ||
+ | Einige andere Richtlinien zum Vergleich: | ||
+ | * ISO C++ Core Guidelines. https:// | ||
+ | * Google C++ Style Guide. http:// | ||
+ | * David Straker: C Style. Prentice Hall (1991). http:// | ||
+ | |||
+ | ====== Dateiorganisation ====== | ||
+ | Quelltext-Dateinamen enden auf *.cpp, Vorspanndateien (Header) auf *.h. | ||
+ | Header erhalten eine Include-Wächter, | ||
+ | der sich auf den Namen des Headers bezieht: | ||
+ | <code cpp> | ||
+ | //: demo.h : ... Dateikopf-Kommentar | ||
+ | |||
+ | #ifndef DEMO_H | ||
+ | #define DEMO_H | ||
+ | |||
+ | // ... Abhängigkeiten | ||
+ | #include <...> | ||
+ | |||
+ | // ... Inhalte hier | ||
+ | |||
+ | #endif // DEMO_H | ||
+ | </ | ||
+ | Jede Datei, auch Header, bezieht die genutzten Definitionen als ''# | ||
+ | Ausnahme: Zirkelbezüge sind durch Forward-Deklaration aufzulösen. | ||
+ | |||
+ | ====== Kommentare ====== | ||
+ | Quellcode sollte soweit wie möglich selbstdokumentierend sein, | ||
+ | u.a. durch gut gewählte, " | ||
+ | Wiederhole nicht im Kommentar, was schon im Quelltext gesagt ist. | ||
+ | Stimmen Quelltext und Kommentar nicht überein, ist vermutlich beides falsch. | ||
+ | Erläutere statt dessen, warum der Quelltext so geschrieben wurde: | ||
+ | <code cpp> | ||
+ | for (int t = 3; t <= sqrt(double(n))+0.5; | ||
+ | { | ||
+ | if (n%t == 0) return false; | ||
+ | } | ||
+ | </ | ||
+ | Auch Hinweise auf Literatur können angegeben werden: | ||
+ | <code cpp> | ||
+ | void farey_series(int n) | ||
+ | { | ||
+ | // Lit.: D.E.Knuth: DAOCP Vol. 1, Faszikel 1.3', " | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | Block-Kommentare ''/ | ||
+ | <code cpp> | ||
+ | //* // Ein Schrägstrich weg bzw. hinzu schaltet den ganzen Block aus / an. | ||
+ | ... | ||
+ | //*/ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ====== Namenskonventionen ====== | ||
+ | Zwiespalt: Deutsche und englische Namen (Schlüsselwörter) im Gemisch wirken komisch.((Ein Bad-Shop (?) für Sanitär-Einrichtungen (!) existierte nur für kurze Zeit auf der Wallstraße in Dresden. --- Warum nur?)) | ||
+ | Aber: Nutze die Fremdsprache Englisch nur, wenn Du Dir völlig sicher bist --- "false friends" | ||
+ | |||
+ | ===== Klassen und Strukturen ===== | ||
+ | Namen von Klassen und Strukturen beginnen mit Großbuchstaben. Der Rest ist klein geschrieben, | ||
+ | <code cpp> | ||
+ | class Commander | ||
+ | { // ... | ||
+ | private: | ||
+ | int data_; | ||
+ | }; | ||
+ | </ | ||
+ | Namen nicht öffentlicher Attribute enden mit einem Unterstrich. Weitere Regeln siehe Variablen. | ||
+ | |||
+ | |||
+ | ===== Methoden und Funktionen ===== | ||
+ | Funktionsnamen werden mit Kleinbuchstaben geschrieben, | ||
+ | <code cpp> | ||
+ | bool istPrimzahl(int n); | ||
+ | </ | ||
+ | Entscheidungsfragen sollten mit '' | ||
+ | |||
+ | " | ||
+ | <code cpp> | ||
+ | int n = std:: | ||
+ | std:: | ||
+ | </ | ||
+ | Parameternamen sollten " | ||
+ | |||
+ | ===== Variablen und Konstanten | ||
+ | Für Variablen werden Kleinbuchstaben verwendet, bei zusammengesetzten Namen camelCasing. | ||
+ | Konstanten werden mit Großbuchstaben geschrieben, | ||
+ | Vermeide Unterstriche am Anfang. | ||
+ | <code cpp> | ||
+ | int const MAX = 10; | ||
+ | int stauBecken = 1, staubEcken = 4 * stauBecken; | ||
+ | </ | ||
+ | Bei fast gleichen Namen besteht Verwechslungsgefahr, | ||
+ | <code cpp> | ||
+ | staubEcken = 4 * talsperren; | ||
+ | </ | ||
+ | Sprechende Namen werden bevorzugt, | ||
+ | aber für lokale Variablen wie Schleifenzaehler sind kurze Namen zu wählen, | ||
+ | eine Art " | ||
+ | | c | Buchstabe (char) | | ||
+ | | d | Dezimalbruch (double) | | ||
+ | | i | Index (int) | | ||
+ | | n | natürliche Zahl (number, int) | | ||
+ | | u | vorzeichenlose Zahl (unsigned int) | | ||
+ | | p | Zeiger (Pointer) | | ||
+ | | s | Zeichenkette (string) | | ||
+ | <code cpp> | ||
+ | int sum = 0; | ||
+ | for (int n = 1; n < MAX_ANZAHL; ++n) | ||
+ | { | ||
+ | sum += n; | ||
+ | } | ||
+ | </ | ||
+ | ist besser lesbar als | ||
+ | <code cpp> | ||
+ | int summeAllerZahlen = 0; | ||
+ | for (int natuerlicheZahl = 1; natuerlicheZahl < MAX_ANZAHL; ++natuerlicheZahl) | ||
+ | { | ||
+ | summeAllerZahlen += natuerlicheZahl; | ||
+ | } | ||
+ | </ | ||
+ | Der alleinstehende Kleinbuchstabe '' | ||
+ | $\sigma_{ij} = C_{ijkl} \cdot \varepsilon_{kl}$ dient. | ||
+ | |||
+ | |||
+ | ====== Formatierung ====== | ||
+ | Geschweifte Klammerpaare stehen übereinander, | ||
+ | Abschnitte innerhalb des Klammerpaars werden eine Ebene eingerückt (Allman style). | ||
+ | Nach meiner Erfahrung sind für Anfänger Blöcke und zusammengehörende Klammern so einfacher erkennbar. | ||
+ | |||
+ | Bevorzugte Editor-Einstellung: | ||
+ | <code cpp> | ||
+ | class Allman | ||
+ | { | ||
+ | public: | ||
+ | int f(int n) | ||
+ | { | ||
+ | int sum = 0; | ||
+ | for (int i = 0; i <= n; ++i) | ||
+ | { | ||
+ | sum += i; | ||
+ | } | ||
+ | return sum; | ||
+ | } | ||
+ | }; | ||
+ | </ | ||
+ | Bei fußgesteuerten Schleifen steht der Kontrollausdruck hinter der schließenden Klammer, nicht darunter: | ||
+ | <code cpp> | ||
+ | do | ||
+ | { | ||
+ | something(); | ||
+ | } while (!finished()); | ||
+ | </ | ||
+ | Auch Einzelanweisungen von Schleifen und Entscheidungen sind im Klammerblock zu schreiben. | ||
+ | Ausnahme: tabellarische Fallunterscheidung. | ||
+ | <code cpp> | ||
+ | int istPrimzahl(int n) | ||
+ | { | ||
+ | if (n < 2) return false; | ||
+ | if (n == 2) | ||
+ | if (n%2 == 0) return false; | ||
+ | // ... | ||
+ | } | ||
+ | </ | ||
+ | Leerzeichen dienen der optischen Gliederung innerhalb der Zeile, | ||
+ | z.B. vor / nach Operatoren, nach Komma und Semikolon, vor Schleifen- und Entscheidungsbedingungen. | ||
+ | |||
+ | ===== ClangFormat ===== | ||
+ | Vergeude deine kostbare Zeit nicht mit dem " | ||
+ | Mit [[https:// | ||
+ | werden auch Diskussionen und " | ||
+ | Die eigene Gestaltungsrichtlinie [[https:// | ||
+ | und als '' | ||
+ | <code .clang-format> | ||
+ | --- | ||
+ | Language: Cpp | ||
+ | AlignConsecutiveAssignments: | ||
+ | AlignConsecutiveDeclarations: | ||
+ | AllowShortCaseLabelsOnASingleLine: | ||
+ | AllowShortFunctionsOnASingleLine: | ||
+ | AllowShortIfStatementsOnASingleLine: | ||
+ | AllowShortLoopsOnASingleLine: | ||
+ | AlwaysBreakTemplateDeclarations: | ||
+ | BreakBeforeBraces: | ||
+ | BreakConstructorInitializersBeforeComma: | ||
+ | ConstructorInitializerIndentWidth: | ||
+ | SpaceBeforeParens: | ||
+ | UseTab: Never | ||
+ | ... | ||
+ | </ | ||
+ | Das Werkzeug lässt sich als Kommando ausführen (Beispiel für Windows): | ||
+ | < | ||
+ | c: | ||
+ | </ | ||
+ | oder im Editor einbinden (Beispiel Notepad++ Menü Run|Run): | ||
+ | < | ||
+ | c: | ||
+ | </ | ||