Scripting standard: Porovnání verzí

Z EreborWiki
Přejít na: navigace, hledání
(Založena nová stránka s textem „== Názvosloví == '''Objekt''' - character nebo item '''Linker''' - objekt, který se nějakou formou odkazuje na jiný objekt (tag s UID obj…“)
 
 
(Není zobrazeno 6 mezilehlých verzí od stejného uživatele.)
Řádka 1: Řádka 1:
== Názvosloví ==
+
Psaní libovolného kódu je často velmi subjektivní a o tom, jak má vypadat zdrojový byly sepsány stohy knih. V mnohých věcech panují věčné rozpory a neexistuje jedno konkrétní správné řešení. Sphere v tomto není výjimkou a její laxní syntaxe dovoluje zapsat stejný kód různými způsoby. Na jedné věci se však shodnou naprosto všichni vývojáři - ať už se nakonec rozhodneme pro jakoukoliv variantu zápisu kódu, je naprosto klíčové, aby '''všichni vývojáři jednoho projektu dodržovali shodné zásady'''. Přestože můžou tyto podmínky působit jako malichernost, desetiletí softwarového vývoje naprosto jednoznačně ukazují, že nejde o nuanci, ale že disciplína vývojářů v udržování homogenního, přehledného kódu vede k obrovským rozdílům ve výsledné kvalitě samotného kódu a k nižšímu výskytu chyb. V dobře organizovaném kódu se daleko lépe orientuje, je srozumitelnější a tedy je i další rozšiřování už existujícího kódu rychlejší.
  
'''Objekt''' - character nebo [[itemdef|item]]
+
Prosím tedy neberte následující řádky pouze jako doporučení, ale jako zcela závazný požadavek, který váše skripty musí splňovat. Porušení kteréhokoliv z níže uvedených bodů bude při kontrole vašich změn považován za zásadní chybu a změny vám budou navráceny k přepracování.
'''Linker''' - objekt, který se nějakou formou odkazuje na jiný objekt (tag s UID objektu, LINK)
 
'''Linkee''' - objekt, který je jiným předmětem odkazován (jeho UID je uloženo na nějakém Linkeru)
 
'''Definice''' - řádek kódu v hranatých závorkách, jako např. @[function f_name]@, @[chardef c_whatever]@, @[itemdef i_item]@ aj.
 
  
 
== Coding Standard ==
 
== Coding Standard ==
# K odsazování používáme 2 mezery, ne tabulátor!!
+
<ol>
# Používáme závorkové notace tam, kde to jde. Příklady:
+
<li>K odsazování používáme 2 mezery, ne tabulátor!!</li>
 +
<li>Dodržujeme camel-case u všech jmen. Tedy např.<br/>
 +
<pre>
 +
arg(localVar) // namísto arg(LocalVar); arg(localvar) apod.
 +
sysMessage("text") // namísto sysmessage("text") apod.
 +
atd.
 +
</pre></li>
 +
<li>Používáme závorkové notace tam, kde to jde. Příklady:
 
<pre>
 
<pre>
 
arg(localVar)
 
arg(localVar)
Řádka 16: Řádka 20:
 
tag(tagName,"value")
 
tag(tagName,"value")
 
tag(tagName2,<arg(localVar)>)
 
tag(tagName2,<arg(localVar)>)
</pre>
+
</pre></li>
# Pokud má nějaká základní sphere funkce více argumentů, nepíšeme za čárkou mezeru, například u tagu:
+
<li> Podmínky uzavíráme do závorek
 +
<pre>
 +
if (findId(i_some_item))
 +
  ...
 +
endif
 +
</pre> </li>
 +
<li>Pokud má nějaká základní sphere funkce více argumentů, nepíšeme za čárkou mezeru, například u tagu:
 
<pre>
 
<pre>
 
tag(name, <arg(value)>) // spatne
 
tag(name, <arg(value)>) // spatne
 
tag(name,<arg(value)>)  // spravne
 
tag(name,<arg(value)>)  // spravne
</pre>
+
</pre></li>
# V kódu dáváme přednost anglickým jménům, vyjma jmen funkcí volaných přímo hráči a dalším textům viditelným hráči.
+
<li>V kódu dáváme přednost anglickým jménům, vyjma jmen funkcí volaných přímo hráči a dalším textům viditelným hráči.</li>
# Jména funkcí:  
+
<li> Jména funkcí:  
#* Jména pomocných funkcí, která nejsou určena k přímému volání ze hry (hráčem či GM), započínejte prefixem @f_@
+
  <ol>
#* U funkcí spojených s nějakým objektem zmiňte jednoznačně daný objekt ve jménu funkce hned za prefixem, příklad:
+
    <li>ména pomocných funkcí, která nejsou určena k přímému volání ze hry (hráčem či GM), započínejte prefixem <code>f_</code></li>
 +
    <li>U funkcí spojených s nějakým objektem zmiňte jednoznačně daný objekt ve jménu funkce hned za prefixem, příklad:
 
<pre>
 
<pre>
 
[itemdef i_fallingDoor]
 
[itemdef i_fallingDoor]
 
...
 
...
 
[function f_fallingDoor_riseUp]
 
[function f_fallingDoor_riseUp]
</pre>
+
</pre></li>
#* Poslední částí jména funkce by měl být stručný, ovšem výstižný popis toho, co daná funkce dělá. Jméno by mělo být dostatečně sebedokumentující, aby neyblo nutné psát další komentář objasňující, co se v dané funkci vlastně děje (@f_fallingDoor_riseUp@)
+
    <li>Poslední částí jména funkce by měl být stručný, ovšem výstižný popis toho, co daná funkce dělá. Jméno by mělo být dostatečně sebedokumentující, aby neyblo nutné psát další komentář objasňující, co se v dané funkci vlastně děje (<code>f_fallingDoor_riseUp</code>)</li>
# jména předmětů:
+
  </ol></li>
#* Vždy začínají prefixem @i_@
+
<li>jména předmětů:
#* Jsou-li vytvořena v kontextu nějakého širšího konceptu (quest, dobývání, dungeon, summoni ...), následuje za prefixem jasný (společný) identifikátor tohoto konceptu
+
  <ol>
#* Poslední částí jména předmětu je jasný popis předmětu (@tree@, @memory@, @counter@, @gateGuard@ ...)
+
    <li>Vždy začínají prefixem <code>i_</code></li>
# jména v questových definicích:
+
    <li>Jsou-li vytvořena v kontextu nějakého širšího konceptu (quest, dobývání, dungeon, summoni ...), následuje za prefixem jasný (společný) identifikátor tohoto konceptu</li>
#* Každý quest má přiřazený jasný identifikátor, jako např. @gq002@. Tento identifikátor se musí objevit hned za prefixem definice předmětů, funkcí, dialogů a dalších definic spojených s daným questem
+
    <li>Poslední částí jména předmětu je jasný popis předmětu (<code>tree</code>, <code>memory</code>, <code>counter</code>, <code>gateGuard</code> ...)</li>
 +
  </ol></li>
 +
<li>jména v questových definicích:
 +
  <ol>
 +
    <li>Každý quest má přiřazený jasný identifikátor, jako např. <code>gq002</code>. Tento identifikátor se musí objevit hned za prefixem definice předmětů, funkcí, dialogů a dalších definic spojených s daným questem
 
<pre>
 
<pre>
 
[itemdef i_gq002_item]
 
[itemdef i_gq002_item]
Řádka 48: Řádka 63:
 
[chardef c_gq002_characterDefName]
 
[chardef c_gq002_characterDefName]
 
...
 
...
</pre>
+
</pre></li>
# Komentujte kód tam, kde je to třeba!
+
  </ol>
#* Vždy dokumentujte vstupy do funkcí, které je třeba volat - tedy argumenty funkcí. Pro víceúčelové (sdílené) funkce je také vhodné zmínit, nad čím je třeba funkci volat (někdy je třeba vyvolat funkci nad předmětem, cílem targetu, hráčem vyvolávajícím danou událost apod.)
+
<li>Komentujte kód tam, kde je to třeba!
 +
  <ol>
 +
    <li>Vždy dokumentujte vstupy do funkcí, které je třeba volat - tedy argumenty funkcí. Pro víceúčelové (sdílené) funkce je také vhodné zmínit, nad čím je třeba funkci volat (někdy je třeba vyvolat funkci nad předmětem, cílem targetu, hráčem vyvolávajícím danou událost apod.)
 
<pre>
 
<pre>
 
// this function is doing this and that
 
// this function is doing this and that
Řádka 59: Řádka 76:
 
[function f_context_doingSomething]
 
[function f_context_doingSomething]
 
...
 
...
</pre>
+
</pre></li>
#* Definice komentujte vždy *před* samotnou definicí, ne až v bloku kódu vyhrazeném pro danou definici (optimalizace výkonu)
+
    <li>Definice komentujte vždy '''před''' samotnou definicí, ne až v bloku kódu vyhrazeném pro danou definici (optimalizace výkonu)</li>
#* Pakliže cítíte, že musíte psát komentář, zvažte, zda by nebylo vhodné použít raději další funkci, která svým jménem jasně vyjádří, oč jde, a zakryje nějaký komplikovaný implementační detail. Přidávání dalších sebepopisujících funkcí do kódu namísto několikanásobně zanořených podmínek zpřehledňuje čitelnost kódu a redukuje riziko chyby
+
    <li>Pakliže cítíte, že musíte psát komentář, zvažte, zda by nebylo vhodné použít raději další funkci, která svým jménem jasně vyjádří, oč jde, a zakryje nějaký komplikovaný implementační detail. Přidávání dalších sebepopisujících funkcí do kódu namísto několikanásobně zanořených podmínek zpřehledňuje čitelnost kódu a redukuje riziko chyby</li>
# Výpočty v kódu *závorkujte*! Sphere nemá definovanou prioritu operátorů násobení, dělení apodobně. @<3+4*5>@ není totéž jako @<4*5+3>@. Korektní zápis by měl být @<3+(4*5)>@. Není však třeba závorkovat výpočty, kde k chybě ani dojít nemůže, např. @<1+2+3-4>@, @<2*3*4>@, @<10/3>@ apod.
+
  </ol></li>
# Neupravujte globálně špatně formátovaný kód, vznik chyby je vysoký. Pokud se ovšem v nějakém kódu více vrtáte, pak je vhodné jej rovnou i přeformátovat. Odsazení bývá zcela bezpečné, změny ve voláních však otestujte!
+
<li>Výpočty v kódu '''závorkujte'''! Sphere nemá definovanou prioritu operátorů násobení, dělení apodobně. <code><3+4*5></code> není totéž jako <code><4*5+3></code>. Korektní zápis by měl být <code><3+(4*5)></code>. Není však třeba závorkovat výpočty, kde k chybě ani dojít nemůže, např. <code><1+2+3-4></code>, <code><2*3*4></code>, <code><10/3></code> apod.</li>
 +
<li>Neupravujte globálně špatně formátovaný kód, vznik chyby je vysoký. Pokud se ovšem v nějakém kódu více vrtáte, pak je vhodné jej rovnou i přeformátovat. Odsazení bývá zcela bezpečné, změny ve voláních však otestujte!</li>
 +
</ol>

Aktuální verze z 2. 5. 2019, 08:29

Psaní libovolného kódu je často velmi subjektivní a o tom, jak má vypadat zdrojový byly sepsány stohy knih. V mnohých věcech panují věčné rozpory a neexistuje jedno konkrétní správné řešení. Sphere v tomto není výjimkou a její laxní syntaxe dovoluje zapsat stejný kód různými způsoby. Na jedné věci se však shodnou naprosto všichni vývojáři - ať už se nakonec rozhodneme pro jakoukoliv variantu zápisu kódu, je naprosto klíčové, aby všichni vývojáři jednoho projektu dodržovali shodné zásady. Přestože můžou tyto podmínky působit jako malichernost, desetiletí softwarového vývoje naprosto jednoznačně ukazují, že nejde o nuanci, ale že disciplína vývojářů v udržování homogenního, přehledného kódu vede k obrovským rozdílům ve výsledné kvalitě samotného kódu a k nižšímu výskytu chyb. V dobře organizovaném kódu se daleko lépe orientuje, je srozumitelnější a tedy je i další rozšiřování už existujícího kódu rychlejší.

Prosím tedy neberte následující řádky pouze jako doporučení, ale jako zcela závazný požadavek, který váše skripty musí splňovat. Porušení kteréhokoliv z níže uvedených bodů bude při kontrole vašich změn považován za zásadní chybu a změny vám budou navráceny k přepracování.

Coding Standard

  1. K odsazování používáme 2 mezery, ne tabulátor!!
  2. Dodržujeme camel-case u všech jmen. Tedy např.
    arg(localVar) // namísto arg(LocalVar); arg(localvar) apod.
    sysMessage("text") // namísto sysmessage("text") apod.
    atd.
    
  3. Používáme závorkové notace tam, kde to jde. Příklady:
    arg(localVar)
    var(globalVar)
    def_defnameVariable
    sysMessage("text v zavorkach a uvozovkach")
    tag(tagName,"value")
    tag(tagName2,<arg(localVar)>)
    
  4. Podmínky uzavíráme do závorek
    if (findId(i_some_item))
       ...
    endif
    
  5. Pokud má nějaká základní sphere funkce více argumentů, nepíšeme za čárkou mezeru, například u tagu:
    tag(name, <arg(value)>) // spatne
    tag(name,<arg(value)>)  // spravne
    
  6. V kódu dáváme přednost anglickým jménům, vyjma jmen funkcí volaných přímo hráči a dalším textům viditelným hráči.
  7. Jména funkcí:
    1. ména pomocných funkcí, která nejsou určena k přímému volání ze hry (hráčem či GM), započínejte prefixem f_
    2. U funkcí spojených s nějakým objektem zmiňte jednoznačně daný objekt ve jménu funkce hned za prefixem, příklad:
      [itemdef i_fallingDoor]
      ...
      [function f_fallingDoor_riseUp]
      
    3. Poslední částí jména funkce by měl být stručný, ovšem výstižný popis toho, co daná funkce dělá. Jméno by mělo být dostatečně sebedokumentující, aby neyblo nutné psát další komentář objasňující, co se v dané funkci vlastně děje (f_fallingDoor_riseUp)
  8. jména předmětů:
    1. Vždy začínají prefixem i_
    2. Jsou-li vytvořena v kontextu nějakého širšího konceptu (quest, dobývání, dungeon, summoni ...), následuje za prefixem jasný (společný) identifikátor tohoto konceptu
    3. Poslední částí jména předmětu je jasný popis předmětu (tree, memory, counter, gateGuard ...)
  9. jména v questových definicích:
    1. Každý quest má přiřazený jasný identifikátor, jako např. gq002. Tento identifikátor se musí objevit hned za prefixem definice předmětů, funkcí, dialogů a dalších definic spojených s daným questem
      [itemdef i_gq002_item]
      ...
      [function f_gq002_doingThis]
      ...
      [defnames d_def_gq002]
      def_gq002_firstDefname  value
      
      [chardef c_gq002_characterDefName]
      ...
      
  10. Komentujte kód tam, kde je to třeba!
    1. Vždy dokumentujte vstupy do funkcí, které je třeba volat - tedy argumenty funkcí. Pro víceúčelové (sdílené) funkce je také vhodné zmínit, nad čím je třeba funkci volat (někdy je třeba vyvolat funkci nad předmětem, cílem targetu, hráčem vyvolávajícím danou událost apod.)
      // this function is doing this and that
      // argv(0) - this is some object ID
      // argv(1) - this is some value, having THIS and THAT effect on the function
      // argv(2) - this is a text message displayed when THIS and THAT happens
      // ...
      [function f_context_doingSomething]
      ...
      
    2. Definice komentujte vždy před samotnou definicí, ne až v bloku kódu vyhrazeném pro danou definici (optimalizace výkonu)
    3. Pakliže cítíte, že musíte psát komentář, zvažte, zda by nebylo vhodné použít raději další funkci, která svým jménem jasně vyjádří, oč jde, a zakryje nějaký komplikovaný implementační detail. Přidávání dalších sebepopisujících funkcí do kódu namísto několikanásobně zanořených podmínek zpřehledňuje čitelnost kódu a redukuje riziko chyby
  11. Výpočty v kódu závorkujte! Sphere nemá definovanou prioritu operátorů násobení, dělení apodobně. <3+4*5> není totéž jako <4*5+3>. Korektní zápis by měl být <3+(4*5)>. Není však třeba závorkovat výpočty, kde k chybě ani dojít nemůže, např. <1+2+3-4>, <2*3*4>, <10/3> apod.
  12. Neupravujte globálně špatně formátovaný kód, vznik chyby je vysoký. Pokud se ovšem v nějakém kódu více vrtáte, pak je vhodné jej rovnou i přeformátovat. Odsazení bývá zcela bezpečné, změny ve voláních však otestujte!