Softwaretechnik/Studienprojekte/Beispiel Styleguide

Aus StudiWiki

Wechseln zu: Navigation, Suche

Styleguide, wie er bei IVY2 benutzt wurde

Styleguide basierend auf IVY1 Änderungen durch S. Grottel und OliverKopp Status: Freigegeben Version: 1.2

Änderungen:

  • 2003-11-19 koppor Beispiel-Header eingefügt
  • 2003-12-02 koppor
    • \short und \param im Methoden-Beispiel-Header eingefügt
    • "Änderungen" im Beispiel-Header durch "Changes" ersetzt
  • 2003-12-19 koppor Unnötiges erweitertert

Inhaltsverzeichnis

[bearbeiten] Kennzeichnung von Änderungen

  • cvs commit-log:
 Zusammenfassung der Änderung
  • Im Header wird nichts mitgeführt - wird durch $Log$ und dadurch durch das Log im CVS gemacht
  • an jeder Routine, falls nicht direkt aus CVS-Log ersichtlich
\par Changes: - yyyy-mm-dd <login> <Änderung>

[bearbeiten] Kommentare

Doxygen bentutzen (siehe DoxyGen-Kommandos)
/* */ ist nur bei Headern (Klassen, Methoden) erlaubt, ansonsten immer // benutzen (auch bei mehrzeiligen Kommentaren)

[bearbeiten] Header jedes Files

In der ersten Zeile:

 /* $Id$ */

[bearbeiten] hpp: Header jeder Klasse

 
 /** 
  *  \author    <IVY1-Autor>
  *  \author 	<login>      (Aktueller Autor)
  *
  *  \short  	Aufbau der Zellenstruktur (Kurze Beschreibung der Klasse, ggf. \long benutzen)
  *
  *  \par Changes:
  *    $Log$
  */

Log wird automatisch von CVS generiert.

[bearbeiten] hpp: Methoden

 /**
  *  \short Kurze Beschreibung (Englisch)
  *
  *  \author benutzen, falls nicht Hauptautor des .[ch]pp-Files
  *
  *  Für jeden Parameter (falls Klärungsbedarf)
  *    \param <Name> <Beschreibung>
  *
  *  \pre  true   (durch Assertion prüfen)
  *
  *  \post true   (durch Assertion prüfen)
  *
  *  \todo 
  *     Beschreiben, was noch zu machen ist
  */

[bearbeiten] Unnötig

 * Im Header:
   * \par Letzte Änderung: mit $Date$ und $Author$, steht alles in $Id$ drin
   * \class: Doxygen kann den Klassennamen parsen: Redundante Information!
     (natürlich nur, wenn class X gleich darunter steht.
 * In Methoden:
   * \fn: Doxygen kann den Methodennamen parsen: Redundante Information!

[bearbeiten] Was tun bei Verletzungen des Styleguides

* Autor darauf hinweisen
* Falls das nicht geht (z.B. weil es schon im IVY-Source so war)
  # selbst korrigieren
  # bei größeren Sachen: QS benachrichtigen

[bearbeiten] Naming-Conventions

  • Englisch
    • Bezeichner
    • Routinen
    • Filenamen
    • Module
    • einfach alles
  • keine Codierungen im Namen
    • sog. ungarische Notation des Variablentyps, z.B. lpszName
    • in VIS wegen Windows-API eingeschränkt erlaubt aber zu vermeiden.
  • Aussprechbare Namen oder eindeutige Abkürzungen
  • Typnamen beginnen mit einem Großbuchstaben
  • Variablennamen beginnen mit einem Kleinbuchstaben
  • Konstanten und Enumerations sind in CAPITALS geschrieben
    • Mehrere Teile durch _ trennen
  • Methoden beginnen mit einem Kleinbuchstaben
  • Zusammengesetzte Bezeichner durch Großschreibung jedes weiteren Teils trennen (z.B. W'egstreckenFolge)
  • Substantive im Klassen-/Objektnamen als Singular
  • Funktionen, die Boole'sche Werte zurückliefern, beginnen mit "is".
  • getX/setX ist ausdrücklich erwünscht
  • Methoden, die ein Objekt erzeugen und zurückgeben beginnen mit "create" (Ausnamen sind z.B. getInstance() bei Singelton).
  • Falls ein Wort mehrere Bedeutungen hat: Nicht verwenden
    • Ansonsten: immer nur in der einen Bedeutung verwenden
  • Bezeichner mit Laberfaktor vermeiden (information, data, system). Falls nicht möglich: konkretisieren
  • Bezeichner, die im real life eine andere, "natürliche" Bedeutung haben, nicht verwenden. (z.B. hp, ms, km, EUR, aldi, RL)

[bearbeiten] Programmiersprachenkonstrukte

  • Casts
    • unnötige Casts grundsätzlich vermeiden
    • C-Casts (N'ewType) Expression sind verboten'
    • static_cast<N'ewType> Expression erlaubt
    • dynamic_cast<N'ewType> Expression erlaubt
    • const_cast<N'ewType> Expression verboten'
    • reinterpret_cast<N'ewType> Expression verboten'
    • Alle anderen Cast-Operatoren sind grundsätzlich verboten.
  • malloc und free sind verboten
  • union in Ausnahmefällen (Visualisierung) erlaubt
  • const wo möglich verwenden:
    • in-Parameter bei Klassen: const Class param
    • in-Parameter bei Typen: const Type& param

[bearbeiten] Klassen und Objekte

  • Es gibt keine freien Funktionen, d.h. Funtkionen können nur in Klassen und Strukturen (als Methoden) auftreten (static verwenden).
  • Keine Klasse ohne Namensraum
namespace Modulename {
}
  • Konstanten dürfen nur im Kontext von Klassendefinitionen existieren. In Ausnahmefällen im Namespace.
  • Besitzt eine Klasse dynamische Elemente, so müssen ein Copy-Konstruktor und ein Zweisungsoperator definiert werden
  • Die Basisklasse muss einen virtuellen Destruktor besitzen
  • Zuweisungsoperator
    • Muss eine Referenz auf *this zurückliefern
    • alle Datenelemente müssen zugewiesen werden
    • Zuweisung an sich selbst muss überprüft werden
    • Template
class Type {
public:
    Type();                            // Default-Constructor
    Type(const Type& type);            // Copy-Constructor
    Type& operator=(const Type& type); // Assignment-Operator
private:
    int dynamicElement;
};
      
Type::Type() {
    dynamicElement = 0
}

Type::Type(const Type& type) {
    dynamicElement = type.dynamicElement;
}

Type::Type& operator=(const Type& type) {
    if (&typ == this) {
        // handle error
    } else {
        dynamicElement = type.dynamicElement;
    }
    return *this;
}

[bearbeiten] Exceptions

  • In Konstruktoren dürfen bei geworfenen Excpetions keine Speicherlecks produziert werden.
  • In Destruktoren dürfen keine Exceptions geworfen werden
  • Kontrollfluss nicht über Exceptions
  • Einsetzen, wenn Problem nicht lokal behoben werden kann
    • Log-Ausgabe?
  • Typfehler = Assertions, keine Exceptions


[bearbeiten] Format des Codes

79 Spalten Einrückung 4 Zeichen

    if (Bedingung) {
        <code>
    } else {
        <code>
    }
class/struct/void func (Vehicle vehicle, int speed) name {
    <code>
}  

[bearbeiten] Triviales

[bearbeiten] Dateien

  • Header-Dateien:
    • Endung .hpp
    • Klassendeklarationen (mit enthaltenen Konstanten) und Typen
    • #include-Guards verwenden
      • Name: INCLUDED_FILENAME_WO_EXTENSION_HPP
  1. ifndef INLCUDED_COOL_HPP
  2. define INCLUDED_COOL_HPP

<code>

  1. endif
  • C++-Files:
    • Endung .cpp
    • Klassendefinitionen, Klassenvariablen

[bearbeiten] Anderes

  • Der ([1] Styleguide von geosoft) enthält Zusätzliches, was sich allerdings von selbst versteht. Bei Widersprüchen (z.B. der Formatierung des else bei if) ist der IVY2-Styleguide massgebend
  • Sichtbarkeitsbereiche so weit wie möglich einschränken
  • const wo möglich verwenden
  • Keine globalen Variablen verwenden (z.B. statt globaler Variable static Attribut)
  • Methoden, die etwas Unterschiedliches tun, tragen verschiedene Namen
  • Objekt immer per Referenz übergeben (wenn nicht möglich, dann Pointer und nur wenn Seiteneffekte ausgeschlossen werden müssen, Kopien übergeben)
  • Es ist nur öffentliche Vererbung erlaubt: class child : public parent
  • Ein Kind muss genauso wie sein Vater benutzbar sein
Persönliche Werkzeuge