Konvence pro skriptovací jazyk

Z enTeam
Skočit na navigaci Skočit na vyhledávání

Tento dokument popisuje konvence skriptovacího jazyka

Deklarace externích funkcí

  • Bez odsazení
  • Mezery před a za názvem knihovny
  • Deklarace nezalamujeme
  • Deklarace řadíme dle abecedy (kvůli zamezení duplicitním deklaracím)
  • Pro každou knihovnu vytvoříme vlastní blok deklarací (např. kvůli problematice #Uvolnění knihovny externích funkcí)
  • Za blokem deklarací vynecháme jeden řádek
declare function GetCurrency dll"ActualDocument"(string): currency // Špatně
declare function GetCurrency dll "ActualDocument" (string): currency // OK

Název skriptu

  • Bez odsazení
  • Bez mezer kolem ()
  • Název začíná velkým písmenem, ostatní písmena jsou malá, s výjimkou počátečních písmen dalších slov
script Get_currency_code(): string // Špatně
script GetCurrencyCode () : string // Špatně
script GetCurrencyCode(): string // OK

Klíčová slova

  • Klíčová slova (zvýrazněná v editoru), např. názvy typů, píšeme vždy malými písmeny
  • Pozor na klíčové slovo nounload, které se nezvýrazňuje
String, Integer, ActualDocument, Result // Špatně
string, integer, actualdocument, result // OK

Lokální proměnné

  • Deklarace první proměnné je vždy pod klíčovým slovem var, nikdy ne na stejné řádce
  • Odsazení 2 mezery
  • Na stejné řádce vždy pouze úzce související proměnné (např. souřadnice X, Y)
  • Mezera za znaky ,, resp. :, nikdy ne před těmito znaky
  • Proměnné pojmenováváme vždy popisnými jmény, nepojmenováváme pouze jedním písmenem (výjimkou mohou být např. souřadnice X, Y, řídící proměnné cyklů I, J atd.)
  • Proměnné pojmenováváme malými písmeny, pouze počáteční písmena slov jsou velká (platí i pro globální proměnné)
  • V názvech nepoužíváme podtržítka (platí i pro globální proměnné)
  • Pro proměnné, které mají neočekávaný typ, používáme prefixy psané malými písmeny
Typ Prefix
string s
integer i
boolean b
date d
currency c
user u
usercollection uc
  • Nepoužíváme lokální listové proměnné (stringlist, integerlist, …), protože nefungují správně
var Count: integer // Špatné odsazení, schází zalomení
  S_Count: string // Špatné pojmenování proměnné
var
  Count: integer // OK
  sCount: string // OK

Lokální konstanty

  • Konstanty zapisujeme do sekce var, protože sekci pro konstanty skriptovací jazyk nepodporuje
  • Konstanty v sekci zapisujeme před proměnné a mezi konstantami a proměnnými vždy vynecháme prázdný řádek
  • Konstanty pro odlišení pojmenováváme pouze velkými písmeny, pro oddělení slov používáme podtržítko
  • Je vhodné pro přehlednost všechny konstanty nadefinovat hned na začátku skriptu
var
  ItemCount: integer // Špatné pojmenování konstanty, označuje proměnnou
var
  ITEM_COUNT: integer // OK

Tok skriptu

  • Odsazení na 2 mezery
  • Maximální délka řádku 80 znaků
    • Tolerovat lze nezalomení do 100 znaků
  • Při zalomení řádku je na dalším řádku (řádcích) odsazení 4 mezery
  • Zalamování je vhodné za oddělovači (, :), binárními operátory (+ - * / = := += -= ++= or and, ...) nebo za ( [
// Špatně
I := 0 J := 0

if I > 0 then J += 1 end
// OK
I := 0
J := 0

if I > 0 then
  J += 1
end

Komentáře

  • Komentáře se zarovnávají stejně jako kód skriptu
  • Za uvozením komentáře vložíme mezeru a začneme velkým písmenem
  • U víceřádkového komentáře nepoužíváme // a komentář zarovnáme do bloku
//špatně
/* Také
špatně */
// Toto je správně
/* Také
   správně */

Výrazy

  • Vkládáme jednu mezeru před i za operátor
  • Nevkládáme zbytečné závorky
    • Výjimkou jsou logické výrazy obsahující více podmínek, kde zápis bez závorek ztrácí na přehlednosti
// Špatně
I:=J+5
if (I = 0) then
if I = 0 and J = 0 then
// OK
I := J + 5
if I = 0 then
if (I = 0) and (J = 0) then

Ukončení příkazů

  • Koncový end je vždy zarovnán stejně jako příkaz, ke kterému se váže
  • Blok kódu pod tento příkaz spadající je oproti příkazu odsazen o 2 mezery
// Špatně
if I = 0 then I += 1 end 
// OK
if I = 0 then
  I += 1
end

Příkazy

Příkaz if (else)

  • Blok kódu pod tento příkaz spadající je oproti příkazu odsazen o 2 znaky
  • Pokud je testována jedna proměnná na více hodnot, používáme pro přehlednost i zvýšení výkonu else větev
    • Toto neplatí, pokud se řídící proměnná podmínky může změnit v kódu spadajícím pod předchozí podmínku
if I < 0 then
  write("Záporné číslo")
end
if I = 0 then
  write("Nula")
end
if I > 0 then
  write("Kladné číslo")
end
if I < 0 then
  write("Záporné číslo")
else
  if I = 0 then
    write("Nula")
  else
    write("Kladné číslo")
  end
end

Příkaz case

  • Protože příkaz case nefunguje správně, je nutné použít sadu podmínek if !!!
  • Pokud je velké množství porovnávaných hodnot a docházelo by k velkému zanoření kódu kvůli cyklickému odsazení else větví, je možné použít cyklus while true do se sadou podmínek, kdy každá obsahuje příkaz break pro ukončení cyklu a ukončení porovnávání hodnot
    • Pokud bude zapomenut příkaz break, skončí skript v nekonečné smyčce
while true do
  if I = 0 then
    write("Nula")
    break
  end
  
  if I = 1 then
    write("Jedna")
    break
  end
  
  if I = 2 then
    write("Dva")
    break
  end
  
  // Else větev
  write("Neznámé číslo")
  break
end

Cykly while do, for to do, foreach do

  • Pokud známe potřebný výsledek před dokončením všech obrátek cyklu, vždy jej předčasně ukončíme příkazem break
  • Pokud před dokončením jednoho průchodu cyklem víme, že nemůžeme získat potřebný výsledek, pokročíme rovnou na další index pomocí příkazu continue

Uvolnění knihovny externích funkcí

  • Knihovna je standardně načtena skriptem při použití první funkce z této knihovny
  • Knihovna je automaticky uvolněna s koncem skriptu
  • Pokud je volán podskript a knihovna externích funkcí již byla načtena v nadřazeném skriptu, není již znovu načtena
    • V tom případě není knihovna ani uvolněna s koncem skriptu
  • Pokud je potřeba zamezit uvolnění knihovny s koncem skriptu (např. kvůli předání hodnot nadřazenému skriptu), je potřeba za deklaraci funkce z knihovny vložit klíčové slovo nounload
    • Toto klíčové slovo je nutné vložit vždy za první deklaraci z této knihovny
declare function GetCurrency dll "ActualDocument" (string): currency nounload