====== Kommentierungsstandards ======
Einheitliche Regeln für Quellcode-Kommentare und Dokumentationskommentare.
===== Grundprinzipien =====
**Kommentare erklären WARUM, nicht WAS.**
* Dokumentiere öffentliche APIs; halte interne Kommentare minimal
* Bevorzuge klaren Code über Kommentare
* Kommentiere nur das Nicht-Offensichtliche
* **Standardsprache: Englisch**
===== Inline-Kommentare =====
Verwende für:
* Intent (Absicht)
* Constraints (Einschränkungen)
* Trade-offs (Kompromisse)
* Edge Cases (Randfälle)
**Vermeide:** Code nacherzählen.
==== Beispiel: Gute vs. Schlechte Kommentare ====
(* SCHLECHT - Erzählt Code nach *)
I := 0; (* Setze I auf 0 *)
while I < Count do (* Schleife solange I kleiner als Count *)
begin
ProcessItem(Items[I]); (* Verarbeite Item *)
Inc(I); (* Erhöhe I um 1 *)
end;
(* GUT - Erklärt Absicht und Constraint *)
(* Process items in reverse order to maintain dependency chain.
Items may reference later items, so forward processing would fail. *)
for I := Count - 1 downto 0 do
ProcessItem(Items[I]);
===== Doc-Kommentare (PasDoc) =====
Für Pascal/FPC wird **PasDoc**-Format verwendet.
==== Struktur ====
(*
@abstract(Kurzbeschreibung der Funktion/Klasse)
Ausführliche Beschreibung wenn nötig.
Erkläre WANN und WARUM diese Funktion verwendet wird.
@param(APath Pfad zur Eingabedatei. Muss existieren.)
@param(AOptions Optionale Verarbeitungseinstellungen)
@returns(True bei Erfolg, False bei Validierungsfehler)
@raises(EFileNotFound wenn APath nicht existiert)
@raises(EAccessDenied bei fehlenden Berechtigungen)
@seealso(ProcessDirectory für Verzeichnisverarbeitung)
Security:
- CWE-22: Pfad wird gegen Traversal validiert
*)
function ProcessFile(const APath: string; AOptions: TOptions): Boolean;
==== Pflicht-Tags ====
^ Tag ^ Wann ^ Beschreibung ^
| ''@abstract'' | Immer | Einzeilige Kurzbeschreibung |
| ''@param'' | Bei Parametern | Jeder Parameter einzeln |
| ''@returns'' | Bei Funktionen | Rückgabewert erklären |
| ''@raises'' | Bei Exceptions | Jede mögliche Exception |
==== Optionale Tags ====
^ Tag ^ Wann ^ Beschreibung ^
| ''@seealso'' | Bei verwandten Funktionen | Querverweise |
| ''@deprecated'' | Bei veralteten APIs | Ersatz angeben |
| ''@since'' | Bei neuen APIs | Version der Einführung |
| ''@note'' | Bei wichtigen Hinweisen | Besondere Beachtung |
| ''@warning'' | Bei Fallstricken | Mögliche Probleme |
===== Klassen-Dokumentation =====
(*
@abstract(DateEdit Control für Datums-Eingabe mit Kalender-Popup)
TWvdSDateEdit bietet ein Eingabefeld für Datumsauswahl mit:
- Direkter Texteingabe mit Format-Validierung
- Kalender-Popup für visuelle Auswahl
- Datums-Range-Validierung (Min/Max)
@bold(Verwendung:)
- In Formularen für Datumseingabe
- Als Filter in Datenansichten
- Für Zeitraum-Auswahl (von/bis)
@bold(Beispiel:)
@longcode(#
DateEdit := TWvdSDateEdit.Create(Self);
DateEdit.MinDate := EncodeDate(2000, 1, 1);
DateEdit.MaxDate := Now;
DateEdit.OnDateChanged := @HandleDateChanged;
#)
@seealso(TWvdSTimeEdit für Zeitauswahl)
@seealso(TWvdSDateTimePicker für kombinierte Auswahl)
*)
TWvdSDateEdit = class(TWvdSCustomEdit)
===== Methoden-Dokumentation =====
(*
@abstract(Validiert den eingegebenen Datumswert)
Prüft ob das eingegebene Datum:
- Im korrekten Format ist
- Innerhalb von MinDate/MaxDate liegt
- Ein gültiges Datum darstellt (z.B. kein 31. Februar)
@param(AValue Der zu validierende Datumswert)
@param(AError Fehlermeldung wenn Validierung fehlschlägt)
@returns(True wenn Datum gültig, False bei Fehler)
@note(Leere Eingabe gilt als gültig wenn AllowEmpty = True)
*)
function ValidateDate(const AValue: TDateTime;
out AError: string): Boolean;
===== Property-Dokumentation =====
(*
@abstract(Minimales erlaubtes Datum)
Legt das früheste auswählbare Datum fest.
Eingaben vor diesem Datum werden abgelehnt.
@seealso(MaxDate für obere Grenze)
*)
property MinDate: TDateTime read FMinDate write SetMinDate;
===== Review-Checkliste =====
[ ] Kommentar erklärt Intent/Trade-offs, nicht Mechanik
[ ] Kommentar entspricht aktuellem Verhalten (kein Drift)
[ ] Kommentar ist in Englisch und prägnant
[ ] Öffentliche API hat vollständige Doc-Kommentare
[ ] @param für jeden Parameter vorhanden
[ ] @returns für Funktionen vorhanden
[ ] @raises für mögliche Exceptions vorhanden
[ ] Keine TODO/FIXME-Kommentare
===== Wann Kommentieren =====
==== Kommentieren ====
* Öffentliche APIs (Pflicht)
* Nicht-offensichtliche Algorithmen
* Workarounds für bekannte Bugs
* Sicherheits-relevante Entscheidungen
* Performance-Optimierungen mit Trade-offs
* Externe Abhängigkeiten
==== Nicht Kommentieren ====
* Offensichtlicher Code
* Selbsterklärender Code
* Temporärer Debug-Code (sollte entfernt werden)
* Auskommentierter Code (sollte gelöscht werden)
===== Sprach-spezifische Formate =====
^ Sprache ^ Format ^ Beispiel ^
| Pascal/FPC | PasDoc | ''(* @abstract(...) *)'' |
| Delphi | XMLDoc-style | ''/// ...'' |
| C# | XMLDoc | ''/// ...'' |
| Rust | rustdoc | ''/// Beschreibung'' |
===== Siehe auch =====
* [[.:qualitaetssicherung|Qualitätssicherung Übersicht]]
* [[.:code-konventionen|Code-Konventionen]]
* [[.:audit-codequalitaet|Codequalität-Checkliste]]