Checklist Qualità Codice

Verifiche per convenzioni di nomenclatura, design delle funzioni, principio DRY e SSOT.

Questa checklist integra le Convenzioni di Codice con punti di verifica concreti.

Convenzioni di Nomenclatura

Pattern Namespace (Stile MS)

[ ] Nomi unit seguono WvdS.<Categoria>.<Componente>.pas
[ ] Rispecchia la struttura Microsoft .NET con prefisso WvdS.
[ ] Esempio: WvdS.UI.Controls.Button, WvdS.System.Logging

Gerarchia Classi (Stile Borland)

[ ] Base astratta usa prefisso TWvdSCustom*
[ ] Base pubblica usa prefisso TWvdSBase*
[ ] Classi concrete usano prefisso TWvdS*
[ ] Pattern: TWvdSCustomXxx -> TWvdSBaseXxx -> TUserXxx

Prefissi Tipo

Categoria Prefisso Esempio
Classi TWvdS* TWvdSRouter, TWvdSButton
Interfacce IWvdS* IWvdSActionResult, IWvdSBindable
Eccezioni EWvdS* EWvdSRoutingException
Record TWvdS* TWvdSBuildResult
Enum TWvdS* TWvdSProjectType
Callback TWvdS* TWvdSBuildCallback

Nomenclatura Generale

[ ] Nomi descrittivi (nessuna singola lettera tranne cicli)
[ ] Nessuna abbreviazione tranne quelle conosciute (URL, HTTP, JSON)
[ ] Interfacce hanno GUID per container DI
[ ] Campi privati: prefisso F* (FValue, FCount)
[ ] Parametri: prefisso A* (AIndex, APath)

Design Funzioni

Linee Guida Dimensioni

[ ] 12-24 righe ideale
[ ] Massimo 40 righe (oltre dividere)
[ ] Profondità massima annidamento: 3

Linee Guida Parametri

[ ] Massimo 5-7 parametri
[ ] Con più parametri: usare Record/Classe
[ ] Parametri opzionali alla fine

Single Responsibility

[ ] Ogni funzione ha UN compito
[ ] Il nome funzione descrive completamente il compito
[ ] Se serve "e" nel nome -> dividere

Naming Verb-First

[ ] Get* - Recuperare valore
[ ] Set* - Impostare valore
[ ] Calculate* - Eseguire calcolo
[ ] Process* - Eseguire elaborazione
[ ] Validate* - Eseguire validazione
[ ] Create* - Creare oggetto
[ ] Parse* - Analizzare input
[ ] Format* - Formattare output

Principio DRY

[ ] Nessun codice duplicato (più di 3 righe identiche -> estrarre)
[ ] Nessun pattern copia-incolla
[ ] Logica comune in funzioni helper
[ ] Costanti invece di letterali ripetuti

Esempio: Correggere Violazione DRY

(* VIETATO - Codice duplicato *)
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');
  (* ... ulteriore elaborazione *)
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');
  (* ... altra elaborazione *)
end;
 
(* CORRETTO - Logica comune estratta *)
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);
  (* ... ulteriore elaborazione *)
end;

Verifica SSOT

Single Source of Truth - Nessuna copia locale di codice comune!

Usare Librerie Common

[ ] API NodeJS via ~/sources/common/web/nodejs/
    - NodeJS.FS, NodeJS.Path, NodeJS.ChildProcess
[ ] API VSCode via ~/sources/common/web/vscode/
    - VSCode.Window, VSCode.Commands, VSCode.Workspace
[ ] WvdS Core via ~/sources/common/core/
    - WvdS.System.Logging, WvdS.VSCode.Security

Vietato

[ ] Nessuna chiamata require() diretta nelle Extension
[ ] Nessun duplicato di unit Common nelle Extension
[ ] Nessuna implementazione wrapper locale

Esempio: Violazione SSOT

(* VIETATO - require() locale *)
function FileExists(const APath: string): Boolean;
begin
  asm
    var fs = require('fs');  (* Violazione SSOT! *)
    Result = fs.existsSync(APath);
  end;
end;
 
(* CORRETTO - Libreria Common *)
uses
  NodeJS.FS;
 
function FileExists(const APath: string): Boolean;
begin
  Result := ExistsSync(APath);  (* Da NodeJS.FS *)
end;

Separation of Concerns

[ ] Logica UI solo in strato UI (extension_main, *Dialog)
[ ] Logica business solo in strato Service (*Service)
[ ] Strutture dati solo in strato Model (*Models)
[ ] Services non chiamano API VSCode direttamente
[ ] Models non contengono logica

Architettura a Strati

+-------------------------------------------------+
|  UI Layer (extension_main.pas, *Dialog.pas)     |
|  -> API VSCode, Interazione Utente              |
+-------------------------------------------------+
|  Service Layer (*Service.pas)                   |
|  -> Logica Business, Validazione                |
+-------------------------------------------------+
|  Model Layer (*Models.pas)                      |
|  -> Record, Tipi, Enum                          |
+-------------------------------------------------+
|  Infrastructure (NodeJS.*, VSCode.*, WvdS.*)    |
|  -> API Esterne, Astrazione Piattaforma         |
+-------------------------------------------------+

Checklist Rapida da Copiare

Checklist Review (Qualità Codice):

Naming:
- [ ] Nomi unit: WvdS.<Categoria>.<Componente>.pas
- [ ] Classi: prefisso TWvdS*
- [ ] Interfacce: prefisso IWvdS*
- [ ] Nomi descrittivi (nessuna abbreviazione)

Funzioni:
- [ ] 12-24 righe ideale, max 40
- [ ] Max 5-7 parametri
- [ ] Single Responsibility
- [ ] Naming Verb-First

DRY:
- [ ] Nessun codice duplicato
- [ ] Logica comune estratta
- [ ] Costanti invece di letterali

SSOT:
- [ ] Librerie Common usate
- [ ] Nessuna chiamata require() locale
- [ ] Nessun duplicato di unit Common

SoC:
- [ ] UI solo in strato UI
- [ ] Logica solo in strato Service
- [ ] Services senza chiamate VSCode dirette

Vedi anche

Zuletzt geändert: il 30/01/2026 alle 01:36