Inhaltsverzeichnis
Code Quality Checklist
Checks for naming conventions, function design, DRY principle, and SSOT.
This checklist complements the Code Conventions with concrete verification points.
Naming Conventions
Namespace Pattern (MS Style)
[ ] Unit names follow WvdS.<Category>.<Component>.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.<Category>.<Component>.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
Zuletzt geändert: on 2026/01/29 at 10:31 PM