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