Kontrolna lista kvalitete koda

Provjere za konvencije imenovanja, dizajn funkcija, DRY-princip i SSOT.

Ova kontrolna lista dopunjuje Konvencije koda s konkretnim točkama provjere.

Konvencije imenovanja

Namespace-Pattern (MS-stil)

[ ] Nazivi unit-a prate WvdS.<Kategorija>.<Komponenta>.pas
[ ] Odražava Microsoft .NET strukturu s WvdS. prefiksom
[ ] Primjer: WvdS.UI.Controls.Button, WvdS.System.Logging

Hijerarhija klasa (Borland-stil)

[ ] Apstraktna baza koristi TWvdSCustom* prefiks
[ ] Javna baza koristi TWvdSBase* prefiks
[ ] Konkretne klase koriste TWvdS* prefiks
[ ] Obrazac: TWvdSCustomXxx → TWvdSBaseXxx → TUserXxx

Prefiksi tipova

Kategorija Prefiks Primjer
Klase TWvdS* TWvdSRouter, TWvdSButton
Sučelja IWvdS* IWvdSActionResult, IWvdSBindable
Iznimke EWvdS* EWvdSRoutingException
Zapisi TWvdS* TWvdSBuildResult
Enumeracije TWvdS* TWvdSProjectType
Callback-ovi TWvdS* TWvdSBuildCallback

Opće imenovanje

[ ] Opisna imena (bez pojedinačnih slova osim u petljama)
[ ] Bez kratica osim poznatih (URL, HTTP, JSON)
[ ] Sučelja imaju GUID za DI-container
[ ] Privatna polja: F* prefiks (FValue, FCount)
[ ] Parametri: A* prefiks (AIndex, APath)

Dizajn funkcija

Smjernice za veličinu

[ ] 12-24 linije idealno
[ ] Maksimalno 40 linija (iznad toga podijeliti)
[ ] Maksimalna dubina ugniježđenja: 3

Smjernice za parametre

[ ] Maksimalno 5-7 parametara
[ ] Kod više parametara: koristi Record/Klasu
[ ] Opcionalni parametri na kraju

Single Responsibility

[ ] Svaka funkcija ima JEDAN zadatak
[ ] Naziv funkcije potpuno opisuje zadatak
[ ] Ako je "i" potreban u nazivu → podijeliti

Verb-First imenovanje

[ ] Get* - Dohvati vrijednost
[ ] Set* - Postavi vrijednost
[ ] Calculate* - Izvrši izračun
[ ] Process* - Izvrši obradu
[ ] Validate* - Izvrši validaciju
[ ] Create* - Stvori objekt
[ ] Parse* - Parsiraj unos
[ ] Format* - Formatiraj izlaz

DRY-princip

[ ] Bez dupliciranog koda (više od 3 identične linije → ekstrahiraj)
[ ] Bez copy-paste obrazaca
[ ] Zajednička logika u pomoćnim funkcijama
[ ] Konstante umjesto ponovljenih literala

Primjer: Ispravak DRY-kršenja

(* ZABRANJENO - Duplicirani kod *)
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');
  (* ... daljnja obrada *)
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');
  (* ... druga obrada *)
end;
 
(* ISPRAVNO - Zajednička logika ekstrahirana *)
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);
  (* ... daljnja obrada *)
end;

SSOT-provjera

Single Source of Truth - Bez lokalnih kopija Common-koda!

Korištenje Common Libraries

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

Zabranjeno

[ ] Bez direktnih require()-poziva u ekstenzijama
[ ] Bez duplikata Common-unit-a u ekstenzijama
[ ] Bez lokalnih wrapper-implementacija

Primjer: SSOT-kršenje

(* ZABRANJENO - Lokalni require() *)
function FileExists(const APath: string): Boolean;
begin
  asm
    var fs = require('fs');  (* SSOT-kršenje! *)
    Result = fs.existsSync(APath);
  end;
end;
 
(* ISPRAVNO - Common Library *)
uses
  NodeJS.FS;
 
function FileExists(const APath: string): Boolean;
begin
  Result := ExistsSync(APath);  (* Iz NodeJS.FS *)
end;

Separation of Concerns

[ ] UI-logika samo u UI-sloju (extension_main, *Dialog)
[ ] Poslovna logika samo u Service-sloju (*Service)
[ ] Strukture podataka samo u Model-sloju (*Models)
[ ] Servisi ne pozivaju direktno VSCode-API-je
[ ] Modeli ne sadrže logiku

Slojevita arhitektura

┌─────────────────────────────────────────────────┐
│  UI Layer (extension_main.pas, *Dialog.pas)    │
│  → VSCode API-ji, User Interaction             │
├─────────────────────────────────────────────────┤
│  Service Layer (*Service.pas)                  │
│  → Poslovna logika, Validacija                 │
├─────────────────────────────────────────────────┤
│  Model Layer (*Models.pas)                     │
│  → Records, Tipovi, Enumeracije                │
├─────────────────────────────────────────────────┤
│  Infrastructure (NodeJS.*, VSCode.*, WvdS.*)   │
│  → Vanjski API-ji, Platform-Apstrakcija        │
└─────────────────────────────────────────────────┘

Brza kontrolna lista za kopiranje

Kontrolna lista pregleda (Kvaliteta koda):

Imenovanje:
- [ ] Nazivi unit-a: WvdS.<Kategorija>.<Komponenta>.pas
- [ ] Klase: TWvdS* prefiks
- [ ] Sučelja: IWvdS* prefiks
- [ ] Opisna imena (bez kratica)

Funkcije:
- [ ] 12-24 linije idealno, max 40
- [ ] Max 5-7 parametara
- [ ] Single Responsibility
- [ ] Verb-First imenovanje

DRY:
- [ ] Bez dupliciranog koda
- [ ] Zajednička logika ekstrahirana
- [ ] Konstante umjesto literala

SSOT:
- [ ] Common Libraries korištene
- [ ] Bez lokalnih require()-poziva
- [ ] Bez duplikata Common-unit-a

SoC:
- [ ] UI samo u UI-sloju
- [ ] Logika samo u Service-sloju
- [ ] Servisi bez direktnih VSCode-poziva

Vidi također

Zuletzt geändert: 29.01.2026. u 22:28