====== Kontrolna lista kvalitete koda ======
Provjere za konvencije imenovanja, dizajn funkcija, DRY-princip i SSOT.
Ova kontrolna lista dopunjuje [[.:code-konventionen|Konvencije koda]] s konkretnim točkama provjere.
===== Konvencije imenovanja =====
==== Namespace-Pattern (MS-stil) ====
[ ] Nazivi unit-a prate WvdS...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...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 =====
* [[.:qualitaetssicherung|Pregled osiguranja kvalitete]]
* [[.:code-konventionen|Konvencije koda]]
* [[.:audit-core|Osnovna kontrolna lista]]
* [[.:extension-entwicklung|Razvoj ekstenzija]]