====== Kontrolni seznam kakovosti kode ======
Preverjanja za konvencije poimenovanja, zasnovo funkcij, načelo DRY in SSOT.
Ta kontrolni seznam dopolnjuje [[.:code-konventionen|Konvencije kode]] s konkretnimi kontrolnimi točkami.
===== Konvencije poimenovanja =====
==== Vzorec imenskega prostora (MS stil) ====
[ ] Imena enot sledijo WvdS...pas
[ ] Zrcali strukturo Microsoft .NET s predpono WvdS.
[ ] Primer: WvdS.UI.Controls.Button, WvdS.System.Logging
==== Hierarhija razredov (Borland stil) ====
[ ] Abstraktna baza uporablja predpono TWvdSCustom*
[ ] Javna baza uporablja predpono TWvdSBase*
[ ] Konkretni razredi uporabljajo predpono TWvdS*
[ ] Vzorec: TWvdSCustomXxx -> TWvdSBaseXxx -> TUserXxx
==== Predpone tipov ====
^ Kategorija ^ Predpona ^ Primer ^
| Razredi | ''TWvdS*'' | ''TWvdSRouter'', ''TWvdSButton'' |
| Vmesniki | ''IWvdS*'' | ''IWvdSActionResult'', ''IWvdSBindable'' |
| Izjeme | ''EWvdS*'' | ''EWvdSRoutingException'' |
| Zapisi | ''TWvdS*'' | ''TWvdSBuildResult'' |
| Naštevanja | ''TWvdS*'' | ''TWvdSProjectType'' |
| Povratni klici | ''TWvdS*'' | ''TWvdSBuildCallback'' |
==== Splošno poimenovanje ====
[ ] Opisna imena (brez posameznih črk razen v zankah)
[ ] Brez okrajšav razen znanih (URL, HTTP, JSON)
[ ] Vmesniki imajo GUID za DI-vsebnik
[ ] Zasebna polja: predpona F* (FValue, FCount)
[ ] Parametri: predpona A* (AIndex, APath)
===== Zasnova funkcij =====
==== Smernice za velikost ====
[ ] 12-24 vrstic idealno
[ ] Največ 40 vrstic (nad tem razdeliti)
[ ] Največja globina gnezdenja: 3
==== Smernice za parametre ====
[ ] Največ 5-7 parametrov
[ ] Pri več parametrih: uporaba zapisa/razreda
[ ] Izbirni parametri na koncu
==== Enojna odgovornost ====
[ ] Vsaka funkcija ima ENO nalogo
[ ] Ime funkcije v celoti opisuje nalogo
[ ] Če je v imenu potreben "in" -> razdeliti
==== Poimenovanje z glagolom na začetku ====
[ ] Get* - Pridobi vrednost
[ ] Set* - Nastavi vrednost
[ ] Calculate* - Izvedi izračun
[ ] Process* - Izvedi obdelavo
[ ] Validate* - Izvedi validacijo
[ ] Create* - Ustvari objekt
[ ] Parse* - Razčleni vnos
[ ] Format* - Oblikuj izhod
===== Načelo DRY =====
[ ] Brez podvojenega kode (več kot 3 identične vrstice -> ekstrahirati)
[ ] Brez vzorcev kopiraj-prilepi
[ ] Skupna logika v pomožnih funkcijah
[ ] Konstante namesto ponavljajočih se literalov
==== Primer: Odprava kršitve DRY ====
(* PREPOVEDANO - Podvojena koda *)
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');
(* ... nadaljnja obdelava *)
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 obdelava *)
end;
(* PRAVILNO - Skupna 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);
(* ... nadaljnja obdelava *)
end;
===== Preverjanje SSOT =====
**Single Source of Truth** - Brez lokalnih kopij Common kode!
==== Uporaba skupnih knjižnic ====
[ ] NodeJS-API-ji prek ~/sources/common/web/nodejs/
- NodeJS.FS, NodeJS.Path, NodeJS.ChildProcess
[ ] VSCode-API-ji prek ~/sources/common/web/vscode/
- VSCode.Window, VSCode.Commands, VSCode.Workspace
[ ] WvdS Core prek ~/sources/common/core/
- WvdS.System.Logging, WvdS.VSCode.Security
==== Prepovedano ====
[ ] Brez neposrednih klicev require() v razširitvah
[ ] Brez dvojnikov Common-enot v razširitvah
[ ] Brez lokalnih implementacij ovojnic
==== Primer: Kršitev SSOT ====
(* PREPOVEDANO - Lokalni require() *)
function FileExists(const APath: string): Boolean;
begin
asm
var fs = require('fs'); (* Kršitev SSOT! *)
Result = fs.existsSync(APath);
end;
end;
(* PRAVILNO - Skupna knjižnica *)
uses
NodeJS.FS;
function FileExists(const APath: string): Boolean;
begin
Result := ExistsSync(APath); (* Iz NodeJS.FS *)
end;
===== Ločevanje odgovornosti =====
[ ] Logika UI samo v plasti UI (extension_main, *Dialog)
[ ] Poslovna logika samo v storitveni plasti (*Service)
[ ] Podatkovne strukture samo v modelni plasti (*Models)
[ ] Storitve ne kličejo VSCode-API-jev neposredno
[ ] Modeli ne vsebujejo logike
==== Arhitektura plasti ====
+-------------------------------------------------+
| Plast UI (extension_main.pas, *Dialog.pas) |
| -> VSCode API-ji, interakcija z uporabnikom |
+-------------------------------------------------+
| Storitvena plast (*Service.pas) |
| -> Poslovna logika, validacija |
+-------------------------------------------------+
| Modelna plast (*Models.pas) |
| -> Zapisi, tipi, naštevanja |
+-------------------------------------------------+
| Infrastruktura (NodeJS.*, VSCode.*, WvdS.*) |
| -> Zunanji API-ji, abstrakcija platforme |
+-------------------------------------------------+
===== Hitri kontrolni seznam za kopiranje =====
Kontrolni seznam pregleda (kakovost kode):
Poimenovanje:
- [ ] Imena enot: WvdS...pas
- [ ] Razredi: predpona TWvdS*
- [ ] Vmesniki: predpona IWvdS*
- [ ] Opisna imena (brez okrajšav)
Funkcije:
- [ ] 12-24 vrstic idealno, največ 40
- [ ] Največ 5-7 parametrov
- [ ] Enojna odgovornost
- [ ] Poimenovanje z glagolom na začetku
DRY:
- [ ] Brez podvojenega kode
- [ ] Skupna logika ekstrahirana
- [ ] Konstante namesto literalov
SSOT:
- [ ] Skupne knjižnice uporabljene
- [ ] Brez lokalnih klicev require()
- [ ] Brez dvojnikov Common-enot
SoC:
- [ ] UI samo v plasti UI
- [ ] Logika samo v storitveni plasti
- [ ] Storitve brez neposrednih klicev VSCode
===== Glejte tudi =====
* [[.:qualitaetssicherung|Pregled zagotavljanja kakovosti]]
* [[.:code-konventionen|Konvencije kode]]
* [[.:audit-core|Kontrolni seznam Core]]
* [[.:extension-entwicklung|Razvoj razširitev]]