{"id":34828,"date":"2019-10-31T22:00:38","date_gmt":"2019-10-31T19:00:38","guid":{"rendered":"https:\/\/prohoster.info\/blog\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya\/"},"modified":"2019-10-31T22:00:38","modified_gmt":"2019-10-31T19:00:38","slug":"single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","title":{"rendered":"Princip jedn\u00e9 odpov\u011bdnosti. Nen\u00ed tak jednoduch\u00fd, jak se zd\u00e1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Princip jedn\u00e9 odpov\u011bdnosti. Nen\u00ed tak jednoduch\u00fd, jak se zd\u00e1\" src=\"\/wp-content\/uploads\/2019\/06\/5b253ff55e3c97b6baf5f7a7ae7f3b98.JPG\" style=\"display:block;margin: 0 auto;\" \/> Princip jedn\u00e9 odpov\u011bdnosti, tak\u00e9 zn\u00e1m\u00fd jako princip jedin\u00e9 odpov\u011bdnosti,<br \/>\ntak\u00e9 naz\u00fdvan\u00fd princip jedin\u00e9 zm\u011bny \u2013 je velmi kluzk\u00fd pro pochopen\u00ed a nerv\u00f3zn\u00ed t\u00e9ma na pohovoru pro program\u00e1tora. <\/p>\n<p><\/p>\n<p>Moje prvn\u00ed v\u00e1\u017en\u00e9 sezn\u00e1men\u00ed s t\u00edmto principem se uskute\u010dnilo na za\u010d\u00e1tku prvn\u00edho ro\u010dn\u00edku, kdy n\u00e1s mlad\u00e9 a nezku\u0161en\u00e9 vzali do lesa, abychom se z larev student\u016f stali skute\u010dn\u00fdmi studenty.<\/p>\n<p><\/p>\n<p>V lese n\u00e1s rozd\u011blili do skupin po 8-9 lidech a uspo\u0159\u00e1dali sout\u011b\u017e \u2013 kter\u00e1 skupina rychleji vypije l\u00e1hev vodky, p\u0159i\u010dem\u017e prvn\u00ed \u010dlov\u011bk ze skupiny nal\u00e9v\u00e1 vodku do sklenice, druh\u00fd vypije a t\u0159et\u00ed zakousne. \u00da\u010dastn\u00edk, kter\u00fd dokon\u010d\u00ed svou \u00falohu, se postav\u00ed na konec fronty skupiny. <\/p>\n<p><\/p>\n<p>P\u0159\u00edpad, kdy je po\u010det ve front\u011b d\u011bliteln\u00fd t\u0159emi, byl dobrou implementac\u00ed SRP.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <\/p>\n<h2 id=\"opredelenie-1-edinaya-otvetstvennost\">Definice 1. Jedin\u00e1 odpov\u011bdnost.<\/h2>\n<p><\/p>\n<p>Ofici\u00e1ln\u00ed definice principu jedin\u00e9 odpov\u011bdnosti (SRP) \u0159\u00edk\u00e1, \u017ee ka\u017ed\u00fd objekt m\u00e1 svou odpov\u011bdnost a d\u016fvod existence a \u017ee tato odpov\u011bdnost je pouze jedna.<\/p>\n<p><\/p>\n<p>Zva\u017eme objekt &#171;Vyp\u00edcha&#187; (<strong>Tippler<\/strong>).<br \/>\nAbychom dodr\u017eeli princip SRP, rozd\u011bl\u00edme \u00fakoly na t\u0159i: <\/p>\n<p><\/p>\n<ul>\n<li>Jeden nal\u00e9v\u00e1 (<strong>PourOperation<\/strong>)<\/li>\n<li>Jeden vypije (<strong>DrinkUpOperation<\/strong>)<\/li>\n<li>Jeden zakousne (<strong>TakeBiteOperation<\/strong>)<\/li>\n<\/ul>\n<p><\/p>\n<p>Ka\u017ed\u00fd z \u00fa\u010dastn\u00edk\u016f procesu odpov\u00edd\u00e1 za jednu slo\u017eku procesu, tj. m\u00e1 jednu atom\u00e1rn\u00ed odpov\u011bdnost \u2013 vyp\u00edt, nal\u00edt nebo zakousnout. <\/p>\n<p><\/p>\n<p>Vypija\u010d je zase fas\u00e1dou pro tato data:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class Tippler {\n    \/\/...\n    void Act(){\n        _pourOperation.Do() \/\/ nal\u00edt\n        _drinkUpOperation.Do() \/\/ vyp\u00edt\n        _takeBiteOperation.Do() \/\/ zakousnout\n    }\n}<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Princip jedn\u00e9 odpov\u011bdnosti. Nen\u00ed tak jednoduch\u00fd, jak se zd\u00e1\" src=\"\/wp-content\/uploads\/2019\/06\/8d591a474e3555edfee3ffebc28d079b.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4 id=\"zachem\">Pro\u010d?<\/h4>\n<p><\/p>\n<p>\u010clov\u011bk-program\u00e1tor p\u00ed\u0161e k\u00f3d pro \u010dlov\u011bka-opici, a \u010dlov\u011bk-opice je nepozorn\u00fd, hloup\u00fd a neust\u00e1le n\u011bkam sp\u011bch\u00e1. M\u016f\u017ee udr\u017eet a pochopit asi 3 a\u017e 7 term\u00edn\u016f najednou.<br \/>\nV p\u0159\u00edpad\u011b vypija\u010de jsou tyto term\u00edny t\u0159i. Pokud ale nap\u00ed\u0161eme k\u00f3d jako jedinou plachtu, objev\u00ed se v n\u011bm ruce, sklenice, rva\u010dky a nekone\u010dn\u00e9 spory o politice. A to v\u0161echno bude v t\u011ble jedn\u00e9 metody. Jsem si jist\u00fd, \u017ee jste takov\u00fd k\u00f3d vid\u011bli ve sv\u00e9 praxi. Nen\u00ed to nejhum\u00e1nn\u011bj\u0161\u00ed zkou\u0161ka pro psychiku.<\/p>\n<p><\/p>\n<p>Na druh\u00e9 stran\u011b je \u010dlov\u011bk-opice zam\u011b\u0159en na modelov\u00e1n\u00ed objekt\u016f skute\u010dn\u00e9ho sv\u011bta ve sv\u00e9 mysli. Ve sv\u00e9 p\u0159edstav\u011b je m\u016f\u017ee nar\u00e1\u017eet, skl\u00e1dat z nich nov\u00e9 objekty a stejn\u011b tak je rozeb\u00edrat. P\u0159edstavte si star\u00fd model auta. M\u016f\u017eete si ve sv\u00e9 hlav\u011b otev\u0159\u00edt dve\u0159e, od\u0161roubovat \u010daloun\u011bn\u00ed dve\u0159\u00ed a vid\u011bt tam mechanismy okenn\u00edch zved\u00e1k\u016f, uvnit\u0159 nich\u017e budou ozuben\u00e1 kola. Ale nem\u016f\u017eete vid\u011bt v\u0161echny komponenty auta najednou, v jednom &#171;seznamu&#187;. Minim\u00e1ln\u011b &#171;\u010dlov\u011bk-opice&#187; to nedok\u00e1\u017ee.<\/p>\n<p><\/p>\n<p>Proto program\u00e1to\u0159i-dekompozito\u0159i rozkl\u00e1daj\u00ed slo\u017eit\u00e9 mechanismy na sou\u010d\u00e1sti m\u00e9n\u011b slo\u017eit\u00e9 a funk\u010dn\u00ed. Nicm\u00e9n\u011b dekompozice m\u016f\u017ee b\u00fdt r\u016fzn\u00e1: ve spoust\u011b star\u00fdch aut vede vzduchovod do dve\u0159\u00ed, zat\u00edmco v modern\u00edch vozech selh\u00e1n\u00ed elektroniky z\u00e1mku br\u00e1n\u00ed nastartov\u00e1n\u00ed motoru, co\u017e zp\u016fsobuje probl\u00e9my p\u0159i oprav\u011b.<\/p>\n<p><\/p>\n<p>A tak je to, <strong>SRP \u2014 to je princip, kter\u00fd vysv\u011btluje JAK dekomponovat, tedy kde ud\u011blat \u010d\u00e1ru rozd\u011blen\u00ed.<\/strong>. <\/p>\n<p><\/p>\n<p>\u0158\u00edk\u00e1, \u017ee je t\u0159eba dekomponovat podle principu rozd\u011blen\u00ed &#171;odpov\u011bdnosti&#187;, tedy podle \u00fakol\u016f t\u011bch \u010di on\u011bch objekt\u016f.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Princip jedn\u00e9 odpov\u011bdnosti. Nen\u00ed tak jednoduch\u00fd, jak se zd\u00e1\" src=\"\/wp-content\/uploads\/2019\/06\/b1980c3dc9742b921eb818f14fe3527e.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Vra\u0165me se k opilci a v\u00fdhod\u00e1m, kter\u00e9 z\u00edsk\u00e1v\u00e1 \u010dlov\u011bk-opice p\u0159i dekompozici: <\/p>\n<p><\/p>\n<ul>\n<li>K\u00f3d se stal naprosto jasn\u00fdm na ka\u017ed\u00e9 \u00farovni.<\/li>\n<li>K\u00f3d mohou ps\u00e1t najednou t\u0159i r\u016fzn\u00ed program\u00e1to\u0159i (ka\u017ed\u00fd p\u00ed\u0161e samostatn\u00fd prvek).<\/li>\n<li>Uleh\u010duje automatizovan\u00e9 testov\u00e1n\u00ed \u2014 \u010d\u00edm jednodu\u0161\u0161\u00ed je prvek, t\u00edm snaz\u0161\u00ed je jeho testov\u00e1n\u00ed.<\/li>\n<li>Objevuje se kompozicionalita k\u00f3du \u2014 m\u016f\u017eete vym\u011bnit. <strong>DrinkUpOperation<\/strong> za operaci, p\u0159i kter\u00e9 opilec vyl\u00e9v\u00e1 tekutinu pod st\u016fl. Nebo vym\u011bnit operaci nal\u00e9v\u00e1n\u00ed za operaci, p\u0159i kter\u00e9 m\u00edch\u00e1te v\u00edno a vodu nebo vodku a pivo. V z\u00e1vislosti na po\u017eadavc\u00edch firmy m\u016f\u017eete d\u011blat cokoliv, p\u0159i\u010dem\u017e se nedot\u00fdk\u00e1te k\u00f3du metody. <strong>Tippler.Act<\/strong>. <\/li>\n<li>Z t\u011bchto operac\u00ed m\u016f\u017eete slo\u017eit ob\u017eeru (pouze pomoc\u00ed. <strong>TakeBitOperation<\/strong>), Alkoholika (pouze pomoc\u00ed. <strong>DrinkUpOperation<\/strong> p\u0159\u00edmo z l\u00e1hve) a uspokojit mnoho dal\u0161\u00edch podnikov\u00fdch po\u017eadavk\u016f.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>(Och, zd\u00e1 se, \u017ee to u\u017e je princip OCP, a poru\u0161il jsem odpov\u011bdnost tohoto p\u0159\u00edsp\u011bvku.) <\/em><\/p>\n<p><\/p>\n<p>A samoz\u0159ejm\u011b tak\u00e9 nev\u00fdhody: <\/p>\n<p><\/p>\n<ul>\n<li>Bude nutn\u00e9 vytvo\u0159it v\u00edce typ\u016f. <\/li>\n<li>Opilec poprv\u00e9 vypije o p\u00e1r hodin pozd\u011bji, ne\u017e by mohl.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"opredelenie-2-edinaya-izmenchivost\">Definice 2. Jednotn\u00e1 variabilita.<\/h2>\n<p><\/p>\n<p>Dovolte, p\u00e1nov\u00e9! T\u0159\u00edda vyp\u00edcha p\u0159ece tak\u00e9 vykon\u00e1v\u00e1 jedinou zodpov\u011bdnost \u2014 vyp\u00edt! A v\u016fbec, slovo &#171;odpov\u011bdnost&#187; je pojmem krajn\u011b rozmazan\u00fdm. N\u011bkdo je zodpov\u011bdn\u00fd za osud lidstva, a n\u011bkdo je zodpov\u011bdn\u00fd za zved\u00e1n\u00ed p\u0159evr\u017een\u00fdch tu\u010d\u0148\u00e1k\u016f na p\u00f3lu.<\/p>\n<p><\/p>\n<p>Pod\u00edvejme se na dv\u011b realizace opilce. Prvn\u00ed, zm\u00edn\u011bn\u00e1 v\u00fd\u0161e, obsahuje t\u0159i t\u0159\u00eddy \u2013 nal\u00edt, vyp\u00edt a zakousnout.<\/p>\n<p><\/p>\n<p>Druh\u00e1 je naps\u00e1na metodologi\u00ed &#171;Dop\u0159edu a jen dop\u0159edu&#187; a obsahuje ve\u0161kerou logiku v metod\u011b. <strong>Act<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">\/\/\u041d\u0435 \u0442\u0440\u0430\u0442\u044c\u0442\u0435 \u0432\u0440\u0435\u043c\u044f  \u043d\u0430 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u041b\u0443\u0447\u0448\u0435 \u0441\u044a\u0435\u0448\u044c\u0442\u0435 \u043f\u0435\u0447\u0435\u043d\u044c\u043a\u0443\n\u0441lass BrutTippler {\n   \/\/...\n   void Act(){\n        \/\/ \u043d\u0430\u043b\u0438\u0432\u0430\u0435\u043c\n    if(!_hand.TryDischarge(from:_bottle, to:_glass, size:_glass.Capacity))\n        throw new OverdrunkException();\n\n    \/\/ \u0432\u044b\u043f\u0438\u0432\u0430\u0435\u043c\n    if(!_hand.TryDrink(from: _glass,  size: _glass.Capacity))\n        throw new OverdrunkException();\n\n    \/\/\u0417\u0430\u043a\u0443\u0441\u044b\u0432\u0430\u0435\u043c\n    for(int i = 0; i&lt; 3; i++){\n        var food = _foodStore.TakeOrDefault();\n        if(food==null)\n            throw new FoodIsOverException();\n\n        _hand.TryEat(food);\n    }\n   }\n}<\/code><\/pre>\n<p><\/p>\n<p>Ob\u011b tyto t\u0159\u00eddy, z pohledu nez\u00e1visl\u00e9ho pozorovatele, vypadaj\u00ed naprosto identicky a vykon\u00e1vaj\u00ed jedinou odpov\u011bdnost &#171;vyp\u00edt&#187;. <\/p>\n<p><\/p>\n<p>Trapnost!<\/p>\n<p><\/p>\n<p>Pak se vrhneme na internet a zjist\u00edme jin\u00e9 definice SRP \u2013 Princip jedin\u00e9 m\u011bnitelnosti (Single Changeability Principle).<\/p>\n<p><\/p>\n<p>SCP prav\u00ed, \u017ee &#171;<strong>Modul m\u00e1 jeden a pouze jeden d\u016fvod ke zm\u011bn\u011b<\/strong>&#171;. To znamen\u00e1 &#171;Odpov\u011bdnost \u2014 to je d\u016fvod ke zm\u011bn\u011b&#187;. <\/p>\n<p><\/p>\n<p><em>(Zd\u00e1 se, \u017ee kluci, kte\u0159\u00ed vymysleli p\u016fvodn\u00ed definici, byli p\u0159esv\u011bd\u010deni o telepatick\u00fdch schopnostech \u010dlov\u011bka-opice.)<\/em><\/p>\n<p><\/p>\n<p>Te\u010f u\u017e v\u0161e za\u010d\u00edn\u00e1 d\u00e1vat smysl. Samostatn\u011b m\u016f\u017eeme m\u011bnit procesy nal\u00e9v\u00e1n\u00ed, pit\u00ed a zakousnut\u00ed, a v samotn\u00e9m opilci m\u016f\u017eeme m\u011bnit jen po\u0159ad\u00ed a slo\u017een\u00ed operac\u00ed, nap\u0159\u00edklad p\u0159esunut\u00edm zakousnut\u00ed p\u0159ed pit\u00edm nebo p\u0159id\u00e1n\u00edm \u010detby p\u0159\u00edpitku.<\/p>\n<p><\/p>\n<p>V p\u0159\u00edstupu &#171;Dop\u0159edu a jen dop\u0159edu&#187; se v\u0161e, co lze zm\u011bnit \u2014 m\u011bn\u00ed pouze v metod\u011b. <strong>Act<\/strong>. To m\u016f\u017ee b\u00fdt \u010diteln\u00e9 a efektivn\u00ed, kdy\u017e je logika mal\u00e1 a m\u011bn\u00ed se z\u0159\u00eddka, ale \u010dasto to kon\u010d\u00ed hrozn\u00fdmi metodami po 500 \u0159\u00e1dc\u00edch v ka\u017ed\u00e9m, s po\u010dtem if-\u016f v\u011bt\u0161\u00edm, ne\u017e je pot\u0159eba pro vstup Ruska do NATO. <\/p>\n<p><\/p>\n<h2 id=\"opredelenie-3-lokalizaciya-izmeneniy\">Definice 3. Lokalizace zm\u011bn.<\/h2>\n<p><\/p>\n<p>Opilci \u010dasto nech\u00e1pou, pro\u010d se probudili v ciz\u00edm byt\u011b, nebo kde maj\u00ed sv\u016fj mobil. P\u0159i\u0161el \u010das p\u0159idat podrobnou logov\u00e1n\u00ed.<\/p>\n<p><\/p>\n<p>Za\u010dneme logov\u00e1n\u00ed procesem nal\u00e9v\u00e1n\u00ed:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class PourOperation: IOperation{\n    PourOperation(ILogger log \/*....*\/){\/*...*\/}\n    \/\/...\n    void Do(){\n        _log.Log($\"P\u0159ed nalit\u00edm s {_hand} a {_bottle}\");\n        \/\/Piti obchodn\u00ed logika ...\n        _log.Log($\"Po nalit\u00ed s {_hand} a {_bottle}\");\n    }\n}<\/code><\/pre>\n<p><\/p>\n<p>Zabal\u00edme ji do <strong>PourOperation<\/strong>, postupovali jsme moud\u0159e z hlediska odpov\u011bdnosti a enkapsulace, ale m\u00e1me nyn\u00ed probl\u00e9m s principem prom\u011bnlivosti. Vedle samotn\u00e9 operace, kter\u00e1 se m\u016f\u017ee m\u011bnit, se st\u00e1v\u00e1 prom\u011bnliv\u00fdm tak\u00e9 samotn\u00e9 logov\u00e1n\u00ed. Budeme muset rozd\u011blit a vytvo\u0159it speci\u00e1ln\u00ed logova\u010d pro operaci nal\u00e9v\u00e1n\u00ed:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">interface IPourLogger{\n    void LogBefore(IHand, IBottle){}\n    void LogAfter(IHand, IBottle){}\n    void OnError(IHand, IBottle, Exception){}\n}\n\nclass PourOperation: IOperation{\n    PourOperation(IPourLogger log \/*....*\/){\/*...*\/}\n    \/\/...\n    void Do(){\n        _log.LogBefore(_hand, _bottle);\n        try{\n             \/\/... business logic\n             _log.LogAfter(_hand, _bottle);\n        }\n        catch(Exception e){\n            _log.OnError(_hand, _bottle, e);\n        }\n    }\n}<\/code><\/pre>\n<p><\/p>\n<p>Pe\u010dliv\u00fd \u010dten\u00e1\u0159 si v\u0161imne, \u017ee <strong>LogAfter<\/strong>, <strong>LogBefore<\/strong> a <strong>OnError<\/strong> tak\u00e9 se mohou m\u011bnit samostatn\u011b, a analogicky k p\u0159edchoz\u00edm akc\u00edm vytvo\u0159\u00ed t\u0159i t\u0159\u00eddy: <strong>PourLoggerBefore<\/strong>, <strong>PourLoggerAfter<\/strong> a <strong>PourErrorLogger<\/strong>.<\/p>\n<p><\/p>\n<p>A kdy\u017e si vzpomeneme, \u017ee operac\u00ed pro nal\u00e9v\u00e1n\u00ed je t\u0159i \u2013 dostaneme dev\u011bt t\u0159\u00edd logov\u00e1n\u00ed. Nakonec cel\u00fd syst\u00e9m nal\u00e9v\u00e1n\u00ed se skl\u00e1d\u00e1 ze 14 (!!!) t\u0159\u00edd.<\/p>\n<p><\/p>\n<p>Hyperbola? Sotva! \u010clov\u011bk-opice s dekompozi\u010dn\u00ed gran\u00e1tou rozbije \u201enal\u00e9va\u010de\u201c na karafu, sklenici, oper\u00e1tory nal\u00e9v\u00e1n\u00ed, servis dod\u00e1vky vody, fyzik\u00e1ln\u00ed model sr\u00e1\u017eky molekul a v p\u0159\u00ed\u0161t\u00edm \u010dtvrtlet\u00ed se bude sna\u017eit rozpl\u00e9st z\u00e1vislosti bez glob\u00e1ln\u00edch prom\u011bnn\u00fdch. A v\u011b\u0159te, \u017ee se nezastav\u00ed.<\/p>\n<p><\/p>\n<p>Pr\u00e1v\u011b na tomto m\u00edst\u011b mnoz\u00ed p\u0159ich\u00e1zej\u00ed k z\u00e1v\u011bru, \u017ee SRP \u2014 to jsou poh\u00e1dky z r\u016f\u017eov\u00fdch kr\u00e1lovstv\u00ed, a odch\u00e1zej\u00ed vym\u00fd\u0161let nesmysly&#8230;<\/p>\n<p><\/p>\n<p>\u2026 ani\u017e by se dozv\u011bd\u011bli o existenci t\u0159et\u00edho vymezen\u00ed Srp: <\/p>\n<p><\/p>\n<p>&#171;Princip jedin\u00e9 odpov\u011bdnosti \u0159\u00edk\u00e1, \u017ee <strong>podobn\u00e9 v\u011bci, kter\u00e9 pot\u0159ebuj\u00ed zm\u011bnu, by m\u011bly b\u00fdt uchov\u00e1v\u00e1ny na jednom m\u00edst\u011b<\/strong>&#171;. nebo \u201c<strong>To, co se m\u011bn\u00ed spole\u010dn\u011b, by m\u011blo b\u00fdt uchov\u00e1v\u00e1no na jednom m\u00edst\u011b.<\/strong>\u201d<\/p>\n<p><\/p>\n<p>To znamen\u00e1, \u017ee pokud m\u011bn\u00edme logov\u00e1n\u00ed operace, m\u011bli bychom to m\u011bnit na jednom m\u00edst\u011b.<\/p>\n<p><\/p>\n<p>To je velmi d\u016fle\u017eit\u00fd moment \u2014 proto\u017ee v\u0161echna vysv\u011btlen\u00ed SRP, kter\u00e1 byla v\u00fd\u0161e, \u0159\u00edkala, \u017ee je t\u0159eba rozd\u011blovat typy, dokud se rozd\u011bluj\u00ed, tedy ukl\u00e1dala &#171;horn\u00ed omezen\u00ed&#187; na velikost objektu, a nyn\u00ed se ji\u017e mluv\u00ed i o doln\u00edm &#171;omezen\u00ed&#187;. Jin\u00fdmi slovy, <strong>SRP nejen vy\u017eaduje &#171;roz\u010dle\u0148ovat, dokud se roz\u010dle\u0148uje&#187;, ale tak\u00e9 se nep\u0159ehnat \u2014 &#171;nep\u0159e\u0161kat r\u016fzn\u00e9 v\u011bci&#187;<\/strong>. To je velk\u00fd souboj Ockhamovy b\u0159itvy s \u010dlov\u011bkem-opic\u00ed!<\/p>\n<p>\n<img decoding=\"async\" alt=\"Princip jedn\u00e9 odpov\u011bdnosti. Nen\u00ed tak jednoduch\u00fd, jak se zd\u00e1\" src=\"\/wp-content\/uploads\/2019\/06\/2e349a5b119a511d716341f3f6725844.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nyn\u00ed by m\u011blo b\u00fdt pro nal\u00e9va\u010de snaz\u0161\u00ed. Krom\u011b toho, \u017ee nen\u00ed nutn\u00e9 rozd\u011blovat logova\u010d IPourLogger na t\u0159i t\u0159\u00eddy, m\u016f\u017eeme tak\u00e9 spojit v\u0161echny logova\u010de do jednoho typu:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class OperationLogger{\n    public OperationLogger(string operationName){\n\/*..*\/}\n    public void LogBefore(object[] args){\n\/*...*\/}\n    public void LogAfter(object[] args){\n\/*..*\/}\n    public void LogError(object[] args, exception e){\n\/*..*\/}\n}<\/code><\/pre>\n<p><\/p>\n<p>A pokud se n\u00e1m p\u0159id\u00e1 \u010dtvrt\u00fd typ operace, je pro n\u011bj ji\u017e p\u0159ipraveno logov\u00e1n\u00ed. A k\u00f3d samotn\u00fdch operac\u00ed je \u010dist\u00fd a zbaven\u00fd infrastrukturn\u00edho \u0161umu.<\/p>\n<p><\/p>\n<p>V d\u016fsledku m\u00e1me 5 t\u0159\u00edd pro \u0159e\u0161en\u00ed \u00fakolu vyl\u00e9v\u00e1n\u00ed:<\/p>\n<p><\/p>\n<ul>\n<li>Operace nal\u00e9v\u00e1n\u00ed<\/li>\n<li>Operace vyl\u00e9v\u00e1n\u00ed<\/li>\n<li>Operace zakusov\u00e1n\u00ed<\/li>\n<li>Logova\u010d<\/li>\n<li>Fas\u00e1da pijana<\/li>\n<\/ul>\n<p><\/p>\n<p>Ka\u017ed\u00fd z nich odpov\u00edd\u00e1 striktn\u011b za jednu funk\u010dnost, m\u00e1 jeden d\u016fvod pro zm\u011bnu. V\u0161echna podobn\u00e1 pravidla pro zm\u011bny le\u017e\u00ed bl\u00edzko sebe. <\/p>\n<p>\n<b class=\"spoiler_title\">P\u0159\u00edklad z re\u00e1ln\u00e9ho \u017eivota<\/b><\/p>\n<p>Jednou jsme psali slu\u017ebu automatick\u00e9 registrace b2b klienta. A objevil se GOD -metoda o 200 \u0159\u00e1dc\u00edch podobn\u00e9ho obsahu:<\/p>\n<p><\/p>\n<ul>\n<li>Jdi do 1C a zalo\u017e \u00fa\u010det<\/li>\n<li>S t\u00edmto \u00fa\u010dtem jdi k platebn\u00edmu modulu a zalo\u017e ho tam<\/li>\n<li>Zkontroluj, \u017ee \u00fa\u010det s t\u00edmto \u010d\u00edslem nen\u00ed vytvo\u0159en v hlavn\u00edm <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/cs\/server\/dts-dronten\/\"   title=\"serveru\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2485\">serveru<\/a><\/li>\n<li>Vytvo\u0159 nov\u00fd \u00fa\u010det<\/li>\n<li>V\u00fdsledek registrace v platebn\u00edm modulu a \u010d\u00edslo 1c p\u0159idej do slu\u017eby v\u00fdsledk\u016f registrace<\/li>\n<li>P\u0159idej do t\u00e9to tabulky informace o \u00fa\u010dtu<\/li>\n<li>Vytvo\u0159 \u010d\u00edslo bodu pro tohoto klienta v servisn\u00edm bod\u011b. P\u0159edej do tohoto servisu \u010d\u00edslo \u00fa\u010dtu 1c.<\/li>\n<\/ul>\n<p><\/p>\n<p>A bylo v tomto seznamu je\u0161t\u011b asi 10 obchodn\u00edch operac\u00ed s d\u011bsivou prov\u00e1zanost\u00ed. Objekt \u00fa\u010dtu pot\u0159eboval t\u00e9m\u011b\u0159 ka\u017ed\u00fd. Identifik\u00e1tor bodu a jm\u00e9no klienta byly pot\u0159eba v polovin\u011b vol\u00e1n\u00ed.<\/p>\n<p><\/p>\n<p>Po hodinov\u00e9 refaktorizaci jsme dok\u00e1zali odd\u011blit infrastrukturn\u00ed k\u00f3d a n\u011bkter\u00e9 nuance pr\u00e1ce s \u00fa\u010dtem do samostatn\u00fdch metod\/t\u0159\u00edd. God metoda zhubla, ale z\u016fstalo 100 \u0159\u00e1dk\u016f k\u00f3du, kter\u00e9 se necht\u011bly rozpl\u00e9st. <\/p>\n<p><\/p>\n<p>Teprve po n\u011bkolika dnech p\u0159i\u0161lo pochopen\u00ed, \u017ee podstatou t\u00e9to &#171;ulevov\u00e9&#187; metody je obchodn\u00ed algoritmus. A \u017ee p\u016fvodn\u00ed popis TDK byl dost slo\u017eit\u00fd. A p\u0159esn\u011b pokus o rozd\u011blen\u00ed tohoto postupu na kusy by byl poru\u0161en\u00edm SRP, a ne naopak. <\/p>\n<p><\/p>\n<h2 id=\"formalizm\">Formalismus.<\/h2>\n<p><\/p>\n<p>P\u0159i\u0161el \u010das nechat na\u0161eho pijana na pokoji. Ut\u0159ete slzy \u2014 ur\u010dit\u011b se k n\u011bmu n\u011bkdy vr\u00e1t\u00edme. A te\u010f formalizujeme znalosti z tohoto \u010dl\u00e1nku. <\/p>\n<p><\/p>\n<h4 id=\"formalizm-1-opredelenie-srp\">Formalismus 1. Definice SRP<\/h4>\n<p><\/p>\n<ol>\n<li>Rozd\u011blujte prvky tak, aby ka\u017ed\u00fd z nich byl odpov\u011bdn\u00fd za n\u011bco jednoho.<\/li>\n<li>Odpov\u011bdnost se vykl\u00e1d\u00e1 jako \u201ed\u016fvod pro zm\u011bnu\u201c. To znamen\u00e1, \u017ee ka\u017ed\u00fd prvek m\u00e1 pouze jeden d\u016fvod pro zm\u011bnu, v term\u00ednech obchodn\u00ed logiky.<\/li>\n<li>Potenci\u00e1ln\u00ed zm\u011bny obchodn\u00ed logiky by m\u011bly b\u00fdt lokalizov\u00e1ny. Zm\u011bniteln\u00e9 synchronn\u00ed prvky by m\u011bly b\u00fdt vedle sebe.<\/li>\n<\/ol>\n<p><\/p>\n<h4 id=\"formalizm-2-neobhodimye-kriterii-samoproverki\">Formalismus 2. Nezbytn\u00e1 krit\u00e9ria sebehodnocen\u00ed.<\/h4>\n<p><\/p>\n<p>Nesetkal jsem se s dostate\u010dn\u00fdmi krit\u00e9rii spln\u011bn\u00ed SRP. Existuj\u00ed v\u0161ak nezbytn\u00e9 podm\u00ednky:<\/p>\n<p><\/p>\n<p>1) Zeptejte se sami sebe \u2014 co d\u011bl\u00e1 tato t\u0159\u00edda\/metoda\/modul\/slu\u017eba? Na tuto ot\u00e1zku byste m\u011bli odpov\u011bd\u011bt jednoduchou definic\u00ed. (D\u011bkuji) <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/brightori\/\" class=\"user_link\">Brightori<\/a><\/noindex> )<\/p>\n<p>\n<b class=\"spoiler_title\">vysv\u011btlen\u00ed<\/b><\/p>\n<p>Nicm\u00e9n\u011b, n\u011bkdy je velmi obt\u00ed\u017en\u00e9 naj\u00edt jednoduchou definici. <\/p>\n<p><\/p>\n<p>2) Oprava n\u011bjak\u00e9 chyby nebo p\u0159id\u00e1n\u00ed nov\u00e9 funkcionality zasahuje do minim\u00e1ln\u00edho po\u010dtu soubor\u016f\/t\u0159\u00edd. Ide\u00e1ln\u011b \u2014 pouze jedna. <\/p>\n<p>\n<b class=\"spoiler_title\">vysv\u011btlen\u00ed<\/b><\/p>\n<p>Jeliko\u017e je odpov\u011bdnost (za funkci nebo chybu) enkapsulov\u00e1na v jednom souboru\/t\u0159\u00edd\u011b, p\u0159esn\u011b v\u00edte, kde hledat a co opravovat. Nap\u0159\u00edklad: funkce zm\u011bny v\u00fdstupu logov\u00e1n\u00ed operac\u00ed vy\u017eaduje zm\u011bnu pouze v loggeru. Nen\u00ed pot\u0159eba sk\u00e1kat po cel\u00e9m zbytku k\u00f3du. <\/p>\n<p><\/p>\n<p>Dal\u0161\u00ed p\u0159\u00edklad \u2014 p\u0159id\u00e1n\u00ed nov\u00e9 UI kontroly, kter\u00e1 je podobn\u00e1 t\u011bm p\u0159edchoz\u00edm. Pokud v\u00e1s to nut\u00ed p\u0159idat 10 r\u016fzn\u00fdch entit a 15 r\u016fzn\u00fdch konvertor\u016f \u2014 zd\u00e1 se, \u017ee jste \"p\u0159ehnali\".<\/p>\n<p><\/p>\n<p>3) Pokud n\u011bkolik v\u00fdvoj\u00e1\u0159\u016f pracuje na r\u016fzn\u00fdch funkcionalit\u00e1ch va\u0161eho projektu, pravd\u011bpodobnost konfliktu slu\u010dov\u00e1n\u00ed, tj. pravd\u011bpodobnost, \u017ee stejn\u00fd soubor\/t\u0159\u00edda bude zm\u011bn\u011bna n\u011bkolika v\u00fdvoj\u00e1\u0159i sou\u010dasn\u011b, je minim\u00e1ln\u00ed.<\/p>\n<p>\n<b class=\"spoiler_title\">vysv\u011btlen\u00ed<\/b><\/p>\n<p>Pokud p\u0159i p\u0159id\u00e1v\u00e1n\u00ed nov\u00e9 operace \u201eVyl\u00edt vodku pod st\u016fl\u201c pot\u0159ebujete zas\u00e1hnout do logova\u010de, operace pit\u00ed a vyl\u00e9v\u00e1n\u00ed \u2013 pak to vypad\u00e1, \u017ee odpov\u011bdnosti nejsou spr\u00e1vn\u011b rozd\u011blen\u00e9. Ur\u010dit\u011b to nen\u00ed v\u017edy mo\u017en\u00e9, ale je t\u0159eba se sna\u017eit tento ukazatel sn\u00ed\u017eit. <\/p>\n<p><\/p>\n<p>4) P\u0159i up\u0159es\u0148uj\u00edc\u00ed ot\u00e1zce k obchodn\u00ed logice (od v\u00fdvoj\u00e1\u0159e nebo mana\u017eera) se dost\u00e1v\u00e1te p\u0159\u00edmo do jedn\u00e9 t\u0159\u00eddy\/souboru a z\u00edsk\u00e1v\u00e1te informace pouze odsud.<\/p>\n<p>\n<b class=\"spoiler_title\">vysv\u011btlen\u00ed<\/b><\/p>\n<p>Funkce, pravidla nebo algoritmy jsou kompaktn\u011b zaps\u00e1ny, ka\u017ed\u00e1 na jednom m\u00edst\u011b, a ne roztrou\u0161eny vlajkami po cel\u00e9m k\u00f3du.<\/p>\n<p><\/p>\n<p>5) Pojmenov\u00e1n\u00ed je srozumiteln\u00e9.<\/p>\n<p>\n<b class=\"spoiler_title\">vysv\u011btlen\u00ed<\/b><\/p>\n<p>Na\u0161e t\u0159\u00edda nebo metoda je zodpov\u011bdn\u00e1 za n\u011bco konkr\u00e9tn\u00edho, a tato zodpov\u011bdnost je odrazena v jej\u00edm n\u00e1zvu.<\/p>\n<p><\/p>\n<p>AllManagersManagerService \u2014 pravd\u011bpodobn\u011b God-t\u0159\u00edda.<br \/>\nLocalPayment \u2014 pravd\u011bpodobn\u011b ne. <\/p>\n<p><\/p>\n<h4 id=\"formalizm-3-metodika-razrabotki-okkama-first\">Formalismus 3. Metodika v\u00fdvoje \u201eOckham-first\u201c.<\/h4>\n<p><\/p>\n<p>Na za\u010d\u00e1tku navrhov\u00e1n\u00ed, \u010dlov\u011bk-opice nezn\u00e1 a nec\u00edt\u00ed v\u0161echny nuance \u0159e\u0161en\u00e9ho \u00fakolu a m\u016f\u017ee ud\u011blat chybu. Chybovat lze r\u016fzn\u00fdmi zp\u016fsoby:<\/p>\n<p><\/p>\n<ul>\n<li>Vytvo\u0159it p\u0159\u00edli\u0161 velk\u00e9 objekty slou\u010den\u00edm r\u016fzn\u00fdch odpov\u011bdnost\u00ed<\/li>\n<li>Rozm\u011blnit, rozd\u011blen\u00edm jedin\u00e9 odpov\u011bdnosti na mnoho r\u016fzn\u00fdch typ\u016f<\/li>\n<li>Nespr\u00e1vn\u011b stanovit hranice odpov\u011bdnosti<\/li>\n<\/ul>\n<p><\/p>\n<p>Je d\u016fle\u017eit\u00e9 si zapamatovat pravidlo: \u201eud\u011blat chybu je lep\u0161\u00ed na vy\u0161\u0161\u00ed stran\u011b\u201c, nebo \u201enejste si jisti \u2013 ne\u010dle\u0148te\u201c. Pokud nap\u0159\u00edklad v\u00e1\u0161 t\u0159\u00edda shroma\u017e\u010fuje dv\u011b odpov\u011bdnosti \u2013 je to st\u00e1le jasn\u00e9 a lze ji rozd\u011blit na dv\u011b s minim\u00e1ln\u00edmi zm\u011bnami klientsk\u00e9ho k\u00f3du. Skl\u00e1dat toti\u017e sklenici z kousk\u016f skla je obvykle slo\u017eit\u011bj\u0161\u00ed kv\u016fli rozmazan\u00e9 kontextu rozlo\u017een\u00e9 do n\u011bkolika soubor\u016f a absenci pot\u0159ebn\u00fdch z\u00e1vislost\u00ed v klientsk\u00e9m k\u00f3du. <\/p>\n<p><\/p>\n<h2 id=\"pora-zakruglyatsya\">Je \u010das to uzav\u0159\u00edt<\/h2>\n<p><\/p>\n<p>Oblast pou\u017eit\u00ed SRP nen\u00ed omezena na OOP a SOLID. Je aplikovateln\u00fd na metody, funkce, t\u0159\u00eddy, moduly, mikroslu\u017eby a slu\u017eby. Je pou\u017eiteln\u00fd jak pro \u201efigaks-figaks-a-do-produkce\u201c, tak pro \u201eraketov\u00e9 v\u011bdy\u201c ve v\u00fdvoji, v\u0161ude \u010din\u00ed sv\u011bt o n\u011bco lep\u0161\u00edm. Kdy\u017e nad t\u00edm uva\u017eujete, je to snad a\u017e fundament\u00e1ln\u00ed princip cel\u00e9 in\u017een\u00fdrstv\u00ed. Stroj\u00edrenstv\u00ed, syst\u00e9my \u0159\u00edzen\u00ed, a v\u016fbec v\u0161echny slo\u017eit\u00e9 syst\u00e9my \u2013 jsou budov\u00e1ny z komponent\u016f, a \u201ened\u011blen\u00ed\u201c zbavuje konstrukt\u00e9ry flexibility, \u201ep\u0159ede\u0161l\u00e9 d\u011blen\u00ed\u201c \u2013 efektivity, a nespr\u00e1vn\u00e9 hranice \u2013 rozumu a du\u0161evn\u00edho klidu. <\/p>\n<p>\n<img decoding=\"async\" alt=\"Princip jedn\u00e9 odpov\u011bdnosti. Nen\u00ed tak jednoduch\u00fd, jak se zd\u00e1\" src=\"\/wp-content\/uploads\/2019\/06\/b70fb2b0b87cf90d41462263e839902b.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>SRP nen\u00ed v\u00fdmysl p\u0159\u00edrody a nen\u00ed sou\u010d\u00e1st\u00ed exaktn\u00ed v\u011bdy. Vznik\u00e1 z na\u0161ich biologick\u00fdch a psychologick\u00fdch omezen\u00ed. Je to jen zp\u016fsob, jak \u0159\u00eddit a rozv\u00edjet slo\u017eit\u00e9 syst\u00e9my pomoc\u00ed lidsk\u00e9ho mozku. \u0158\u00edk\u00e1 n\u00e1m, jak dekomponovat syst\u00e9m. P\u016fvodn\u00ed formulace vy\u017eadovala zna\u010dnou dovednost telepatie, ale douf\u00e1m, \u017ee tento \u010dl\u00e1nek trochu rozpt\u00fdlil mlhu.<\/p>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/454290\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Single responsibility principle, \u043e\u043d \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043e\u043d \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u043e\u0439 \u0438\u0437\u043c\u0435\u043d\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u2014 \u043a\u0440\u0430\u0439\u043d\u0435 \u0441\u043a\u043e\u043b\u044c\u0437\u043a\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0435\u043d\u044c \u0438 \u0441\u0442\u043e\u043b\u044c \u043d\u0435\u0440\u0432\u043e\u0437\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430. \u041f\u0435\u0440\u0432\u043e\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u0443\u0440\u0441\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u043b\u043e\u0434\u044b\u0445 \u0438 \u0437\u0435\u043b\u0435\u043d\u044b\u0445 \u043d\u0430\u0441 \u0432\u044b\u0432\u0435\u0437\u043b\u0438 \u0432 \u043b\u0435\u0441, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043b\u0438\u0447\u0438\u043d\u043e\u043a \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u2014 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26229,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-34828","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Single Responsibility Principle. \u041d\u0435 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043a\u0430\u043a \u043a\u0430\u0436\u0435\u0442\u0441\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:00:38+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:00:38+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Princip jednotliv\u00e9 odpov\u011bdnosti. Nen\u00ed tak jednoduch\u00fd, jak se zd\u00e1 | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Single Responsibility Principle. \u041d\u0435 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043a\u0430\u043a \u043a\u0430\u0436\u0435\u0442\u0441\u044f | ProHoster","og:url":"https:\/\/prohoster.info\/cs\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:00:38+00:00","article:modified_time":"2019-10-31T19:00:38+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34828","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-02-09 21:46:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:14:06","updated":"2026-02-09 21:46:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/34828","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=34828"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/34828\/revisions"}],"predecessor-version":[{"id":159767,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/34828\/revisions\/159767"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/26229"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=34828"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=34828"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=34828"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}