Keď som začal používať AngularJS framework, bral som ho ako framework postavený na MVC (Model-View-Controller) vzore. Teda všetka logika aplikácie by mala skončiť v jednej z týchto troch typov časti aplikácie. Vedel som, že Angular podporuje aj tzv. služby (a samotný framework ich obsahuje slušné množstvo), ale nebolo mi jasné, prečo by som ich mal používať, keďže na obchodnú (business) logiku aplikácie by mal slúžiť Controller. O to zvláštnejšie znela rada, s ktorou som sa stretol skoro v každom „Best practices“ ohľadom Angularu a to, že v Controlleri by malo byť minimum kódu a všetko, čo sa dá, treba presunúť do služieb. Ako to s tými službami vlastne je sa teraz pozrieme spolu s knihou AngularJS Services od Jima Lavina.
Na prvý pohľad by sa mohlo zdať, že Controllery a služby v Angulari si navzájom konkurujú. U oboch to totiž vyzerá, že ich úlohou je uchovávať kód, ktorý načítava, ukladá a spracováva údaje. Faktom ale je, že Controller má svoje presne vymedzené určenie a to je, po prvé prepojenie scopu (Modelu) a View a po druhé obsluha reakcie na vstup od používateľa (klik na tlačidlo, výber v rozbaľovacom poli atď.). To je všetko, čo by mal Controller robiť. Je to mimochodom presne to, čo mal Controller vždy definované už od úplného začiatku, kedy sa MVC objavilo (aj keď existuje viacero variácií MVC a v nich sa táto rola mierne upravuje). Ak je teda jasná úloha Controllera, tak čo je úloha služieb? Úlohou služieb je implementovať:
1. všetku komplikovanú logiku aplikácie (výpočty, vytváranie komplikovanejších dátových štruktúr…)
2. všetku logiku, ktorá má byť zdieľaná
3. komunikáciu s backendom
4. zakrývanie práce s rôznymi prostriedkami, ktoré má kód k dispozícii (ako napr. Web Storage)
5. riešenie cross-cutting aspektov aplikácie (logovanie, notifikácie)
Veľmi zjednodušene by sa dalo povedať, že do služieb ide všetko, čo sa nezmestí do MVC vzoru + direktív a filtrov. Tiež v podobnom duchu sa nesie prvá kapitola z knihy (s logickým názvom „The Need for Services“). Hneď v ďalšej kapitole nazvanej Designing Services už nájdeme návody ako navrhnúť dobrú službu. A tiež ako vytvoriť rozhranie ľahko pochopiteľné pre iných vývojárov a ľahko testovateľné. To s tou testovateľnosťou nie je náhoda. Služby majú oproti Controllerom aj tú výhodu, že sú ľahšie izolovateľné, a teda aj testovateľné. Aj preto by čo najviac kódu malo ísť do nich namiesto do Controllera. Okrem návrhu autor rozoberá aj päť rôznych metód, ktoré slúžia na vytvorenie služby:
1. constant – služba funguje skôr ako zoznam konštánt, ktoré sa nedajú meniť
2. value – kolekcia hodnôt, ktoré sa ale na rozdiel od konštánt dajú meniť
3. service – toto je odporúčané používať, ak máte vytvorené služby pomocu typ/trieda metodológie (služba bude vytvorená volaním metódy new)
4. factory – prípad, kedy sa nepoužíva metodológia typ/trieda, a keď nepotrebujem mať túto službu prístupnú v config metóde
5. provider – rovnaký prípad ako predchádzajúci, len okrem služby mam zaregistrovaný aj jej provider, ktorý viem získať v config metóde
Ďalšia kapitola pojednáva o testovaní. Angular používa koncept Dependency Injection, čo znamená, že pri testovaní je to hlavne o príprave mockov, ktoré budú injektované do testovaného objektu. Okrem toho je potrebné sa napríklad vysporiadať s mockovaním $http, $timer a $interval služieb. Asi najpoužívanejší Unit Test framework pre Angular je momentálne Jasmine, a preto sa autor venuje príkladom práve s týmto frameworkom.
V nasledujúcich kapitolách je rozoberané, ako vytvoriť správnu službu, ak je to cross-cutting služba (veľmi pekný a jednoduchý príklad služby ako implementácie publish/subscribe vzoru), ako vytvárať v Angulari dátové modely (niečo ako doménový model tvorený objektami, ktoré majú stav a správanie), a tiež príklad toho, ako cez služby integrovať do aplikácie externé služby tretích strán.
Pred záverečnou kapitolou s príkladom, kde je väčšina myšlienok z predchádzajúcich kapitol spojená do jedného príkladu, je ešte kapitola o implementácii obchodnej logiky. Tá ukazuje dva zaujímavé prípady implementácie stavového stroja na riadenie stavu aplikácie a stroja pravidiel (rules engine) na validáciu komplexných údajov. Obe samozrejeme ako Angular služby. Takéto vzory a ich implementácie môžu niekedy poslúžiť doslova ako záchranný pás, keď vám vaša aplikácia začne prerastať cez hlavu a staré, jednoduché riešenia, už nie sú schopné pokryť nové požiadavky.
Celkovo, služby v Angulari je niečo, čo nemôžete dlhodobo ignorovať. Ak tvoríte Angular aplikáciu, tak možno začínate v malom a služby sú koncept, ktorý kvôli začiatočnej rýchlosti a flexibilite môžete vypustiť. Ako sa ale aplikácia rozrastá a nabaľuje (čo aplikácie celkom bežne robia), vy zrazu narazíte na moment, že by ste potrebovali injektovať jeden Controller do druhého (čo sa dá, ale nie je to jednoduché a pre Angular ani prirodzené) alebo vaše Controllery začínajú vyzerať, že nemajú konca, tak je načase, aby ste začali o službách uvažovať. Ak plánujete veľkú aplikáciu už od začiatku, tak začať bez nich znamená riziko ich zavádzania v čase, kedy už budete mať množstvo kódu hotového a to nie je nikdy lacnejšie, ako keď to robíte od začiatku. Každopádne je dobré vedieť, čo to služby v Angulari sú, ako by mali vyzerať a čo všetko sa s nimi dá dosiahnuť. Ak chcete nejaký ucelený materiál o tejto téme, tak knihu AngularJS Service by ste určite mali zvážiť.