Peter Širka
Peter Širka

Brutal Developer

Jednoduchý pattern pre tvorbu Total.js aplikácií

Jednoduchý pattern pre tvorbu Total.js aplikácií

Total.js framework vyvíjam už niekoľko rokov a veľmi dlhý čas z tohto vývoja som hľadal vhodný spôsob, ako tvoriť aplikácie. Vytvoril som veľmi veľa aplikácií a stále to nebolo ono, preto som sa trošku inšpiroval Node.js modulom Mongoose.js a jeho schémami.

Total.js schémy

Považujem ich za základnú stavebnú jednotku všetkých Total.js aplikácií, pretože do schém ukladám celú business logiku, validácie a všetko okolo toho. Pomocou schém sa mi podarilo urobiť poriadok a prehľadnosť v zdrojových kódoch všetkých aplikácií. Takže na otázku čo sú vlastne Total.js schémy? Odpoviem jednoducho, že schéma je len nejaký objekt s preddefinovanou štruktúrou vlastností a metód, nič viac.

Hlavné výhody

  • dodáva prehľadnosť do kódu
  • podporuje veľa dátových typov (String, Boolean, Number, Date, Email, Phone, atď.)
  • podporuje validácie
  • podporuje klasické CRUD operácie save, get, delete a query
  • podporuje workflows
  • podporuje transformations
  • podporuje hooks
  • podporuje operations
  • podporuje lokalizácie
  • podporuje predvolené hodnoty
  • podporuje asynchrónne operácie (veľmi dôležitá funkcia)
  • vývojár sa môže vždy spoľahnúť na zadefinovaný dátový typ
  • ako dátový typ môže byť použitá iná schéma
  • má vstavený error handling (veľmi dôležitá funkcia)
  • na schému je možné napojiť routing
  • vlastnosti, ktoré nie sú definované v schéme, sú automaticky vymazané
  • a mnoho ďalšieho

Ukážka schémy

Ak začnete používať Total.js tak narazíte na množstvo divných názvov, ale postupne si určite zvyknete. Funkcia NEWSCHEMA() vytvorí novú schému a .make() vytvorí len privátny scope na deklaráciu schémy.

models/newsletter.js:

Takže vytvoril som schému Newsletter a túto schému teraz môžeme prepojiť s formulárom pre odoberanie noviniek emailom. V prípade, že do schémy pridú iné data, tak framework ich jednoducho odstráni, pretože sa nenachádzajú v schéme.

controllers/api.js:

Ďalšie špecialitky

Error Handling ErrorBuilder:

Považujem ho za veľmi dôležitú časť frameworku a podporuje skutočne zaujímavé funkcie. Môžete do neho vkladať rôzne chyby (aj viacej naraz), ďalej je prepojený s resources (podpora lokalizácie) a výstup môžete transformovať na čo len chcete (stačí zaregistrovať transformáciu a dokonca nami vytvorenú transformáciu môžete nastaviť ako predvolenú default). Chyby sa ukladajú do Array, pričom každá chyba musí mať svoj identifikátor. Zároveň pri automatickom validovaný v schémach ErrorBuilder obsahuje aj cestu k property, poprípade Array index, takže krásne viete zistiť pôvod chyby aj v rôznych vnorených schémách alebo v poli.

V predvolenom režime je výstup ErrorBuilder veľmi jednoduchý a framework vždy vracia pole:

Na client-side sa dá veľmi jednoducho overiť či data obsahujú chybu:

Následne podľa vlastností v poli name a path viete krásne označiť vo formulári, ktorých prvkov sa chyba týka. Moja filozofia prepojenia JSONovo server-side a client-side je v 2 podmienkach:

  • chyby zo servera sú vždy vracané ako Array (viď vyššie uvedený kód)
  • opak pola, čiže Object, String, Number, Boolean je považovaný za požadovanú response

Rozšírenie schémy:

Rozšíriť schému (narážam na modulárnosť) je veľmi jednoduché a možete to urobiť na hociktorom mieste v aplikácii:

Auto trim stringov:

Toto bol jeden skvelý nápad pridať do schém. V prípade, že Vám hodnody v string vlastnostiach obsahujú na začiatku a na konci biele znaky \n, \r, \s, \t - tak ich framework automaticky odstráni. Môžem Vám z úprimného srdca povedať, že od vtedy ako je toto implementované, mám čisté databázy (hodnotovo). Hodnoty v schéme sú automaticky trimované (by default) a toto správanie sa dá vypnúť cez property schema.trim = false.

Vnorené schémy:

Ďalšou skvelou funkciou sú vnorené schémy, pomocou ktorých môžete mať prepojené rôzne schémy/modely medzi sebou. Ako príklad uvediem objednávku a jej adresy:

Polia - Array:

Aj Array môžete zaevidovať ako dátový typ:

Asynchrónne operácie:

Podporujú toho oveľa viacej ako som popísal. Dynamicky viete upraviť volania, návratové hodnoty a dokonca každá inštancia schémy obsahuje skrytý objekt na zapisovanie ďalších potrebných (temporary) údajov. Tieto údaje sú jednotné skrz všetky asynchrónne operácie.

Validácie:

Total.js sa snaží ušetriť vývojárom kopec roboty a preto aj väčšina validácií je implementovaná v jadre. V prípade, že chcete vytvoriť validáciu na nejakú property v schéme tak budete postupovať takto:

Predvolené hodnoty:

Schémy podporujú aj metódu na vygenerovanie predvolených hodnôt. Takže v prípade, že sa generuje nová schéma tak je volaný nižšie uvedený delegát.

Meníme hodnoty ešte pred validáciou:

V prípade, že pred validáciou potrebujete upraviť ešte nejaké prijaté hodnoty v schéme, tak je možné využiť metódu podľa nižšie uvedeného kódu:

Schéma bez vlastností/fieldov? No problem

Sú prípady, kedy nepotrebujete definovať žiadne dátové typy / vlastnosti, proste potrebujete nejaký objekt, ktorý má nejaké metódy a v tomto prípade je k dispozícii workflows, transformations, operations, atď., príklad:

Vytvorenie objektu podľa schémy:

Nižšie uvedený kód vytvorý objekt podľa schémy s predvolenými hodnotami a zabalenými internými funkciami. Tento kód je možné volať v celom frameworku - v *.js súboroch.

Ako skúsiť schémy?

Nemusíte vytvárať projekt na to, aby ste skúsili schémy. Stačí vytvoriť jednoduchý .js script a odkázať sa na require('total.js').

Je toho ešte veľmi veľa čo obsahujú schémy, ale pre rýchly začiatok a predstavu to bude hádam postačovať. Pre vytvorenie schém je možné použiť aplikáciu AppDesigner.

Schémy v projektoch

Nižšie uvedené projekty sú postavené na schémach, takže ak chcete vidieť reálne projekty - tak doporučujem naštudovať tieto zdrojové kódy na GitHube: