====== Code Quality Checklist ======
Checks for naming conventions, function design, DRY principle, and SSOT.
This checklist complements the [[.:code-konventionen|Code Conventions]] with concrete verification points.
===== Naming Conventions =====
==== Namespace Pattern (MS Style) ====
[ ] Unit names follow WvdS...pas
[ ] Mirrors Microsoft .NET structure with WvdS. prefix
[ ] Example: WvdS.UI.Controls.Button, WvdS.System.Logging
==== Class Hierarchy (Borland Style) ====
[ ] Abstract base uses TWvdSCustom* prefix
[ ] Public base uses TWvdSBase* prefix
[ ] Concrete classes use TWvdS* prefix
[ ] Pattern: TWvdSCustomXxx → TWvdSBaseXxx → TUserXxx
==== Type Prefixes ====
^ Category ^ Prefix ^ Example ^
| Classes | ''TWvdS*'' | ''TWvdSRouter'', ''TWvdSButton'' |
| Interfaces | ''IWvdS*'' | ''IWvdSActionResult'', ''IWvdSBindable'' |
| Exceptions | ''EWvdS*'' | ''EWvdSRoutingException'' |
| Records | ''TWvdS*'' | ''TWvdSBuildResult'' |
| Enums | ''TWvdS*'' | ''TWvdSProjectType'' |
| Callbacks | ''TWvdS*'' | ''TWvdSBuildCallback'' |
==== General Naming ====
[ ] Descriptive names (no single letters except loops)
[ ] No abbreviations except well-known (URL, HTTP, JSON)
[ ] Interfaces have GUID for DI container
[ ] Private fields: F* prefix (FValue, FCount)
[ ] Parameters: A* prefix (AIndex, APath)
===== Function Design =====
==== Size Guidelines ====
[ ] 12-24 lines ideal
[ ] Maximum 40 lines (split above that)
[ ] Maximum nesting depth: 3
==== Parameter Guidelines ====
[ ] Maximum 5-7 parameters
[ ] For more parameters: use record/class
[ ] Optional parameters at the end
==== Single Responsibility ====
[ ] Each function has ONE task
[ ] Function name fully describes the task
[ ] If "and" needed in name → split
==== Verb-First Naming ====
[ ] Get* - Retrieve value
[ ] Set* - Set value
[ ] Calculate* - Perform calculation
[ ] Process* - Perform processing
[ ] Validate* - Perform validation
[ ] Create* - Create object
[ ] Parse* - Parse input
[ ] Format* - Format output
===== DRY Principle =====
[ ] No duplicated code (more than 3 identical lines → extract)
[ ] No copy-paste patterns
[ ] Common logic in helper functions
[ ] Constants instead of repeated literals
==== Example: Fixing DRY Violation ====
(* FORBIDDEN - Duplicated 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');
(* ... further processing *)
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');
(* ... other processing *)
end;
(* CORRECT - Common logic extracted *)
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);
(* ... further processing *)
end;
===== SSOT Check =====
**Single Source of Truth** - No local copies of common code!
==== Use Common Libraries ====
[ ] 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
==== Forbidden ====
[ ] No direct require() calls in extensions
[ ] No duplicates of common units in extensions
[ ] No local wrapper implementations
==== Example: SSOT Violation ====
(* FORBIDDEN - Local require() *)
function FileExists(const APath: string): Boolean;
begin
asm
var fs = require('fs'); (* SSOT violation! *)
Result = fs.existsSync(APath);
end;
end;
(* CORRECT - Common library *)
uses
NodeJS.FS;
function FileExists(const APath: string): Boolean;
begin
Result := ExistsSync(APath); (* From NodeJS.FS *)
end;
===== Separation of Concerns =====
[ ] UI logic only in UI layer (extension_main, *Dialog)
[ ] Business logic only in service layer (*Service)
[ ] Data structures only in model layer (*Models)
[ ] Services don't call VSCode APIs directly
[ ] Models contain no logic
==== Layer Architecture ====
┌─────────────────────────────────────────────────┐
│ UI Layer (extension_main.pas, *Dialog.pas) │
│ → VSCode APIs, User Interaction │
├─────────────────────────────────────────────────┤
│ Service Layer (*Service.pas) │
│ → Business logic, Validation │
├─────────────────────────────────────────────────┤
│ Model Layer (*Models.pas) │
│ → Records, Types, Enums │
├─────────────────────────────────────────────────┤
│ Infrastructure (NodeJS.*, VSCode.*, WvdS.*) │
│ → External APIs, Platform Abstraction │
└─────────────────────────────────────────────────┘
===== Quick Checklist for Copy/Paste =====
Review Checklist (Code Quality):
Naming:
- [ ] Unit names: WvdS...pas
- [ ] Classes: TWvdS* prefix
- [ ] Interfaces: IWvdS* prefix
- [ ] Descriptive names (no abbreviations)
Functions:
- [ ] 12-24 lines ideal, max 40
- [ ] Max 5-7 parameters
- [ ] Single responsibility
- [ ] Verb-first naming
DRY:
- [ ] No duplicated code
- [ ] Common logic extracted
- [ ] Constants instead of literals
SSOT:
- [ ] Common libraries used
- [ ] No local require() calls
- [ ] No duplicates of common units
SoC:
- [ ] UI only in UI layer
- [ ] Logic only in service layer
- [ ] Services without direct VSCode calls
===== See also =====
* [[.:qualitaetssicherung|Quality Assurance Overview]]
* [[.:code-konventionen|Code Conventions]]
* [[.:audit-core|Core Checklist]]
* [[.:extension-entwicklung|Extension Development]]