Konvencije koda

Obavezni standardi kodiranja za WvdS FPC RAD Suite.

Konvencije imenovanja

Tipovi

Kategorija Prefiks Primjer
Klasa TWvdS* TWvdSBuildConfig, TWvdSProjectManager
Interface IWvdS* IWvdSLogger, IWvdSParser
Record TWvdS* TWvdSBuildResult, TWvdSToolPath
Enum TWvdS* TWvdSProjectType, TWvdSBuildStatus
Exception EWvdS* EWvdSFileNotFound, EWvdSParseError
Callback TWvdS* TWvdSBuildCallback, TWvdSProgressHandler
Vanjski API-tipovi (VSCode, Node.js) zadržavaju svoje originalne nazive.

Nazivi Unita

Microsoft-stil Namespaces s WvdS-prefiksom:

WvdS.{Domain}.{Layer}.pas

Primjeri:
WvdS.Build.Models.pas
WvdS.Build.Service.pas
WvdS.Projects.SettingsDialog.pas
WvdS.VSCode.Commands.pas

Layer-Sufiksi

Sufiks Sadržaj Primjer
.Models Records, Enumi, Tipovi WvdS.Build.Models
.Service Poslovna logika WvdS.Build.Service
.Dialog WebView-Dijalozi WvdS.Projects.SettingsDialog
.Provider VSCode API Wrapper WvdS.Designer.EditorProvider

Varijable i Parametri

Kategorija Prefiks Primjer
Privatna polja F FProjectPath, FConfig
Parametri A APath, AOptions, ACallback
Lokalne varijable Bez Result, I, Config

Resourcestrings

Prefiks prema značajci:

Prefiks Značajka
rsCore* Core Extension
rsBuild* Build Extension
rsProject* Projects Extension
rsDesigner* UI Designer
rsPreview* UI Preview
rsMeta* UI Meta
rsPackaging* Packaging
rsTool* Toolchain

Struktura koda

Struktura Unita

unit WvdS.{Feature}.{Layer};
 
{$mode objfpc}{$H+}
 
interface
 
uses
  // 1. System Units
  SysUtils, Classes,
  // 2. WvdS Common
  WvdS.System, WvdS.Collections,
  // 3. Feature-specifično
  WvdS.{Feature}.Models;
 
type
  // Definicije tipova
 
function PublicFunction(const AParam: string): Boolean;
procedure PublicProcedure(AValue: Integer);
 
implementation
 
uses
  // Private Uses (samo ovdje potrebne Units)
  WvdS.VSCode.Strings;
 
// Privatni tipovi i varijable
type
  TInternalHelper = class
  end;
 
var
  InternalState: TObject;
 
// Implementacije
 
function PublicFunction(const AParam: string): Boolean;
begin
  // ...
end;
 
procedure PublicProcedure(AValue: Integer);
begin
  // ...
end;
 
initialization
  // Inicijalizacija
 
finalization
  // Čišćenje
 
end.

Struktura klase

type
  TWvdSExampleClass = class(TObject)
  private
    FName: string;
    FValue: Integer;
    procedure SetName(const AValue: string);
  protected
    procedure DoInternalWork; virtual;
  public
    constructor Create(const AName: string);
    destructor Destroy; override;
    procedure Execute;
    property Name: string read FName write SetName;
    property Value: Integer read FValue write FValue;
  end;

Dokumentacija

PasDoc-Format

(*
  @abstract(Kratki opis u jednoj rečenici.)
 
  Detaljni opis svrhe i korištenja.
  Može sadržavati više rečenica.
 
  @param(APath Potpuna putanja do datoteke)
  @param(AOptions Opcionalna konfiguracija, može biti nil)
  @returns(True ako uspješno, False kod greške)
 
  @raises(EWvdSFileNotFound ako datoteka ne postoji)
  @raises(EWvdSAccessDenied ako nema prava čitanja)
 
  Security:
    - CWE-22: Putanja se validira protiv Path Traversal
 
  @seealso(RelatedFunction)
  @seealso(TWvdSRelatedClass)
*)
function ProcessFile(const APath: string; AOptions: TOptions): Boolean;

Inline-Komentari

// Kratki komentar za jednu liniju
Result := CalculateValue;
 
// Višelinijski komentar za složeniju logiku
// Objašnjava razlog, ne što
if (Value > Threshold) and (Mode = mAdvanced) then
begin
  // Moramo ovdje koristiti prošireni algoritam,
  // jer jednostavni nije točan kod velikih vrijednosti
  Result := AdvancedCalculation(Value);
end;

Konstante umjesto Magic Numbers

// ZABRANJENO
if Length(Name) > 64 then
if Timeout > 30000 then
 
// ISPRAVNO
const
  MAX_PROJECT_NAME_LENGTH = 64;
  DEFAULT_TIMEOUT_MS = 30000;
 
if Length(Name) > MAX_PROJECT_NAME_LENGTH then
if Timeout > DEFAULT_TIMEOUT_MS then

Terminologija

Koristite konzistentne pojmove:

Koristite Izbjegavajte
Path Url, Location, Dir (nekonzistentno)
Config Settings, Options, Prefs (nekonzistentno)
Create Make, Build (za objekte)
Generate Create (za izlaz)
Validate Check, Verify (za unose)
Initialize Setup, Init (nekonzistentno)
Execute Run, Process (nekonzistentno)

Formatiranje

Uvlačenje

  • 2 razmaka za uvlačenje (ne tabovi)
  • begin na vlastitoj liniji kod blokova
  • end na istoj razini uvlačenja kao pripadajući begin
// ISPRAVNO
procedure Example;
begin
  if Condition then
  begin
    DoSomething;
    DoMore;
  end
  else
  begin
    DoAlternative;
  end;
end;
 
// ZABRANJENO
procedure Example; begin
  if Condition then begin DoSomething; DoMore; end
  else DoAlternative;
end;

Duljina linije

  • Maksimalno 120 znakova po liniji
  • Prelom kod dugih izraza
// Kod dugih lista parametara
function VeryLongFunctionName(
  const AFirstParameter: string;
  const ASecondParameter: Integer;
  AThirdParameter: TOptions
): Boolean;
 
// Kod dugih uvjeta
if (FirstCondition) and
   (SecondCondition) and
   (ThirdCondition) then
begin
  // ...
end;

Zabranjeni Patterni

Prazni Exception-Handleri

// ZABRANJENO
try
  DoSomething;
except
  // Ništa ne raditi - gutanje greške!
end;
 
// ISPRAVNO
try
  DoSomething;
except
  on E: Exception do
    LogError(rsUnexpectedError, [E.ClassName, E.Message]);
end;

TODO/FIXME u produkcijskom kodu

// ZABRANJENO u main-Branchu
// TODO: Implement this later
// FIXME: This is broken
 
// DOZVOLJENO samo u Feature-Branchevima, mora se ukloniti prije Mergea

Hardkodirani Stringovi

// ZABRANJENO
ShowMessage('File not found');
ShowMessage('Datei nicht gefunden');
 
// ISPRAVNO
ShowMessage(rsFileNotFound);  // resourcestring

Globalne varijable u Servisima

// ZABRANJENO
var
  GlobalConfig: TConfig;  // Teško testabilno!
 
// ISPRAVNO - predavanje parametra
function ProcessWithConfig(const AConfig: TConfig): Boolean;

Testabilnost

Servisi moraju biti testabilni bez VSCode/UI:

// ZABRANJENO - UI u Servisu
procedure ValidateAndShowError(const AName: string);
begin
  if not IsValid(AName) then
    ShowMessage('Invalid name');  // UI-ovisnost!
end;
 
// ISPRAVNO - povratna vrijednost
function ValidateName(const AName: string; out AError: string): Boolean;
begin
  Result := IsValid(AName);
  if not Result then
    AError := rsInvalidName;
end;

pas2js Kompatibilnost (VAŽNO)

pas2js NIJE 100% kompatibilan s FPC-om! Ova ograničenja MORAJU se poštivati.

Nepodržane značajke

Značajka FPC pas2js Zaobilazno rješenje
class var Koristiti Unit-Level Variable
Inline var Deklarirati u var-bloku
Int64 Koristiti Integer
Zuletzt geändert: 29.01.2026. u 22:33