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
(*
@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
// 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 |
| | | |