Dokumentationsleitfaden

Dieser Leitfaden bespricht Empfehlungen zur Dokumentation von Klassen, Modulen und Methoden im Ruby-Kern und in der Ruby-Standardbibliothek.

Dokumentation generieren

Die meisten Ruby-Dokumentationen leben in den Quelldateien und sind im RDoc-Format verfasst.

Einige Seiten befinden sich im Ordner doc und können entweder im .rdoc- oder im .md-Format verfasst sein, bestimmt durch die Dateierweiterung.

Um die Ausgabe von Dokumentationsänderungen in HTML im Verzeichnis {build folder}/.ext/html zu generieren, führen Sie Folgendes in Ihrem Build-Verzeichnis aus:

make html

Wenn Sie kein Build-Verzeichnis haben, folgen Sie der Schnellstartanleitung bis Schritt 4.

Anschließend können Sie Ihre Änderungen in Ihrem Browser durch Öffnen der Datei {build folder}/.ext/html/index.html in der Vorschau anzeigen lassen.

Ziel

Das Ziel der Ruby-Dokumentation ist es, die wichtigsten und relevantesten Informationen in kürzester Zeit zu vermitteln. Der Leser sollte schnell die Nützlichkeit des Quellcodes verstehen und wissen, wie er ihn verwendet.

Zu wenig Informationen zu geben ist schlecht, aber unwichtige Informationen oder unnötige Beispiele zu liefern ist auch nicht gut. Nutzen Sie Ihr Urteilsvermögen darüber, was der Benutzer wissen muss.

Allgemeine Richtlinien

Zeichen

Verwenden Sie nur US-ASCII-kompatible Zeichen in einer C-Quelldatei. (Wenn Sie andere Zeichen verwenden, wird Ihnen die Ruby CI sanft Bescheid geben.)

Wenn Sie ASCII-inkompatible Zeichen in die Dokumentation einer C-kodierten Klasse, eines Moduls oder einer Methode einfügen möchten, gibt es Workarounds, die neue Dateien doc/*.rdoc beinhalten.

RDoc

Ruby wird mit RDoc dokumentiert. Informationen zur RDoc-Syntax und zu den Funktionen finden Sie in der RDoc Markup Reference.

Ausgabe von irb

Für Codebeispiele sollten Sie interaktives Ruby, irb, in Betracht ziehen.

Für ein Codebeispiel, das irb-Ausgabe enthält, sollten Sie erwägen, # => ... in aufeinanderfolgenden Zeilen auszurichten. Die Ausrichtung kann manchmal die Lesbarkeit verbessern.

a = [1, 2, 3] #=> [1, 2, 3]
a.shuffle!    #=> [2, 3, 1]
a             #=> [2, 3, 1]

Überschriften

Organisieren Sie eine lange Diskussion für eine Klasse oder ein Modul mit Überschriften.

Verwenden Sie keine formellen Überschriften in der Dokumentation für eine Methode oder Konstante.

In dem seltenen Fall, dass überschriftenähnliche Strukturen innerhalb der Dokumentation für eine Methode oder Konstante benötigt werden, verwenden Sie fetten Text als Pseudobeschriftungen.

Leerzeilen

Eine Leerzeile beginnt einen neuen Absatz.

Einem Codeblock oder einer Liste sollte eine Leerzeile vorausgehen und folgen. Dies ist für die HTML-Ausgabe nicht notwendig, hilft aber bei der ri-Ausgabe.

Methodennamen

Für einen Methodennamen im Text

Eingebetteter Code und Befehle

Code oder Befehle, die in laufenden Text eingebettet sind (d. h. nicht in einem Codeblock), sollten als Monofont formatiert werden.

Code, der ein einfacher String ist, sollte die Anführungszeichen enthalten.

Auto-Verlinkung

Meistens wird der Name einer Klasse, eines Moduls oder einer Methode automatisch verlinkt.

- Float.
- Enumerable.
- File.new
- File#read.

wird gerendert als

Im Allgemeinen sollte die automatische Verlinkung von RDoc nicht unterdrückt werden. Zum Beispiel schreiben wir einfach nur Float (das automatisch verlinkt wird).

Returns a Float.

was als gerendert wird

Gibt einen Float zurück.

Unterdrücken Sie die automatische Verlinkung jedoch, wenn das betreffende Wort sich nicht auf eine Ruby-Entität bezieht (z. B. einige Verwendungen von Class oder English).

Class variables can be tricky.

wird gerendert als

Klassenvariablen können knifflig sein.

Unterdrücken Sie auch die automatische Verlinkung, wenn sich das betreffende Wort auf das aktuelle Dokument bezieht (z. B. Float in der Dokumentation der Klasse Float).

In diesem Fall können Sie in Erwägung ziehen, den Namen zu Monofont zu zwingen, was die automatische Verlinkung unterdrückt und auch betont, dass das Wort ein Klassenname ist.

A +Float+ object represents ....

wird gerendert als

Ein Float-Objekt repräsentiert ....

Bei nur sehr wenigen, sehr häufig diskutierten Klassen können Sie in Erwägung ziehen, den großgeschriebenen Klassennamen ganz zu vermeiden. Zum Beispiel könnten Sie bei einigen Erwähnungen von Arrays einfach das Kleinbuchstaben-Wort array verwenden.

Anstatt

For an empty Array, ....

was als gerendert wird

Für ein leeres Array, ....

könnten Sie schreiben

For an empty array, ....

was als gerendert wird

Für ein leeres Array, ....

Diese lockerere Verwendung vermeidet sowohl automatische Verlinkungen als auch störende Schriftänderungen und wird wahrscheinlich keine Verwirrung stiften.

Dieses Prinzip kann nützlich angewendet werden, insbesondere für

Es sollte jedoch *nur* angewendet werden, wenn auf eine *Instanz* der Klasse Bezug genommen wird, und *niemals*, wenn auf die Klasse selbst Bezug genommen wird.

Beim Schreiben eines expliziten Links beachten Sie folgende Richtlinien.

rdoc-ref Schema

Verwenden Sie das rdoc-ref-Schema für

Siehe Abschnitt „rdoc-ref Schema“ in [links].

Verwenden Sie einen vollständigen URL-basierten Link für

Dadurch wird sichergestellt, dass der Link auch dann gültig ist, wenn die Paketdokumentation unabhängig (getrennt von der Kerndokumentation) erstellt wird.

Der Link sollte zu einem Ziel in docs.ruby-lang.org/en/master/ führen.

Verwenden Sie auch einen vollständigen URL-basierten Link für einen Link zu einem externen Dokument.

Variablennamen

Der Name einer Variablen (wie in ihrer call-seq angegeben) sollte als Monofont markiert werden.

Verwenden Sie auch Monofont-Text für den Namen einer transienten Variablen (d. h. einer Variablen, die nur in der Diskussion definiert und verwendet wird, wie z. B. n).

HTML-Tags

Vermeiden Sie im Allgemeinen die Verwendung von HTML-Tags (auch in Formaten, in denen dies erlaubt ist), da ri (das Ruby Interactive Reference Tool) diese möglicherweise nicht richtig rendert.

Tabellen

Vermeiden Sie insbesondere das Erstellen von Tabellen mit HTML-Tags (<table> usw.).

Alternativen

Sprachen in Beispielen

Für Symbole und Strings in Dokumentationsbeispielen

Dokumentation von Klassen und Modulen

Die allgemeine Struktur der Klassen- oder Moduldokumentation sollte sein:

Zusammenfassung

Die Zusammenfassung ist eine kurze Beschreibung dessen, was die Klasse oder das Modul tut und warum der Leser sie verwenden möchte. Vermeiden Sie Details in der Zusammenfassung.

Gängige Verwendungszwecke

Zeigen Sie gängige Verwendungszwecke der Klasse oder des Moduls. Abhängig von der Klasse oder dem Modul kann dieser Abschnitt in Länge und Komplexität stark variieren.

„Was ist hier“-Übersicht

Die Dokumentation einer Klasse oder eines Moduls kann einen Abschnitt „Was ist hier“ enthalten.

Richtlinien

Dokumentation von Methoden

Allgemeine Struktur

Die allgemeine Struktur der Methodendokumentation sollte sein:

Aufrufsequenz (für in C geschriebene Methoden)

Für in Ruby geschriebene Methoden dokumentiert RDoc die Aufrufsequenz automatisch.

Für in C geschriebene Methoden kann RDoc nicht ermitteln, welche Argumente die Methode akzeptiert, daher müssen diese mit der RDoc-Direktive call-seq: dokumentiert werden.

Für eine Singleton-Methode verwenden Sie die Form

class_name.method_name(method_args) {|block_args| ... } -> return_type

Beispiel

*  call-seq:
*    Hash.new(default_value = nil) -> new_hash
*    Hash.new {|hash, key| ... } -> new_hash

Für eine Instanzmethode verwenden Sie die Form (ohne Präfix, genau wie RDoc für eine in Ruby geschriebene Methode)

method_name(method_args) {|block_args| ... } -> return_type

Zum Beispiel in Array, verwenden Sie

*  call-seq:
*    count -> integer
*    count(obj) -> integer
*    count {|element| ... } -> integer
*  call-seq:
*    <=> other -> -1, 0, 1, or nil

Für eine Methode im Binäroperatorstil (z. B. Array#&) geben Sie self in der call-seq an (nicht z. B. array oder receiver).

*  call-seq:
*    self & other_array -> new_array

Argumente

Block

Rückgabetypen

Aliase

Zusammenfassung

Als nächstes kommt die Zusammenfassung, die eine kurze Beschreibung dessen ist, was die Methode tut und warum Sie sie verwenden möchten. Idealerweise ist dies ein einzelner Satz, aber für komplexere Methoden kann er einen ganzen Absatz erfordern.

Für Array#count ist die Zusammenfassung

Gibt die Anzahl der angegebenen Elemente zurück.

Dies ist großartig, da es kurz und beschreibend ist. Vermeiden Sie es, zu viel in die Zusammenfassung aufzunehmen, konzentrieren Sie sich auf die wichtigsten Informationen zum Vorteil des Lesers.

Kurze Beispiele

Für eine Methode, deren Dokumentation langwierig ist, sollten Sie einen „kurzen“ Abschnitt hinzufügen, der Beispiele zeigt, die die Verwendungszwecke der Methode zusammenfassen.

Der Abschnitt kann einige Benutzerfragen beantworten (ohne dass diese lange Dokumentationen lesen müssen); siehe Array#[] und Array#[]=.

Details und Beispiele

Die meisten nicht-trivialen Methoden profitieren von Beispielen sowie Details, die über die in der Zusammenfassung gegebenen hinausgehen. Im Abschnitt Details und Beispiele können Sie dokumentieren, wie die Methode verschiedene Arten von Argumenten behandelt, und Beispiele für die richtige Verwendung geben. In diesem Abschnitt konzentrieren Sie sich darauf, wie die Methode richtig verwendet wird, nicht darauf, wie die Methode mit falschen Argumenten oder Grenzfälle umgeht.

Nicht jedes Verhalten einer Methode erfordert ein Beispiel. Wenn die Methode dokumentiert ist, dass sie self zurückgibt, müssen Sie kein Beispiel liefern, das zeigt, dass der Rückgabewert derselbe ist wie der Empfänger. Wenn die Methode dokumentiert ist, dass sie nil zurückgibt, müssen Sie kein Beispiel liefern, das zeigt, dass sie nil zurückgibt. Wenn in den Details erwähnt wird, dass für einen bestimmten Argumenttyp ein leeres Array zurückgegeben wird, müssen Sie dafür kein Beispiel liefern.

Fügen Sie nur dann ein Beispiel hinzu, wenn es dem Benutzer zusätzliche Informationen liefert. Fügen Sie kein Beispiel hinzu, wenn es dieselben Informationen liefert, die in der Zusammenfassung oder den Details angegeben sind. Der Zweck von Beispielen ist es nicht, die in den Details gemachten Aussagen zu beweisen.

Viele Methoden, die ein optionales Block akzeptieren, rufen den Block auf, wenn er gegeben ist, geben aber einen neuen Enumerator zurück, wenn der Block nicht gegeben ist; in diesem Fall liefern Sie kein Beispiel, aber erwähnen Sie die Tatsache (mit dem automatisch verlinkten großgeschriebenen Enumerator).

*  With no block given, returns a new Enumerator.

Argumentbeschreibung (falls erforderlich)

Für Methoden, die Argumente erfordern, und wenn dies nicht offensichtlich und nicht explizit in den Details erwähnt oder implizit in den Beispielen gezeigt wird, können Sie Details zu den unterstützten Argumenttypen angeben. Bei der Diskussion von Argumenttypen verwenden Sie einfache Sprache, auch wenn sie weniger präzise ist, z. B. „level muss eine Ganzzahl sein“ und nicht „level muss ein Integer-konvertierbares Objekt sein“. Die überwiegende Mehrheit der Verwendung wird mit dem erwarteten Typ erfolgen, nicht mit einem Argument, das explizit in den erwarteten Typ konvertiert werden kann, und die Dokumentation des Unterschieds ist nicht wichtig.

Für Methoden, die Blöcke akzeptieren, kann es nützlich sein, den Typ des übergebenen Arguments zu dokumentieren, wenn dieser nicht offensichtlich ist, nicht explizit in den Details erwähnt und nicht implizit in den Beispielen gezeigt wird.

Wenn es mehr als ein Argument oder Blockargument gibt, verwenden Sie eine beschriftete Liste.

Grenzfälle und Ausnahmen

Erwähnen Sie für Grenzfälle von Methoden, wie z. B. unübliche Verwendung, kurz das Verhalten, aber liefern Sie keine Beispiele.

Dokumentieren Sie nur Ausnahmen, die ausgelöst werden, wenn sie nicht offensichtlich sind. Wenn Sie beispielsweise zuvor angegeben haben, dass ein Argumenttyp eine Ganzzahl sein muss, müssen Sie nicht dokumentieren, dass ein TypeError ausgelöst wird, wenn eine Nicht-Ganzzahl übergeben wird. Geben Sie keine Beispiele für das Auslösen von Ausnahmen an, es sei denn, dies ist ein gängiger Fall, wie z. B. dass Hash#fetch einen KeyError auslöst.

Zugehörige Methoden (optional)

In einigen Fällen ist es nützlich zu dokumentieren, welche Methoden mit der aktuellen Methode verwandt sind. Zum Beispiel könnte die Dokumentation für Hash#[] Hash#fetch als verwandte Methode erwähnen, und Hash#merge könnte Hash#merge! als verwandte Methode erwähnen.

Methoden, die mehrere Argumenttypen akzeptieren

Bei Methoden, die mehrere Argumenttypen akzeptieren, kann es in einigen Fällen nützlich sein, die verschiedenen Argumenttypen separat zu dokumentieren. Am besten verwenden Sie für jeden zu besprechenden Fall einen separaten Absatz.