OpenKeyWord  Version: 426, Datum:
Die Dokumentation des OWK-Quellcodes

Einleitung

Für die Dokumentation des Quelltextes wird [Doxygen] verwendet. Nähere Informationen zu Doxygen finden Sie unter (http://www.doxygen.org) Vor diesem Hintergrund müssen für die Dokumentationen des Quelltextes die Regelungen von Doxygen Beachtung finden.

Um bei verschiedenen Programmierern einen einheitlichen Programmierstil zu gewährleisten, wird ein zweites Werkzeug im Projekt OKW genutzt: [StyleCop]. Weitere Informationen zu [StyleCop] finden Sie unter (https://stylecop.codeplex.com/).

Damit beide Werkzeuge ohne Fehler oder Warnungen den Quelltext akzeptieren sind einige Punkte in der Kodierung und Dokumentation einzuhalten

Doxygen/StyleCop Zuständigkeiten

Die Zuständigkeiten beider Werkzeuge sind grundsätzlich wie folgt geregelt:

  • Doxygen ist zuständig für die Vorgaben innerhalb der Dokumentationen,
  • Stylecop ist für alles ausserhalb der Dokumentation zuständig, d.h. für den eigentlichen Quelltext.

Sofern sich die Zuständigkeiten beider Werkzeuge überschneiden (Regelkonkurrenz), gelten folgende Regeln. Dies sind die Grundregeln der Dokumentation:

  • Die Dokumentation selbst ist für den c#-Compiler unsichtbar, weil diese ausdokumentiert sind, d.h. diese befinden sich hinter ///.
  • Die Dokumentation befindet sich vor dem zu dokumentierenden Element, also vor der Deklaration von z.B. Klassen, Methoden, Attributen usw.
  • Zwischen der Dokumentation und seinem Element befinden sich keine Leerzeilen. Siehe StyleCop-Regel SA1506: ElementDocumentationHeadersMustNotBeFollowedByBlankLine
  • Zwei Elemente werden durch eine Leerzeile getrennt. Siehe StyleCop-Regel SA1516: ElementsMustBeSeparatedByBlankLine

Beispiel für die vier Vorgaben von oben.

    /// Name des Kunden
    /// 2. Zeile der Dokumentation sName
    string sName
    
    /// Vorname des Kunden
    /// 2. Zeile der Dokumentation sVorname
    string sVorname

Doxygen/StyleCop Zuständigkeitsüberschneidung

StyleCop definiert die Regel SA1644: DocumentationHeadersMustNotContainBlankLines, die mit der Dokumentationskonventionen von DoxyGen kollidiert. Regel SA1644: DocumentationHeadersMustNotContainBlankLines verbietet das Einfügen von Leerzeilen in der Dokumentation. DoxyGen dagegen benötigt für die Trennung von Absätzen ganau diese Leerzeilen.

Bemerkungen
Aus diesem Grund ist die StyleCop Regel SA1644: DocumentationHeadersMustNotContainBlankLines abgeschaltet.

Die Kurzbeschreibung und die weitergehenden Datailbeschreibung eines Elementes werden mit einer Leerzeile (oder mit einem anderen Befehl) abgetrennt werden, sonst trennt Doxygen die beiden Beschreibungen nicht von einander und die Detailbeschreibung wird in der Kurzbeschreibung dargestellt.

Beispiel:

        /// \~german
        /// <summary>
        /// Das ist die Kurzbeschreibung, in Doxygen brief-description bezeichnet .
        /// 
        /// Nach der Leerzeile erfolgt die Detailbeschreibung des Elementes, hier eine Methode.
        /// \~english
        /// <summary>
        /// This is the brief or short description.
        /// 
        /// After a blank line the detail description starts for the element, in this case for a method.
        /// \~
        /// \author Zoltan Hrabovszki
        /// \date 2014.01.14
        public void MeineMethode( )
        {
             . . . 
             return;
        }

Eine Methode dokumentieren

Beispiel: für die Dokumentaion einer Methode. (CurrentObject::CallMethod(string,string))

        /// \~german
        /// <summary>
        /// Ruft eine Methode des aktuellen Objektes via _late bound function call_ auf.
        /// 
        /// Die aufgerufene Methode hat die Signatur:
        /// | Parameter/Return | Type  |
        /// | :----------------|:------|
        /// | Parameter        | keine |
        /// | Rückgabewert     | kein  |
        /// </summary>
        /// <param name='fpsMethod'>Name der Methode, die aufgerufen werden soll.</param>
        /// 
        /// \~english
        /// <summary>
        /// Calls a method of the current object with "late bound function call".
        /// 
        /// The called method has the signature:
        /// | Parameter/Return | Type  |
        /// | :----------------|:------|
        /// | Parameter        | none  |
        /// | Return           | none  |
        /// </summary>
        /// <param name='fpsMethod'>name of method to be called</param>
        /// 
        /// \~
        /// \author Zoltan Hrabovszki
        /// \date 2014.01.14
        public void CallMethod(string fpsMethod)
        {
            this.Log.LogFunctionStartDebug("CallMethod", "string fpsMethod", fpsMethod);
            try
            {
                Type myTypeObject = this.cvoObject.GetType();
                MethodInfo myMethodInfo = myTypeObject.GetMethod(fpsMethod,
                                                                 BindingFlags.Public | BindingFlags.Instance,
                                                                 null,
                                                                 new Type[] {},
                                                                 null);
                // Existiert die Methode des Objektes?
                if (myMethodInfo == null)
                {
                    // Nein: -> Mit einem OKWFrameObjectMethodNotFoundException aussteigen...
                    string errorText = this.LM.GetMessage("CallMethod", "MethodNotDefined", fpsMethod);
                    throw new OKWFrameObjectMethodNotFoundException(errorText);
                }
                else
                {
                    // Ja, Methode via Invoke aufrufen
                    myMethodInfo.Invoke(this.cvoObject, null);
                }
            }
            finally
            {
                this.Log.LogFunctionEndDebug();
            }
            
            return;
        }

Sprachabschnitte

Die Dokumentation ist für mehrere Sprachen ausgelegt, bzw. nutzt die Möglichkeiten von Doxygen um die Dokumentation für mehrere Sprachen zu erstellen. Dazu werden im Kommentarblock die einzelnen Sprachabschnitte jeweils mit einen Befehl von einander getrennt. In OKW werden die Sprachen deutsch und englisch gepflegt, die mit den Befehlen:

  • für den Abschnitt in deutsch
    \~german 
  • für den Abschnitt in englisch
    \~english 

eingeleitet werden.

Neben den Sprachabschnitten gibt es noch einen sprachunabhängigen oder sprachübergreifenden Abschnitt, dieser wird mit

  • \~ 

eingeleitet. Hier werden Angaben gemacht, die für alle Sprachen einheitlich gelten, z.B. Author des Quelltextes oder Erstellungsdatum.

Bemerkungen
Im folgenden Unterkapitel werden die Dokumentationseinträge erläutert. Diese gelten für alle Sprachabschnitte gleichermaßen und werden im folgenden nicht jeweils erwähnt!

Kurzbeschreibung oder \brief-description

Die Kurzbeschreibung ist der erste Abschnitt in der Dokumentation. Dieser kann mit \brief eingeleitet werden. Das Ende der Kurzbeschreibung wird entweder durch eine Leerzeile oder durch einen anderen DoxyGen Befehl markiert. Siehe dazu das Beispiel im Kapitel Doxygen/StyleCop Zuständigkeitsüberschneidung .

Methoden Parameter

Die Übergabeparameter einer Methode werden jeweils mit dem param-Tag beschrieben. Diese haben folgende Form:

<param name='ParameterName'>Beschreibung des Parameters</param>

Das Attribut name muss jeweils mit dem Namen des Parameters in der Deklarationszeile der Methode, die beschrieben werden soll, korrespondieren.

Als Beispiel folgender Dokumentationsabschnitt:

    /// <param name='Paramter_1'>Hier wird der 1. Parameter beschrieben.</param>
    /// <param name='Paramter_2'>Hier wird der 2. Parameter beschrieben.</param>
    /// 
    public void CallMethod(string Parameter_1, string Parameter_2)
Bemerkungen
Sollte im Attribut name der Bezeichner des Parameters falsch geschrieben sein, löst Doxygen eine Warnung aus und die Beschreibung des Parameters fehlt in der generierten DoxyGen-Ausgabe..

Rückgabewert (engl. Return) dokumentieren

Mit

<return>Beschreibung des Rückgabewertes.</return> 

wird der Rückgabewert einer Methode Beschrieben.