====== Codequalität-Checkliste ======
Prüfungen für Namenskonventionen, Funktionsdesign, DRY-Prinzip und SSOT.
Diese Checkliste ergänzt die [[.:code-konventionen|Code-Konventionen]] mit konkreten Prüfpunkten.
===== Namenskonventionen =====
==== Namespace-Pattern (MS-Stil) ====
[ ] Unit-Namen folgen WvdS...pas
[ ] Spiegelt Microsoft .NET Struktur mit WvdS. Präfix
[ ] Beispiel: WvdS.UI.Controls.Button, WvdS.System.Logging
==== Klassen-Hierarchie (Borland-Stil) ====
[ ] Abstrakte Basis verwendet TWvdSCustom* Präfix
[ ] Öffentliche Basis verwendet TWvdSBase* Präfix
[ ] Konkrete Klassen verwenden TWvdS* Präfix
[ ] Pattern: TWvdSCustomXxx → TWvdSBaseXxx → TUserXxx
==== Typ-Präfixe ====
^ Kategorie ^ Präfix ^ Beispiel ^
| Klassen | ''TWvdS*'' | ''TWvdSRouter'', ''TWvdSButton'' |
| Interfaces | ''IWvdS*'' | ''IWvdSActionResult'', ''IWvdSBindable'' |
| Exceptions | ''EWvdS*'' | ''EWvdSRoutingException'' |
| Records | ''TWvdS*'' | ''TWvdSBuildResult'' |
| Enums | ''TWvdS*'' | ''TWvdSProjectType'' |
| Callbacks | ''TWvdS*'' | ''TWvdSBuildCallback'' |
==== Allgemeine Benennung ====
[ ] Beschreibende Namen (keine Einzelbuchstaben außer Schleifen)
[ ] Keine Abkürzungen außer bekannte (URL, HTTP, JSON)
[ ] Interfaces haben GUID für DI-Container
[ ] Private Felder: F* Präfix (FValue, FCount)
[ ] Parameter: A* Präfix (AIndex, APath)
===== Funktionsdesign =====
==== Größen-Richtlinien ====
[ ] 12-24 Zeilen ideal
[ ] Maximum 40 Zeilen (darüber aufteilen)
[ ] Maximale Verschachtelungstiefe: 3
==== Parameter-Richtlinien ====
[ ] Maximum 5-7 Parameter
[ ] Bei mehr Parametern: Record/Klasse verwenden
[ ] Optionale Parameter am Ende
==== Single Responsibility ====
[ ] Jede Funktion hat EINE Aufgabe
[ ] Funktionsname beschreibt die Aufgabe vollständig
[ ] Wenn "und" im Namen nötig → aufteilen
==== Verb-First Naming ====
[ ] Get* - Wert abrufen
[ ] Set* - Wert setzen
[ ] Calculate* - Berechnung durchführen
[ ] Process* - Verarbeitung durchführen
[ ] Validate* - Validierung durchführen
[ ] Create* - Objekt erstellen
[ ] Parse* - Eingabe parsen
[ ] Format* - Ausgabe formatieren
===== DRY-Prinzip =====
[ ] Kein duplizierter Code (mehr als 3 identische Zeilen → extrahieren)
[ ] Keine Copy-Paste-Patterns
[ ] Gemeinsame Logik in Hilfsfunktionen
[ ] Konstanten statt wiederholter Literale
==== Beispiel: DRY-Verletzung beheben ====
(* VERBOTEN - Duplizierter Code *)
procedure ProcessUserA(const AUser: TUser);
begin
if not ValidateEmail(AUser.Email) then
raise EValidationError.Create('Invalid email');
if Length(AUser.Name) > 64 then
raise EValidationError.Create('Name too long');
(* ... weitere Verarbeitung *)
end;
procedure ProcessUserB(const AUser: TUser);
begin
if not ValidateEmail(AUser.Email) then
raise EValidationError.Create('Invalid email');
if Length(AUser.Name) > 64 then
raise EValidationError.Create('Name too long');
(* ... andere Verarbeitung *)
end;
(* KORREKT - Gemeinsame Logik extrahiert *)
procedure ValidateUser(const AUser: TUser);
begin
if not ValidateEmail(AUser.Email) then
raise EValidationError.Create(rsInvalidEmail);
if Length(AUser.Name) > MAX_NAME_LENGTH then
raise EValidationError.Create(rsNameTooLong);
end;
procedure ProcessUserA(const AUser: TUser);
begin
ValidateUser(AUser);
(* ... weitere Verarbeitung *)
end;
===== SSOT-Prüfung =====
**Single Source of Truth** - Keine lokalen Kopien von Common-Code!
==== Common Libraries verwenden ====
[ ] NodeJS-APIs via ~/sources/common/web/nodejs/
- NodeJS.FS, NodeJS.Path, NodeJS.ChildProcess
[ ] VSCode-APIs via ~/sources/common/web/vscode/
- VSCode.Window, VSCode.Commands, VSCode.Workspace
[ ] WvdS Core via ~/sources/common/core/
- WvdS.System.Logging, WvdS.VSCode.Security
==== Verboten ====
[ ] Keine direkten require()-Aufrufe in Extensions
[ ] Keine Duplikate von Common-Units in Extensions
[ ] Keine lokalen Wrapper-Implementierungen
==== Beispiel: SSOT-Verletzung ====
(* VERBOTEN - Lokaler require() *)
function FileExists(const APath: string): Boolean;
begin
asm
var fs = require('fs'); (* SSOT-Verletzung! *)
Result = fs.existsSync(APath);
end;
end;
(* KORREKT - Common Library *)
uses
NodeJS.FS;
function FileExists(const APath: string): Boolean;
begin
Result := ExistsSync(APath); (* Aus NodeJS.FS *)
end;
===== Separation of Concerns =====
[ ] UI-Logik nur in UI-Schicht (extension_main, *Dialog)
[ ] Geschäftslogik nur in Service-Schicht (*Service)
[ ] Datenstrukturen nur in Model-Schicht (*Models)
[ ] Services rufen keine VSCode-APIs direkt auf
[ ] Models enthalten keine Logik
==== Schichten-Architektur ====
┌─────────────────────────────────────────────────┐
│ UI Layer (extension_main.pas, *Dialog.pas) │
│ → VSCode APIs, User Interaction │
├─────────────────────────────────────────────────┤
│ Service Layer (*Service.pas) │
│ → Geschäftslogik, Validierung │
├─────────────────────────────────────────────────┤
│ Model Layer (*Models.pas) │
│ → Records, Typen, Enums │
├─────────────────────────────────────────────────┤
│ Infrastructure (NodeJS.*, VSCode.*, WvdS.*) │
│ → Externe APIs, Platform-Abstraktion │
└─────────────────────────────────────────────────┘
===== Schnell-Checkliste zum Kopieren =====
Review-Checkliste (Code-Qualität):
Naming:
- [ ] Unit-Namen: WvdS...pas
- [ ] Klassen: TWvdS* Präfix
- [ ] Interfaces: IWvdS* Präfix
- [ ] Beschreibende Namen (keine Abkürzungen)
Funktionen:
- [ ] 12-24 Zeilen ideal, max 40
- [ ] Max 5-7 Parameter
- [ ] Single Responsibility
- [ ] Verb-First Naming
DRY:
- [ ] Kein duplizierter Code
- [ ] Gemeinsame Logik extrahiert
- [ ] Konstanten statt Literale
SSOT:
- [ ] Common Libraries verwendet
- [ ] Keine lokalen require()-Aufrufe
- [ ] Keine Duplikate von Common-Units
SoC:
- [ ] UI nur in UI-Schicht
- [ ] Logik nur in Service-Schicht
- [ ] Services ohne direkte VSCode-Aufrufe
===== Siehe auch =====
* [[.:qualitaetssicherung|Qualitätssicherung Übersicht]]
* [[.:code-konventionen|Code-Konventionen]]
* [[.:audit-core|Core-Checkliste]]
* [[.:extension-entwicklung|Extension-Entwicklung]]