{"id":85,"date":"2016-05-03T19:19:57","date_gmt":"2016-05-03T17:19:57","guid":{"rendered":""},"modified":"2018-09-17T21:52:23","modified_gmt":"2018-09-17T19:52:23","slug":"sluzby-v-angularjs","status":"publish","type":"post","link":"https:\/\/spireng.sk\/en\/sluzby-v-angularjs\/","title":{"rendered":"Slu\u017eby v AngularJS"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"imgp_img\" style=\"float: left; margin: 2px 5px;\" src=\"\/sites\/default\/files\/imagepicker\/1\/safds654af6asd.jpg\" alt=\"Obr\u00e1zok\" width=\"200\" height=\"215\" \/>Ke\u010f som za\u010dal pou\u017e\u00edva\u0165 AngularJS framework, bral som ho ako framework postaven\u00fd na MVC (Model-View-Controller) vzore. Teda v\u0161etka logika aplik\u00e1cie by mala skon\u010di\u0165 v jednej z t\u00fdchto troch typov \u010dasti aplik\u00e1cie. Vedel som, \u017ee Angular podporuje aj tzv. slu\u017eby (a samotn\u00fd framework ich obsahuje slu\u0161n\u00e9 mno\u017estvo), ale nebolo mi jasn\u00e9, pre\u010do by som ich mal pou\u017e\u00edva\u0165, ke\u010f\u017ee na obchodn\u00fa (business) logiku aplik\u00e1cie by mal sl\u00fa\u017ei\u0165 Controller. O to zvl\u00e1\u0161tnej\u0161ie znela rada, s ktorou som sa stretol skoro v ka\u017edom \u201eBest practices\u201c oh\u013eadom Angularu a to, \u017ee v Controlleri by malo by\u0165 minimum k\u00f3du a v\u0161etko, \u010do sa d\u00e1, treba presun\u00fa\u0165 do slu\u017eieb. Ako to s t\u00fdmi slu\u017ebami vlastne je sa teraz pozrieme spolu s knihou <a href=\"http:\/\/www.bookdepository.com\/AngularJS-Services-Jim-Lavin\/9781783983568\">AngularJS Services<\/a> od Jima Lavina.<!--more--><\/p>\n<p><!--break-->Na prv\u00fd poh\u013ead by sa mohlo zda\u0165, \u017ee Controllery a slu\u017eby v Angulari si navz\u00e1jom konkuruj\u00fa. U oboch to toti\u017e vyzer\u00e1, \u017ee ich \u00falohou je uchov\u00e1va\u0165 k\u00f3d, ktor\u00fd na\u010d\u00edtava, uklad\u00e1 a spracov\u00e1va \u00fadaje. Faktom ale je, \u017ee Controller m\u00e1 svoje presne vymedzen\u00e9 ur\u010denie a to je, po prv\u00e9 prepojenie scopu (Modelu) a View a po druh\u00e9 obsluha reakcie na vstup od pou\u017e\u00edvate\u013ea (klik na tla\u010didlo, v\u00fdber v rozba\u013eovacom poli at\u010f.). To je v\u0161etko, \u010do by mal Controller robi\u0165. Je to mimochodom presne to, \u010do mal Controller v\u017edy definovan\u00e9 u\u017e od \u00fapln\u00e9ho za\u010diatku, kedy sa MVC objavilo (aj ke\u010f existuje viacero vari\u00e1ci\u00ed MVC a v nich sa t\u00e1to rola mierne upravuje). Ak je teda jasn\u00e1 \u00faloha Controllera, tak \u010do je \u00faloha slu\u017eieb? \u00dalohou slu\u017eieb je implementova\u0165:<\/p>\n<p>1. v\u0161etku komplikovan\u00fa logiku aplik\u00e1cie (v\u00fdpo\u010dty, vytv\u00e1ranie komplikovanej\u0161\u00edch d\u00e1tov\u00fdch \u0161trukt\u00far&#8230;)<\/p>\n<p>2. v\u0161etku logiku, ktor\u00e1 m\u00e1 by\u0165 zdie\u013ean\u00e1<\/p>\n<p>3. komunik\u00e1ciu s backendom<\/p>\n<p>4. zakr\u00fdvanie pr\u00e1ce s r\u00f4znymi prostriedkami, ktor\u00e9 m\u00e1 k\u00f3d k dispoz\u00edcii (ako napr. Web Storage)<\/p>\n<p>5. rie\u0161enie cross-cutting aspektov aplik\u00e1cie (logovanie, notifik\u00e1cie)<\/p>\n<p>Ve\u013emi zjednodu\u0161ene by sa dalo poveda\u0165, \u017ee do slu\u017eieb ide v\u0161etko, \u010do sa nezmest\u00ed do MVC vzoru + direkt\u00edv a filtrov. Tie\u017e v podobnom duchu sa nesie prv\u00e1 kapitola z knihy (s logick\u00fdm n\u00e1zvom \u201eThe Need for Services\u201c). Hne\u010f v \u010fal\u0161ej kapitole nazvanej Designing Services u\u017e n\u00e1jdeme n\u00e1vody ako navrhn\u00fa\u0165 dobr\u00fa slu\u017ebu. A tie\u017e ako vytvori\u0165 rozhranie \u013eahko pochopite\u013en\u00e9 pre in\u00fdch v\u00fdvoj\u00e1rov a \u013eahko testovate\u013en<span lang=\"sk-SK\">\u00e9. To s tou testovate\u013enos\u0165ou nie je n\u00e1hoda. Slu\u017eby maj\u00fa oproti Controllerom aj t\u00fa v\u00fdhodu, \u017ee s\u00fa \u013eah\u0161ie izolovate\u013en\u00e9, a teda aj testovate\u013en\u00e9. Aj preto by \u010do najviac k\u00f3du malo \u00eds\u0165 do nich namie<\/span><span lang=\"sk-SK\">s<\/span><span lang=\"sk-SK\">to do Controllera. Okrem n\u00e1vrh<\/span><span lang=\"sk-SK\">u<\/span><span lang=\"sk-SK\"> autor rozober\u00e1 aj p\u00e4\u0165 r\u00f4znych met\u00f3d, ktor\u00e9 sl<\/span><span lang=\"sk-SK\">\u00fa<\/span><span lang=\"sk-SK\">\u017eia na vytvorenie slu\u017eby:<\/span><\/p>\n<p>1. constant \u2013 slu\u017eba funguje sk\u00f4r ako zoznam kon\u0161t\u00e1nt, ktor\u00e9 sa nedaj\u00fa meni\u0165<\/p>\n<p>2. value \u2013 kolekcia hodn\u00f4t, ktor\u00e9 sa ale na rozdiel od kon\u0161t\u00e1nt daj\u00fa meni\u0165<\/p>\n<p><span lang=\"sk-SK\">3. service \u2013 toto je odpor\u00fa\u010dan\u00e9 pou\u017e\u00edva\u0165, ak m\u00e1te vytvoren\u00e9 slu\u017eby pomocu typ\/trieda metodol<\/span><span lang=\"sk-SK\">\u00f3<\/span><span lang=\"sk-SK\">gie (slu\u017eba bude vytvoren\u00e1 volan\u00edm met\u00f3dy <\/span><span lang=\"sk-SK\"><em>new<\/em><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">)<\/span><\/span><\/p>\n<p><span lang=\"sk-SK\"><span style=\"font-style: normal;\">4. factory \u2013 pr\u00edpad, kedy sa nepou\u017e\u00edva metodol<\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">\u00f3<\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">gi<\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">a<\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\"> typ\/trieda, a ke\u010f nepotrebujem ma\u0165 t\u00fato slu\u017ebu pr\u00edstupn\u00fa v <\/span><\/span><span lang=\"sk-SK\"><em>config<\/em><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\"> met\u00f3de<\/span><\/span><\/p>\n<p><span lang=\"sk-SK\"><span style=\"font-style: normal;\">5. provider \u2013 rovnak\u00fd pr\u00edpad ako predch\u00e1dzaj\u00faci, len okrem slu\u017eby mam zaregistrovan\u00fd aj jej provider, ktor\u00fd viem z\u00edska\u0165 v <\/span><\/span><span lang=\"sk-SK\"><em>config<\/em><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\"> met\u00f3de<\/span><\/span><\/p>\n<p><span lang=\"sk-SK\"><span style=\"font-style: normal;\">\u010eal\u0161ia kapitola pojedn\u00e1va o testovan\u00ed. <\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">Angular pou\u017e\u00edva koncept Dependency Injection, \u010do znamen\u00e1, \u017ee pri testovan\u00ed je to hlavne o pr\u00edprave mockov, ktor\u00e9 bud\u00fa injektovan\u00e9 do testovan\u00e9ho objektu. Okrem toho je potrebn\u00e9 sa napr\u00edklad vysporiada\u0165 s mockovan\u00edm $http, $timer a $interval slu\u017eieb. Asi najpou\u017e\u00edvanej\u0161\u00ed Unit Test framework pre Angul<\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">a<\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">r je moment\u00e1lne Jasmine, a preto sa autor venuje pr\u00edkladom pr\u00e1ve s t\u00fdmto frameworkom.<\/span><\/span><\/p>\n<p><span lang=\"sk-SK\"><span style=\"font-style: normal;\">V nasleduj\u00facich kapitol\u00e1ch je rozoberan\u00e9, ako vytvori\u0165 spr\u00e1vnu slu\u017ebu, ak je to cross-cutting slu\u017eba (ve\u013emi pekn\u00fd a jednoduch\u00fd pr\u00edklad slu\u017eby ako implement\u00e1cie publish\/subscribe vzoru), ako vytv\u00e1ra\u0165 v <\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">A<\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">ngulari d\u00e1tov\u00e9 modely (nie\u010do ako dom\u00e9nov\u00fd model tvor<\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">en<\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">\u00fd objektami, ktor\u00e9 maj\u00fa stav a spr\u00e1v<\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">a<\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">nie), a tie\u017e pr\u00edklad toho, ako cez slu\u017eby integrova\u0165 do aplik\u00e1cie extern\u00e9 slu\u017eby tret\u00edch str\u00e1n.<\/span><\/span><\/p>\n<p><span lang=\"sk-SK\"><span style=\"font-style: normal;\">Pred z\u00e1vere\u010dnou kapitolou s pr\u00edkladom, kde je v\u00e4\u010d\u0161ina my\u0161lienok z predch\u00e1dzaj\u00facich kapitol spojen\u00e1 do jedn\u00e9ho pr\u00edkladu, je e\u0161te kapitola o implement\u00e1cii obchodnej logiky. T\u00e1 ukazuje dva zauj\u00edmav\u00e9 pr\u00edpady implement\u00e1cie stavov\u00e9ho stroja na riadenie stavu aplik\u00e1cie a stroja pravidiel (rules engine) na valid\u00e1ciu komplexn\u00fdch \u00fadajov. Obe samozrejeme ako Angular slu\u017eby. Tak\u00e9to vzory a ich implement\u00e1cie m\u00f4\u017eu niekedy posl\u00fa\u017ei\u0165 doslova ako z\u00e1chrann\u00fd p\u00e1s, ke\u010f v\u00e1m va\u0161a aplik\u00e1cia za\u010dne prerasta\u0165 cez hlavu a <\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">star\u00e9, jednoduch\u00e9 rie\u0161enia, u\u017e nie s\u00fa schopn\u00e9 pokry\u0165 nov\u00e9 po\u017eiadavky.<\/span><\/span><\/p>\n<p><span lang=\"sk-SK\"><span style=\"font-style: normal;\">Celkovo, slu\u017eby v Angulari je nie\u010do, \u010do nem\u00f4\u017eete dlhodobo ignorova\u0165. Ak tvor\u00edte Angular aplik\u00e1ciu, tak mo\u017eno za\u010d\u00ednate v malom a slu\u017eby s\u00fa koncept, ktor\u00fd kv\u00f4li za\u010diato\u010dnej r\u00fdchlosti a flexibilite m\u00f4\u017eete vypusti\u0165. Ako sa ale aplik\u00e1cia rozrast\u00e1 a naba\u013euje (\u010do aplik\u00e1cie celkom be\u017ene robia), vy zrazu naraz\u00edte na moment, \u017ee by ste potrebovali injektova\u0165 jeden Controller do druh\u00e9ho (\u010do sa d\u00e1, ale nie je to jednoduch\u00e9 a pre Angular ani prirodzen\u00e9) alebo va\u0161e Controller<\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">y<\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\"> za\u010d\u00ednaj\u00fa vyzera\u0165, \u017ee nemaj\u00fa konca, tak je na\u010dase, aby ste za\u010dali o slu\u017eb\u00e1ch uva\u017eova\u0165. Ak pl\u00e1nujete ve\u013ek\u00fa aplik\u00e1ciu u\u017e od za\u010diatku, tak za\u010da\u0165 bez nich znamen\u00e1 riziko ich zav\u00e1dzania v \u010dase, kedy u\u017e budete ma\u0165 mno\u017estvo k\u00f3du hotov\u00e9ho a to nie je nikdy lacnej\u0161ie, ako ke\u010f to rob\u00edte od za\u010diatku. Ka\u017edop\u00e1dne je dobr\u00e9 vedie\u0165, \u010do to slu\u017eby v Angulari s\u00fa, ako by mali vyzera\u0165 a \u010do v\u0161etko sa <\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">s <\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">nimi d\u00e1 dosiahnu\u0165. Ak chcete nejak\u00fd ucelen\u00fd materi\u00e1l o tejto t\u00e9me, tak knihu Angul<\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">a<\/span><\/span><span lang=\"sk-SK\"><span style=\"font-style: normal;\">rJS Service by ste ur\u010dite mali zv\u00e1\u017ei\u0165.<\/span><\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>Ke\u010f som za\u010dal pou\u017e\u00edva\u0165 AngularJS framework, bral som ho ako framework postaven\u00fd na MVC (Model-View-Controller) vzore. Teda v\u0161etka logika aplik\u00e1cie by mala skon\u010di\u0165 v jednej z t\u00fdchto troch typov \u010dasti aplik\u00e1cie. Vedel som, \u017ee Angular podporuje aj tzv. slu\u017eby (a samotn\u00fd framework ich obsahuje slu\u0161n\u00e9 mno\u017estvo), ale nebolo mi jasn\u00e9, pre\u010do by som ich mal [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-85","post","type-post","status-publish","format-standard","hentry","category-vyvoj-softveru"],"_links":{"self":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/85","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/comments?post=85"}],"version-history":[{"count":2,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/85\/revisions"}],"predecessor-version":[{"id":148,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/85\/revisions\/148"}],"wp:attachment":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/media?parent=85"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/categories?post=85"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/tags?post=85"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}