====== 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]]