Ak by mi niekto pred niekoľkými rokmi povedal, že príde čas, kedy sa budem zamýšľať nad navrhovými vzormi v JavaScripte (JS), tak by som mu asi veľmi neveril. Odvtedy som ale prešiel cez niekoľko projektov, ktoré JS používajú (na front-end ale aj na back-ende s Node.js) a minimálne jeden z nich je natoľko rozsiahly, že bez štrukúry a poriadného návrhu by pripomínal povestný Big ball of mud. Aj preto, akonáhle sa mi dostala do rúk kniha Mastering JavaScript Design Patterns od Simona Timmsa, vedel som, že to musím prečítať. Poďme sa teda na to pozrieť bližšie.
Tak v prvom rade vás možno napadne: JS a návrhové vzory? Ak si vezmete ako napríklad C++, Java, C#, to všetko sú jazyky, ktoré majú zapúzdrenie, dedenie a mnohé iné základné mechanizmy, ktoré vám umožnia budovať komplikovanejšie štruktúry (tak ako pomocou tehál a betónu viete vybudovať dom). Ale JS? Slabotypový jazyk bez zapuzdrenia, bez rozhraní a len prototypová dedičnosť, ktorej rozumie len zopár ľudí a používa ešte menej. Tak aké vzory?
No, kde je vôľa, tam je cesta. A vôľa je. V podstate to rozbehli SPA (Single Page Application) a napomohol tomu aj napríklad taký Node.JS. To všetko so sebou prinieslo veľké aplikácie v JS. A veľke aplikácie znamenajú veľkú vôľu štruktúrovať kód (aspoň tak by mal veliť pud sebazáchovy každého vývojára). Aj preto v ECMAScript 6 prichádzajú kľúčové slova class a module, ktoré plnia úlohu definovania triedy alebo modulu (ECMAScript je špecifikácia JS, podľa ktorej by ho prehliadače mali implementovať a verzia 6 je najbližia, ktorá by mala byť zavedená do praxe, na čo sa už verím tešíte so mnou). Na teraz je možné si pomôcť len tým, čo JS ponúka dnes.
Aj Simonova kniha na úvod najprv vysvetľuje prečo JS (kde sa používa a v čom je dobrý), prečo návrhové vzory a prečo návrhové vzory v JS. A tiež, že to nie je jednoduché bez potrebnej podpory od jazyka. Ale uvádza príklad ako sa s tým aspoň čiastočne vysporiadať (vytvoriť si niečo ako objekt so zapúzdrením). Potom až nasledujú kapitoly s návrhovými vzormi.
Ako prvá je klasika – vzory od GOF (Ganf of Four). Sám autor knihy pripúšťa, že nie úplne všetky majú veľký zmysel v JS, ale poctivo všetky preberie a ku každému pribalí úkážku implementácie. Nasleduje kapitola s Model View vzormi. Tu je opäť nejaký pekný teoretický úvod aj s históriou tejto rodiny vzorov (MVC, MVP, MVVM …). A nasledujú príklady. Treba povedať, že na jednej strane je veľmi pravdepodobné, že s týmito vzormi prídete do kontaktu pri vývoji JS front-endu. Ale na druhej strane je málo pravdepodobné, že ich budete implementovať – teda pripravovať infraštruktúru a pravidlá, na základe ktorých by vzor mal v aplikácii fungovať. Skôr už len používať a implementovať kód do pripravenej infraštruktúry. Je to preto, lebo programovať MVC vzor od základu pre JS front-end je tak trochu varenie teplej vody. Už teraz to za vás rieši AngularJS, EmberJS alebo BackboneJS a mnoho iných. Ale aj práve preto je dobré túto kapitolu prejsť a MVC (v kontexte JS) pochopiť.
Nasledujúca kapitola má názov Web patterns a pojednáva o vzoroch, ktoré priamo súvisia s vývojom webu. Napríklad Promise alebo Circuit breaker vzor. Ale ide aj do exotickejších oblastí (z pohľadu vzorov) a hovorí o spájaní a minifikácii JS súborov alebo o multithreadingu v JS prostredí. Nasledujú Messaging vzory a klasiky ako Request-reply alebo Publish-subscribe. To všetko opäť v prostredí JS. Ďalšia kapitola má názov Patterns for Testing a ako jej názov napovedá, hovorí o tom, ako písať testy, ale tiež o tom, ako písať kód, aby sa ľahko testoval. Posledná kapitola so vzormi je venovaná okrajovým témam ako napríklad makrám alebo aspektovo orientovanému programovaniu (Uf! … aspektovo orientované programovaniev JS? No, prečo nie…).
Záverom môžem povedať, že ak sa púšťate do projektu, ktorý používa JS vo veľkom, tak by ste si túto knihu mali niekde získať a prečítať. JS sa totiž často k človeku dostáva ako skriptovací jazyk, ktorý slúži na rôzne vylepšenia klienta a málokedy sa v takomto kontexte o ňom hovorí ako o jazyku návrhových vzorov. Aj preto sa môže jedného dňa stať, že dostanete zadanie vybudovať väčšiu JS aplikáciu a vy sa prekvapene zamyslíte, či je niečo také možné. A odpoveď je, že je možné to je, len treba mať dostatočne rozšírené obzory.