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