Kodne konvencije

Obvezujoči standardi kodiranja za WvdS FPC RAD Suite.

Konvencije poimenovanja

Tipi

Kategorija Predpona Primer
Razred TWvdS* TWvdSBuildConfig, TWvdSProjectManager
Vmesnik IWvdS* IWvdSLogger, IWvdSParser
Zapis TWvdS* TWvdSBuildResult, TWvdSToolPath
Naštevanje TWvdS* TWvdSProjectType, TWvdSBuildStatus
Izjema EWvdS* EWvdSFileNotFound, EWvdSParseError
Povratni klic TWvdS* TWvdSBuildCallback, TWvdSProgressHandler
Zunanji API tipi (VSCode, Node.js) ohranijo svoja izvirna imena.

Imena enot

Microsoftov stil imenskih prostorov s predpono WvdS:

WvdS.{Domena}.{Plast}.pas

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

Pripone plasti

Pripona Vsebina Primer
.Models Zapisi, naštevanja, tipi WvdS.Build.Models
.Service Poslovna logika WvdS.Build.Service
.Dialog WebView dialogi WvdS.Projects.SettingsDialog
.Provider VSCode API ovojniki WvdS.Designer.EditorProvider

Spremenljivke in parametri

Kategorija Predpona Primer
Zasebna polja F FProjectPath, FConfig
Parametri A APath, AOptions, ACallback
Lokalne spremenljivke Brez Result, I, Config

Resourcestrings

Predpona po funkcionalnosti:

Predpona Funkcionalnost
rsCore* Core Extension
rsBuild* Build Extension
rsProject* Projects Extension
rsDesigner* UI Designer
rsPreview* UI Preview
rsMeta* UI Meta
rsPackaging* Packaging
rsTool* Toolchain

Struktura kode

Zgradba enote

unit WvdS.{Feature}.{Layer};
 
{$mode objfpc}{$H+}
 
interface
 
uses
  // 1. Sistemske enote
  SysUtils, Classes,
  // 2. WvdS Common
  WvdS.System, WvdS.Collections,
  // 3. Funkcionalnostno specifične
  WvdS.{Feature}.Models;
 
type
  // Definicije tipov
 
function PublicFunction(const AParam: string): Boolean;
procedure PublicProcedure(AValue: Integer);
 
implementation
 
uses
  // Zasebni Uses (enote potrebne samo tukaj)
  WvdS.VSCode.Strings;
 
// Zasebni tipi in spremenljivke
type
  TInternalHelper = class
  end;
 
var
  InternalState: TObject;
 
// Implementacije
 
function PublicFunction(const AParam: string): Boolean;
begin
  // ...
end;
 
procedure PublicProcedure(AValue: Integer);
begin
  // ...
end;
 
initialization
  // Inicializacija
 
finalization
  // Čiščenje
 
end.

Zgradba razreda

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

Format PasDoc

(*
  @abstract(Kratek opis v enem stavku.)
 
  Podroben opis namena in uporabe.
  Lahko obsega več stavkov.
 
  @param(APath Polna pot do datoteke)
  @param(AOptions Opcijska konfiguracija, lahko nil)
  @returns(True če uspešno, False pri napaki)
 
  @raises(EWvdSFileNotFound če datoteka ne obstaja)
  @raises(EWvdSAccessDenied če ni pravic za branje)
 
  Varnost:
    - CWE-22: Pot se validira proti Path Traversal
 
  @seealso(RelatedFunction)
  @seealso(TWvdSRelatedClass)
*)
function ProcessFile(const APath: string; AOptions: TOptions): Boolean;

Vrstični komentarji

// Kratek komentar za posamezno vrstico
Result := CalculateValue;
 
// Večvrstični komentar za kompleksnejšo logiko
// Razlaga razlog, ne kaj
if (Value > Threshold) and (Mode = mAdvanced) then
begin
  // Tukaj moramo uporabiti napredni algoritem,
  // ker je preprost pri velikih vrednostih nenatančen
  Result := AdvancedCalculation(Value);
end;

Konstante namesto čarobnih števil

// PREPOVEDANO
if Length(Name) > 64 then
if Timeout > 30000 then
 
// PRAVILNO
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

Dosledno uporabljajte izraze:

Uporabljajte Izogibajte se
Path Url, Location, Dir (nedosledno)
Config Settings, Options, Prefs (nedosledno)
Create Make, Build (za objekte)
Generate Create (za izhod)
Validate Check, Verify (za vnose)
Initialize Setup, Init (nedosledno)
Execute Run, Process (nedosledno)

Oblikovanje

Zamik

  • 2 presledka za zamik (ne tabulatorji)
  • begin na svoji vrstici pri blokih
  • end na isti ravni zamika kot pripadajoči begin
// PRAVILNO
procedure Example;
begin
  if Condition then
  begin
    DoSomething;
    DoMore;
  end
  else
  begin
    DoAlternative;
  end;
end;
 
// PREPOVEDANO
procedure Example; begin
  if Condition then begin DoSomething; DoMore; end
  else DoAlternative;
end;

Dolžina vrstice

  • Največ 120 znakov na vrstico
  • Pri dolgih izrazih prelomite
// Pri dolgih seznamih parametrov
function VeryLongFunctionName(
  const AFirstParameter: string;
  const ASecondParameter: Integer;
  AThirdParameter: TOptions
): Boolean;
 
// Pri dolgih pogojih
if (FirstCondition) and
   (SecondCondition) and
   (ThirdCondition) then
begin
  // ...
end;

Prepovedani vzorci

Prazni obravnavalci izjem

// PREPOVEDANO
try
  DoSomething;
except
  // Nič ne stori - napaka se potlači!
end;
 
// PRAVILNO
try
  DoSomething;
except
  on E: Exception do
    LogError(rsUnexpectedError, [E.ClassName, E.Message]);
end;

TODO/FIXME v produkcijski kodi

// PREPOVEDANO v main veji
// TODO: Implement this later
// FIXME: This is broken
 
// DOVOLJENO samo v vejah funkcionalnosti, mora biti odstranjeno pred združitvijo

Zakodirani nizi

// PREPOVEDANO
ShowMessage('File not found');
ShowMessage('Datei nicht gefunden');
 
// PRAVILNO
ShowMessage(rsFileNotFound);  // resourcestring

Globalne spremenljivke v storitvah

// PREPOVEDANO
var
  GlobalConfig: TConfig;  // Težko testabilno!
 
// PRAVILNO - parameter predati
function ProcessWithConfig(const AConfig: TConfig): Boolean;

Testabilnost

Storitve morajo biti testabilne brez VSCode/UI:

// PREPOVEDANO - UI v storitvi
procedure ValidateAndShowError(const AName: string);
begin
  if not IsValid(AName) then
    ShowMessage('Invalid name');  // UI odvisnost!
end;
 
// PRAVILNO - povratna vrednost
function ValidateName(const AName: string; out AError: string): Boolean;
begin
  Result := IsValid(AName);
  if not Result then
    AError := rsInvalidName;
end;

Združljivost s pas2js (POMEMBNO)

pas2js NI 100% združljiv s FPC! Te omejitve JE TREBA upoštevati.

Nepodprte funkcionalnosti

Funkcionalnost FPC pas2js Rešitev
class var Da Ne Uporabite spremenljivko na ravni enote
Inline var Da Ne Deklarirajte v bloku var
Int64 Da Ne Uporabite Integer
Zuletzt geändert: dne 29.01.2026 ob 22:26