Namengebung

  • Namenwahl
  • Typen
  • Datenobjekte
  • Makros, Funktionen
  • Typprefizes
  • Typenprefizes für Variablennamen
  • Allgemeine Namenprefizes
  • Von Windows-Anwendungen verwendete Symbole

  • Namenwahl

    1. Namen entsprechen dem Verwendungszweck des jeweiligen Konstrukts.
    2. Nach Möglichkeit werden Namen ausgeschrieben. Wenn sie zu lang sind, können sinnvolle und wiedererkennbare Abkürzungen verwendet werden. (Gegenbeispiel: heißt 'tmt' Transmit oder Timeout?). Ausnahme: ‘historisch’ gewachsene Standardabkürzungen ('Rcv', 'Snd', etc.)
    3. Underscores in Namen sind unzulässig. Sie werden verwendet, um Modul-Prefizes von Namen abzugrenzen.
      1. Verboten: Lies_Stammdaten()
        Erlaubt:
        LiesStammdaten();
        Fibu_LiesStammdaten();
    4. Es werden grundsätzlich deutsche Namen verwendet. Ausnahmen bilden Fachwörter.
    5. Mischformen (GetStapelEintrag) sind absolut verboten.

      Weitere Ausnahmen bilden Namen oder Namensbestandteile, die den Charakter von Schlüsselwörtern haben. Auf solche Ausnahmen wird in diesem Dokument hingewiesen. Ausnahmen über dieses Dokument hinaus gibt es nicht.

    6. Bei Übersetzungsproblemen sind gängige Begriffe (in einem Glossar) zu sammeln und ggf. übersetzt als Richtlinie zu definieren. Grundlage für die Übersetzungen solcher Namen sind entsprechende Fachwörterbücher bzw. von externen professionellen Übersetzern erstellte Dokumente.
    7. Von Fremdsystemen übernommene Abkürzungen können beibehalten werden. So muß z.B. MFC oder OWL nicht übersetzt werden.

    Typen

    1. Durch typedef erzeugte Typnamen werden groß geschrieben und dürfen Underscores enthalten. (außer Structs, Klassen und Zeiger auf Structs oder Klassen)
    1. Die Namen von Aufzählungstypen folgen den Regeln für typedefs. Die Namen öffentlicher Aufzählungstypen tragen den Modulpräfix. Die Namen der Denoter beginnen mit einem Präfix, der dem Namen des Aufzählungstyps entlehnt ist. Da die Denoter den Status von (öffentlichen) Konstanten haben, bestehen ihre Namen aus Großbuchstaben.
      1. typedef enum { F_ROT, F_GRUEN, F_BLAU } FARBE;
        typedef enum { ZG_NURLESEN, ZG_NURSCHREIBEN, ZG_WAHLFREI } MEM_ZUGRIFF;

    2. Die Namen von Structs und Klassen beginnen mit einem großen C und bezeichnen Klassifizierungen von Substantiven. Sie dürfen keine Underscores enthalten. Bei zusammengesetzten Wörtern werden Großbuchstaben verwendet.
      1. typdef struct CComplex // bei struct Groß/Kleinschreibung trotz typedef!
        {
            float m_fReal;
            float m_fImag;
        } CComplex;

        class CDatenbank;
        class CSchnellerSpeicher;

        typedef CComplex* PComplex;
        typedef CSchnellerSpeicher* PSchnellerSpeicher;

    Datenobjekte

    1. Variablennamen beginnen immer mit einem kleinen Buchstaben (ein Modulprefix gilt nicht als Namensbestandteil).
    2. Variablennamen bezeichnen Substantive. Bei Bedarf kann ein Artikel und/oder Adjektiv(e) vorangestellt werden (um z.B. der vorhergehenden Forderung zu genügen).
      1. int nObereGrenze;
        CDocument dasDokument;
        void* pDatenpuffer;

    3. Private Namen beginnen mit einem Underscore.
      1. int _nGesamtFehlerAnzahl;

    4. Falls sich öffentliche Variablen nicht vermeiden lassen, werden sie zusätzlich mit dem Modulpräfix versehen.
      1. int* Mmgr_pDerEinzigeSpeicherVorrat;

    5. Mit #define definierte Konstanten werden groß geschrieben und dürfen Underscores enthalten.
      1. #define MAX_LIMIT 1234

      Die Namen öffentlich deklarierter Konstanten dürfen ebenfalls dieser Konvention folgen.

        const int nMaxLimit = 1234;
        const int Stack_nMaxLimit = 1234;
        const int MAX_LIMIT = 1234;

    6. Variablen dürfen innerhalb ihres Geltungsbereichs nicht für verschiedene Zwecke genutzt werden.
    7. Variablennamen beginnen mit einem Typprefix. Der eigentliche Name beginnt mit Großbuchstaben, gefolgt von Kleinbuchstaben. Bei zusammengesetzten Namen wird wieder mit Großbuchstaben begonnen, es werden keine Unterstriche benutzt. Ausnahmen: Laufvariablen (i, j, …)
      1. int nFehler;
        int nGesuchterWert;
        LPCSTR lpszBenutzerName;

    8. Die Namen von Elementvariablen erhalten das Präfix m_.
      1. class CFehlerstatus
        {
            int m_nStatusCode;
            LPCSTR m_lpszFehlermeldung
        };

    Makros, Funktionen

    1. (C) Makronamen werden groß geschrieben und dürfen Underscores enthalten.
      1. #define ABS(x) (0 > (x) ? -(x) : (x))

      (C++) Die Verwendung von Makros ist unzulässig. Stattdessen sind inline- bzw. template-Funktionen zu verwenden.

    2. Funktionsnamen beginnen mit Großbuchstaben, gefolgt von Kleinbuchstaben. Bei zusammengesetzten Namen wird wieder mit Großbuchstaben begonnen, es werden keine Underscores benutzt. Öffentliche Funktionen eines Moduls werden mit einem Modulprefix Xyz_ gekennzeichnet.
      1. void DurchsucheBaum(const PKNOTEN pAusdrucksBaum);
        BOOL Msg_NachrichtIstVorhanden(void);

    3. Funktionen ohne Rückgabewert oder mit einem Statusrückgabewert beginnen mit einem Verb. Der Imperativ ist zu bevorzugen, also
    4. nicht TagesdatumSetzen(const PGmsDatum pDatum),
      sondern SetzeTagesdatum(const PGmsDatum pDatum);
      void SendePaket(const PGmsPaket pPaket);
      ERRORTYPE PruefeName(LPCSTR pName);
    1. Namen von Funktionen mit einem Rückgabewert beginnen mit einem Substantiv oder Adjektiv, das den Rückgabewert beschreibt.
      1. ALARM NaechsterAlarm(const PTIME pBezugsZeitpunkt);
        LPCSTR Benutzername(const int nBenutzernummer);

      also nicht:

        LPCSTR LiesBenutzername(int nBenutzernummer)!

    2. Funktionen mit dem Rückgabewert BOOL beginnen mit Ist bzw. Hat:
      1. BOOL IstGueltigerName(LPCSTR pName);
        BOOL HatFehlerzustand(void);

    3. Namen von Konversionsfunktionen haben die Form „Quelle"NachZiel".
      1. int HexNachBinaer(LPCSTR lpszHexzahl);

    1. (C, Pascal) Eine Initialisierungsfunktion ist eine Funktion, die Datenstrukturen aus ihren Bestandteilen erzeugt. Initialisierungsfunktionen sind von Konversionsfunktionen zu unterscheiden. Initialisierungsfunktionen liefern als Wert eine Datenstruktur. Die Namen von Initialisierungsfunktionen beginnen mit Build. Falls ein Zeiger auf die neue Datenstruktur zurückgegeben wird, beginnt der Name der Funktion mit New. Letztere Funktionen liefern bei Rückgabe von Zeigern allozierte Datenstrukturen, die vom Aufrufer durch Aufruf einer Freigabefunktion freigegeben werden müssen. Namen von Freigabefunktionen beginnen mit Delete. Diese Namensprefizes haben den Charakter von Schlüsselwörtern (sie entsprechen u.a. den Operatoren new und delete in C++) und sind deshalb aus der englischen Sprache gewählt.
      1. void BuildZeit /* (C) */
            (
                PZeit this,
                const int nStunden,
                const int nMinuten,
                const int nSekunden
            );

        PZeit NewZeit
            (
                const int nStunden,
                const int nMinuten,
                const int nSekunden
            );

        void DeleteZeit(PZEIT pZeit);

      (C++, Delphi) Solche Initialisierungsfunktionen sind unzulässig. Es sind Konstruktoren, Cast-Operatoren und Destruktoren (C++: zusammen mit den Operatoren new und delete) zu verwenden. Die Namen von Funktionen, die Speicher für ein Datenobjekt auf dem Heap verwenden, der vom Aufrufer freizugeben ist, beginnen mit New.

    Typprefizes

    Wesentliche Teile der hier aufgeführten Tabellen wurden ursprünglich von Microsoft für die Erstellung von Windows-Anwendungen vorgeschlagen [Petz90].

    Typenprefizes für Variablennamen

    Prefix Typ Beschreibung Beispiel
    c char 8-Bit Zeichen cRang
    b BOOL Boolean bAktiviert
    q bit Bit (C51) qAktiviert
    n int Integer (plattformabhängig) nLaenge
    l long langer Integer (plattformabhängig) lOffset
    u unsigned vorzeichenloser Wert (plattformabhängig) uAnzahl
    ul unsigned long langer vorzeichenloser Wert (plattformabhängig) ulBereich
    f float 32-Bit IEEE floating point fSinus
    df double doppelt genauer IEEE floating point dfAbstand
    p * generischer Zeiger(nur MS-DOS bzw. Windows bis V3.11: entsprechend dem eingestellten Speichermodell) pDoc
    r & Referenzen (außer const &) rDoc
    sz char[] nullterminierte Zeichenkette szName
    psz char* Zeiger auf eine nullterminierte Zeichenkette pszName
    s string (Pascal) Zeichenkette sName
    xp * (C51; XDATA) Zeiger in externes RAM xpNachricht
    dp * (C51; DATA) Zeiger in das direkt adressierbare RAM dpAkku
    ip * (C51; IDATA) Zeiger in das nur indirekt adressierbare RAM ipFlags
    cp * (C51; CODE) Zeiger in den Code-Bereich cpSchleife
    1. Namen von Variablen selbstdefinierter Strukturen, Typen etc. können, müssen aber kein besonderes Prefix erhalten. Wird ein Prefix verwendet, ist es bei der Deklaration des Typs anzugeben und überall zu verwenden.
    2. Variablen, die einen enum-Typ repräsentieren, erhalten das Präfix n, da ihre Größe systembedingt von der Integer-Größe abhängt.
    3. Für selbstdefinierte Klassen oder structs können Prefizes ähnlich denen für Moduln sinnvoll sein. Diese Abkürzung wird im Klassenkopf mit angegeben.
      1. struct CKonfigurationsdaten;
        CKonfigurationsdaten knfGeraet1;

    4. Weitere (hier nicht berücksichtigte) system- bzw. compilerbedingte Besonderheiten (z.B. Zeiger auf speziell reservierte Speicherbereiche) sind in getrennten Richtlinien aufzuführen.

    Allgemeine Namenprefizes

    Der verwendete Präfix Mod steht für eine sprechende Abkürzung des Modulnamens (vorzugsweise 3-5 Zeichen).

    Prefix

    Typ

    Beispiel

    C Klasse oder Struct CDokumentVerwalter
    P Zeigertyp für Zeiger auf eine Klasse oder ein Struct PDokumentVerwalter
    R Referenztyp für Referenzen auf eine Klasse oder ein Struct RDokumentVerwalter
    m_ Elementvariable m_pDokVerwalter
    a Vektor (Array) caName[]
    Mod_ öffentliche Funktion oder Datentyp (C++, Delphi: ausgenommen Klassenelemente) Math_LiesDaten()
    Math_nFehleranzahl
    _ private Funktion oder Variable _DatumNachInteger()
    _lpszProtokoll

    Von Windows-Anwendungen verwendete Symbole

    Prefix

    Symboltyp

    Beispiel

    Bereich

    IDR_ Bezeichner der von verschiedenen Ressourcen unterschiedlicher Typen geteilt wird IDR_MAINFRAME 1…0x6FFF
    IDD_ Dialog-Ressource IDD_RECHTSCHREIBPRUEFUNG 1…0x6FFF
    HIDD_ Hilfekontext einer Dialog-Ressource HIDD_RECHTSCHREIBPRUEFUNG 0x20001…0x26FFF
    IDB_ Bitmap-Ressource IDB_FIRMENLOGO 1…0x6FFF
    IDC_ Cursor-Ressource IDC_STIFT 1…0x6FFF
    IDI_ Icon-Ressource IDI_NOTIZBLOCK 1…0x6FFF
    ID_ Menü- oder Toolbar-Schalterbefehl ID_ZUSATZ_RECHTSCHREIBUNG 0x8000…0xDFFF
    HID_ Befehls-Hilfekontext HID_ZUSATZ_RECHTSCHREIBUNG 0x18000…0x1DFFF
    IDP_ Message-Box Prompt IDP_UNGUELTIGE_TEILENR 8…0xDFFF
    HIDP_ Message-Box Hilfekontext HIDP_UNGUELTIGE_TEILENR 0x30008…0x3DFFF
    IDS_ String-Ressource IDS_COPYRIGHT 1…0x7FFF
    IDC_ Steuerelement einer Dialogbox IDC_NEUBERECHNEN 8…0xDFFF


    [weiter in "Programmierstil"] | [Inhalt] | [Einleitung] | [Layout] | [Programmierstil] | [Anhänge]


    Copyright © 1996-98 by Uwe Sauerland