{"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\/sl\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","title":{"rendered":"Princip jedinstvene odgovornosti. Nije tako jednostavno kao \u0161to se \u010dini","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Princip jedinstvene odgovornosti. Nije tako jednostavno kao \u0161to se \u010dini\" src=\"\/wp-content\/uploads\/2019\/06\/5b253ff55e3c97b6baf5f7a7ae7f3b98.JPG\" style=\"display:block;margin: 0 auto;\" \/> Princip enotne odgovornosti,<br \/>\ntudi imenovan princip enotne spremenljivosti \u2014 je zelo spolzka tema za razumevanje in precej \u017eivahno vpra\u0161anje na razgovoru za programerja. <\/p>\n<p><\/p>\n<p>Moje prvo resno sre\u010danje s tem principom se je zgodilo na za\u010detku prvega letnika, ko so nas mlade in neizku\u0161ene odpeljali v gozd, da bi nas spremenili iz li\u010dink \u0161tudentov v prave \u0161tudente.<\/p>\n<p><\/p>\n<p>V gozdu so nas razdelili v skupine po 8-9 ljudi in organizirali tekmovanje \u2014 katera skupina bo hitreje spila steklenico vodke, pri \u010demer prvi iz skupine nalije vodko v kozarce, drugi jo spije, tretji pa ugrizne. Enota, ki je opravila svojo nalogo, se postavi na konec vrste skupine. <\/p>\n<p><\/p>\n<p>Primer, ko je bila dol\u017eina vrste deljiva s tremi, je bila dobra realizacija SRP.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <\/p>\n<h2 id=\"opredelenie-1-edinaya-otvetstvennost\">Opredelitev 1. Enotna odgovornost.<\/h2>\n<p><\/p>\n<p>Uradna definicija principa enotne odgovornosti (SRP) pravi, da ima vsak objekt svojo odgovornost in razlog za obstoj, ta odgovornost pa je le ena.<\/p>\n<p><\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 &#171;\u0412\u044b\u043f\u0438\u0432\u043e\u0445\u0430&#187; (<strong>Tippler<\/strong>).<br \/>\nDa bi izvajali princip SRP, razdelimo naloge na tri: <\/p>\n<p><\/p>\n<ul>\n<li>Eden nalije (<strong>PourOperation<\/strong>)<\/li>\n<li>Eden spije (<strong>DrinkUpOperation<\/strong>)<\/li>\n<li>Eden ugrizne (<strong>TakeBiteOperation<\/strong>)<\/li>\n<\/ul>\n<p><\/p>\n<p>Vsak od udele\u017eencev v procesu je odgovoren za eno komponento procesa, kar pomeni, da ima eno atomarno odgovornost \u2014 spiti, naliti ali ugrizniti. <\/p>\n<p><\/p>\n<p>Pijan\u010dek pa je v tem primeru fasada za te operacije:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class Tippler {\n    \/\/...\n    void Act(){\n        _pourOperation.Do() \/\/ naliti\n        _drinkUpOperation.Do() \/\/ spiti\n        _takeBiteOperation.Do() \/\/ ugrizniti\n    }\n}<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Princip jedinstvene odgovornosti. Nije tako jednostavno kao \u0161to se \u010dini\" src=\"\/wp-content\/uploads\/2019\/06\/8d591a474e3555edfee3ffebc28d079b.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4 id=\"zachem\">Zakaj?<\/h4>\n<p><\/p>\n<p>Programer pi\u0161e kodo za \u010dloveka-opico, \u010dlovek-opica pa je nepazljiv, neumen in nenehno nekam hiti. Ob dr\u017ei lahko obdr\u017ei in razume pribli\u017eno 3 \u2014 7 terminov naenkrat.<br \/>\nV primeru pijan\u010dka so ti termini trije. Vendar, \u010de bomo napisali kodo kot eno dolgo vrstico, se bodo pojavili roke, kozarci, pretepi in neskon\u010dne razprave o politiki. In vse to bo v telesu enega samega metoda. Prepri\u010dan sem, da ste tak\u0161no kodo \u017ee videli v praksi. Ni ravno najbolj humano preizku\u0161nje za psiho.<\/p>\n<p><\/p>\n<p>\u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0447\u0435\u043b\u043e\u0432\u0435\u043a-\u043e\u0431\u0435\u0437\u044c\u044f\u043d\u0430 \u0437\u0430\u0442\u043e\u0447\u0435\u043d \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0438\u0440\u0430 \u0432 \u0441\u0432\u043e\u0435\u0439 \u0433\u043e\u043b\u043e\u0432\u0435. \u0412 \u0441\u0432\u043e\u0435\u043c \u0432\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0438\u0445 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c, \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u043d\u043e\u0432\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435 \u0441\u0442\u0430\u0440\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u0430\u0448\u0438\u043d\u044b. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432 \u0432\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u0432\u0435\u0440\u044c, \u043e\u0442\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u043e\u0431\u0448\u0438\u0432\u043a\u0443 \u0434\u0432\u0435\u0440\u0438 \u0438 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0442\u0430\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0441\u0442\u0435\u043a\u043b\u043e\u043f\u043e\u0434\u044a\u0435\u043c\u043d\u0438\u043a\u043e\u0432, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 \u0448\u0435\u0441\u0442\u0435\u0440\u043d\u0438. \u041d\u043e \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043c\u0430\u0448\u0438\u043d\u044b \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0432 \u043e\u0434\u043d\u043e\u043c &#171;\u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0435&#187;. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 &#171;\u0447\u0435\u043b\u043e\u0432\u0435\u043a-\u043e\u0431\u0435\u0437\u044c\u044f\u043d\u0430&#187; \u043d\u0435 \u043c\u043e\u0436\u0435\u0442.<\/p>\n<p><\/p>\n<p>Zato programerski ljudje dekomponirajo zapletene mehanizme na niz manj zapletenih in delujo\u010dih elementov. Vendar je mogo\u010de dekomponirati na razli\u010dne na\u010dine: pri mnogih starih avtomobilih zrakoprovod izhaja v vrata, pri sodobnih pa okvara elektronskega zaklepa ne omogo\u010da zagon motorja, kar povzro\u010da te\u017eave pri popravilu.<\/p>\n<p><\/p>\n<p>Torej, <strong>SRP je princip, ki pojasnjuje KAK dekomponirati, tj. kje potegniti \u010drto lo\u010ditve.<\/strong>. <\/p>\n<p><\/p>\n<p>\u041e\u043d \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0434\u043e \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f &#171;\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438&#187;, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e \u0437\u0430\u0434\u0430\u0447\u0430\u043c \u0442\u0435\u0445 \u0438\u043b\u0438 \u0438\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Princip jedinstvene odgovornosti. Nije tako jednostavno kao \u0161to se \u010dini\" src=\"\/wp-content\/uploads\/2019\/06\/b1980c3dc9742b921eb818f14fe3527e.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Vrnimo se k pijan\u010dku in prednostim, ki jih dobi \u010dlovek-obo\u017eavalec pri dekomponiranju: <\/p>\n<p><\/p>\n<ul>\n<li>Koda je postala izjemno jasna na vsakem nivoju.<\/li>\n<li>Kodo lahko pi\u0161e ve\u010d programerjev hkrati (vsak pi\u0161e poseben element).<\/li>\n<li>Pojavi se enostavnej\u0161e avtomatsko testiranje - \u010dim preprostej\u0161i element, tem la\u017eje ga je testirati.<\/li>\n<li>Pojavi se kompozicija kode - lahko zamenjate <strong>DrinkUpOperation<\/strong> z operacijo, v kateri pijan\u010dek nalije teko\u010dino pod mizo. Ali zamenjate operacijo nalivanja z operacijo, v kateri me\u0161ate vino in vodo ali vodko in pivo. Glede na zahteve podjetja lahko naredite vse to, ne da bi se dotaknili kode metode. <strong>Tippler.Act<\/strong>. <\/li>\n<li>Iz teh operacij lahko sestavite ma\u010dka (uporabite le <strong>TakeBitOperation<\/strong>), alkoholi\u010darja (uporabite le <strong>DrinkUpOperation<\/strong> direktno iz steklenice) in zadovoljite \u0161e mnoge druge poslovne zahteve.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>(Ojoj, zdi se, da je to \u017ee na\u010delo OCP, in sem kr\u0161il odgovornost te objave.) <\/em><\/p>\n<p><\/p>\n<p>In seveda slabosti: <\/p>\n<p><\/p>\n<ul>\n<li>Bodo morali ustvariti ve\u010d tipov. <\/li>\n<li>Pijan\u010dek bo prvi\u010d pil za nekaj ur kasneje, kot bi lahko.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"opredelenie-2-edinaya-izmenchivost\">Definicija 2. Enotna spremenljivost.<\/h2>\n<p><\/p>\n<p>\u041f\u043e\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u0433\u043e\u0441\u043f\u043e\u0434\u0430! \u041a\u043b\u0430\u0441\u0441 \u0432\u044b\u043f\u0438\u0432\u043e\u0445\u0438 \u0436\u0435 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0435\u0434\u0438\u043d\u0443\u044e \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u2014 \u043e\u043d \u0432\u044b\u043f\u0438\u0432\u0430\u0435\u0442! \u0418 \u0432\u043e\u043e\u0431\u0449\u0435, \u0441\u043b\u043e\u0432\u043e &#171;\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c&#187; \u2014 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0430\u0437\u043c\u044b\u0442\u043e\u0435. \u041a\u0442\u043e-\u0442\u043e \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u0435\u043d \u0437\u0430 \u0441\u0443\u0434\u044c\u0431\u0443 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u0442\u0432\u0430, \u0430 \u043a\u0442\u043e-\u0442\u043e \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u0435\u043d \u0437\u0430 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043e\u043f\u0440\u043e\u043a\u0438\u043d\u0443\u0442\u044b\u0445 \u043d\u0430 \u043f\u043e\u043b\u044e\u0441\u0435 \u043f\u0438\u043d\u0433\u0432\u0438\u043d\u043e\u0432.<\/p>\n<p><\/p>\n<p>Oglejmo si dve izvedbi pijanice. Prva, omenjena zgoraj, vsebuje tri razrede \u2013 naliti, spiti in prigrizniti.<\/p>\n<p><\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u044e &#171;\u0412\u043f\u0435\u0440\u0435\u0434 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043f\u0435\u0440\u0435\u0434&#187; \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <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>\u041e\u0431\u0430 \u044d\u0442\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u0430, \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f, \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0435\u0434\u0438\u043d\u0443\u044e \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c &#171;\u0432\u044b\u043f\u0438\u0442\u044c&#187;. <\/p>\n<p><\/p>\n<p>Neprestano!<\/p>\n<p><\/p>\n<p>Takrat se podamo na internet in odkrijemo drugo definicijo SRP \u2013 Na\u010delo edinstvene spreminljivosti (Single Changeability Principle).<\/p>\n<p><\/p>\n<p>SCP \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e &#171;<strong>Modul ima en in samo en razlog za spremembo<\/strong>&#171;. \u0422\u043e \u0435\u0441\u0442\u044c &#171;\u041e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u2014 \u044d\u0442\u043e \u043f\u043e\u0432\u043e\u0434 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f&#187;. <\/p>\n<p><\/p>\n<p><em>(Zdi se, da so fantje, ki so prva definicija zamislili, bili prepri\u010dani v telepatske sposobnosti \u010dloveka-opice)<\/em><\/p>\n<p><\/p>\n<p>Zdaj vse postane na svoje mesto. Lo\u010deno lahko spreminjamo postopke nalivanja, pitja in prigrizovanja, samemu pijanici pa lahko spremenimo le zaporedje in sestavo operacij, na primer, premestimo prigrizek pred pitjem ali dodamo branje toastov.<\/p>\n<p><\/p>\n<p>\u0412 \u043f\u043e\u0434\u0445\u043e\u0434\u0435 &#171;\u0412\u043f\u0435\u0440\u0435\u0434 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043f\u0435\u0440\u0435\u0434&#187;, \u0432\u0441\u0435 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u2014 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <strong>Act<\/strong>. To je lahko berljivo in u\u010dinkovito, kadar je logike malo in se redko spreminja, vendar pogosto kon\u010da z groznimi metodami po 500 vrstic v vsaki, s \u0161tevilom if-ov ve\u010djim, kot je potrebnega za vstop Rusije v NATO. <\/p>\n<p><\/p>\n<h2 id=\"opredelenie-3-lokalizaciya-izmeneniy\">Definicija 3. Lokalizacija sprememb.<\/h2>\n<p><\/p>\n<p>Pijanice pogosto ne razumejo, zakaj so se zbudili v tuji hi\u0161i ali kje je njihov mobilni telefon. Pri\u0161el je \u010das, da dodamo podrobno bele\u017eenje.<\/p>\n<p><\/p>\n<p>Za\u010dnimo z bele\u017eenjem postopka nalivanja:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class PourOperation: IOperation{\n    PourOperation(ILogger log \/*....*\/){\/*...*\/}\n    \/\/...\n    void Do(){\n        _log.Log($\"Pred nalivanjem s {_hand} in {_bottle}\");\n        \/\/Poslovna logika nalivanja ...\n        _log.Log($\"Po nalivanju s {_hand} in {_bottle}\");\n    }\n}<\/code><\/pre>\n<p><\/p>\n<p>Inkapusliramo jo v <strong>PourOperation<\/strong>, smo smo ravnali pametno s stali\u0161\u010da odgovornosti in inkapsulacije, vendar pa imamo zdaj z na\u010delom spremenljivosti te\u017eave. Poleg same operacije, ki se lahko spreminja, se spreminja tudi sama bele\u017eitev. Treba bo lo\u010diti in narediti poseben bele\u017enik za operacijo nalivanja:<\/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             \/\/... poslovna logika\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>Natan\u010den bralec bo opazil, da <strong>LogAfter<\/strong>, <strong>LogBefore<\/strong> in <strong>OnError<\/strong> lahko spremenijo tudi lo\u010deno, in po analogiji s prej\u0161njimi dejanji bomo ustvarili tri razrede: <strong>PourLoggerBefore<\/strong>, <strong>PourLoggerAfter<\/strong> in <strong>PourErrorLogger<\/strong>.<\/p>\n<p><\/p>\n<p>In \u010de se spomnimo, da so operacije za pivca tri \u2014 dobimo devet razredov bele\u017eenja. Na koncu ima celotna pija\u010da 14 (!!!) razredov.<\/p>\n<p><\/p>\n<p>Hipotetika? Malomarno! \u010clovek-opica z dekompozicijsko granato bo razbil \"nalivalca\" na vr\u010d, kozarec, operaterje nalivanja, storitev za oskrbo z vodo, fizi\u010dni model tr\u010denja molekul in naslednji kvartal bo posku\u0161al razvozlati odvisnosti brez globalnih spremenljivk. In verjemite \u2014 ne bo se ustavil.<\/p>\n<p><\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e SRP \u2014 \u044d\u0442\u043e \u0441\u043a\u0430\u0437\u043a\u0438 \u0438\u0437 \u0440\u043e\u0437\u043e\u0432\u044b\u0445 \u043a\u043e\u0440\u043e\u043b\u0435\u0432\u0441\u0442\u0432, \u0438 \u0443\u0445\u043e\u0434\u044f\u0442 \u0432\u0438\u0442\u044c \u043b\u0430\u043f\u0448\u0443&#8230;<\/p>\n<p><\/p>\n<p>\u2026 ne da bi spoznali obstoj tretje opredelitve Srp: <\/p>\n<p><\/p>\n<p>&#171;\u041f\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 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e <strong>podobne stvari, ki se spreminjajo, morajo biti shranjene na enem mestu<\/strong>&#171;. \u0438\u043b\u0438 \u201c<strong>To, kar se spreminja skupaj, mora biti shranjeno na enem mestu<\/strong>\u201d<\/p>\n<p><\/p>\n<p>To pomeni, da, \u010de spreminjamo bele\u017eenje operacije, to moramo spremeniti na enem mestu.<\/p>\n<p><\/p>\n<p>\u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f SRP, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0432\u044b\u0448\u0435, \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0434\u0440\u043e\u0431\u0438\u0442\u044c \u0442\u0438\u043f\u044b, \u043f\u043e\u043a\u0430 \u043e\u043d\u0438 \u0434\u0440\u043e\u0431\u044f\u0442\u0441\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u043e &#171;\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443&#187; \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0443\u0436\u0435 \u0438 \u043e\u0431 &#171;\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0438 \u0441\u043d\u0438\u0437\u0443&#187;. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, <strong>SRP \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 &#171;\u0434\u0440\u043e\u0431\u0438\u0442\u044c \u043f\u043e\u043a\u0430 \u0434\u0440\u043e\u0431\u0438\u0442\u0441\u044f&#187;, \u043d\u043e \u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u2014 &#171;\u043d\u0435 \u0440\u0430\u0437\u0434\u0440\u043e\u0431\u0438\u0442\u044c \u0441\u0446\u0435\u043f\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0449\u0438&#187;<\/strong>. To je velika bitka med Ockamovo britvico in \u010dlovekom-opico!<\/p>\n<p>\n<img decoding=\"async\" alt=\"Princip jedinstvene odgovornosti. Nije tako jednostavno kao \u0161to se \u010dini\" src=\"\/wp-content\/uploads\/2019\/06\/2e349a5b119a511d716341f3f6725844.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Zdaj bi moral pivcu postati la\u017eje. Poleg tega, da ni treba razdeliti bele\u017enika IPourLogger na tri razrede, lahko tudi zdru\u017eimo vse bele\u017enike v en tip:<\/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>In caso venga aggiunto un quarto tipo di operazione, la registrazione \u00e8 gi\u00e0 pronta per lui. E il codice stesso delle operazioni \u00e8 pulito e privo di rumore infrastrutturale.<\/p>\n<p><\/p>\n<p>Di conseguenza, abbiamo 5 classi per risolvere il problema del bere:<\/p>\n<p><\/p>\n<ul>\n<li>Operazione di versamento<\/li>\n<li>Operazione di consumo<\/li>\n<li>Operazione di stuzzichino<\/li>\n<li>Registratore<\/li>\n<li>Facciata del bevitore<\/li>\n<\/ul>\n<p><\/p>\n<p>Ognuno di essi \u00e8 responsabile in modo rigoroso di un'unica funzionalit\u00e0 e ha una sola ragione per cambiare. Tutte le regole simili per modifiche sono collocate nelle vicinanze. <\/p>\n<p>\n<b class=\"spoiler_title\">Esempio dalla vita reale<\/b><\/p>\n<p>Un giorno stavamo scrivendo un servizio di registrazione automatica per clienti B2B. E ci fu un metodo GOD di 200 righe con contenuto simile:<\/p>\n<p><\/p>\n<ul>\n<li>Vai in 1C e crea un conto<\/li>\n<li>Con questo conto, vai al modulo di pagamento e crealo l\u00ec<\/li>\n<li>Controlla che non sia stato creato un account con tale conto nel principale <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/sl\/server\/dts-dronten\/\"   title=\"stre\u017enikom\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2485\">stre\u017enikom<\/a><\/li>\n<li>Crea un nuovo account<\/li>\n<li>Aggiungi il risultato della registrazione nel modulo di pagamento e il numero 1C al servizio dei risultati della registrazione<\/li>\n<li>Aggiungi a questa tabella le informazioni sull'account<\/li>\n<li>Crea un numero di punto per questo cliente nel servizio punti. Trasmetti a questo servizio il numero del conto 1C.<\/li>\n<\/ul>\n<p><\/p>\n<p>E in questo elenco c'erano anche circa 10 operazioni aziendali con una terribile interconnessione. L'oggetto conto era necessario per quasi tutti. L'identificatore del punto e il nome del cliente erano necessari in met\u00e0 delle chiamate.<\/p>\n<p><\/p>\n<p>Dopo un'ora di refactoring, siamo riusciti a separare il codice infrastrutturale e alcune sfumature di lavoro con l'account in metodi\/classi separate. Il metodo God si \u00e8 alleggerito, ma sono rimaste 100 righe di codice che non volevano essere sciolte. <\/p>\n<p><\/p>\n<p>\u041b\u0438\u0448\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u043f\u0440\u0438\u0448\u043b\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0441\u0443\u0442\u044c \u044d\u0442\u043e\u0433\u043e &#171;\u043f\u043e\u043b\u0435\u0433\u0447\u0430\u0432\u0448\u0435\u0433\u043e&#187; \u043c\u0435\u0442\u043e\u0434\u0430 \u2014 \u0438 \u0435\u0441\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c. \u0418 \u0447\u0442\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0422\u0417 \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c. \u0418 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430 \u043a\u0443\u0441\u043a\u0438 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435\u043c SRP, \u0430 \u043d\u0435 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. <\/p>\n<p><\/p>\n<h2 id=\"formalizm\">Formalismo.<\/h2>\n<p><\/p>\n<p>\u00c8 tempo di lasciare in pace il nostro bevitore. Asciuga le lacrime: torneremo sicuramente da lui in futuro. Ma ora formalizziamo le conoscenze di questo articolo. <\/p>\n<p><\/p>\n<h4 id=\"formalizm-1-opredelenie-srp\">Formalismo 1. Definizione di SRP<\/h4>\n<p><\/p>\n<ol>\n<li>Separare gli elementi in modo che ciascuno di essi sia responsabile di una sola cosa.<\/li>\n<li>\u041e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a &#171;\u043f\u043e\u0432\u043e\u0434 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f&#187;. \u0422\u043e \u0435\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u043c\u0435\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043f\u043e\u0432\u043e\u0434 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 \u0431\u0438\u0437\u043d\u0435\u0441 \u043b\u043e\u0433\u0438\u043a\u0438.<\/li>\n<li>Potencialne spremembe poslovne logike je treba lokalizirati. Spremenljivi sinhronizirani elementi morajo biti blizu drug drugega.<\/li>\n<\/ol>\n<p><\/p>\n<h4 id=\"formalizm-2-neobhodimye-kriterii-samoproverki\">Formalizem 2. Potrebni kriteriji samopreverjanja.<\/h4>\n<p><\/p>\n<p>Nisem naletel na dovolj kriterijev za izvr\u0161evanje SRP. Vendar pa so na voljo potrebni pogoji:<\/p>\n<p><\/p>\n<p>1) Postavite si vpra\u0161anje \u2014 kaj ta razred\/metoda\/modul\/storitev po\u010dne. Na njega morate odgovoriti s preprosto definicijo. (hvala <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\">pojasnila<\/b><\/p>\n<p>Vendar pa je v\u010dasih zelo te\u017eko najti preprosto definicijo. <\/p>\n<p><\/p>\n<p>2) Popravljanje dolo\u010denega hro\u0161\u010da ali dodajanje nove funkcionalnosti zahteva minimalno \u0161tevilo datotek\/razredov. Idealno \u2014 ena. <\/p>\n<p>\n<b class=\"spoiler_title\">pojasnila<\/b><\/p>\n<p>Ker je odgovornost (za funkcionalnost ali hro\u0161\u010da) inkapsulirana v eni datoteki\/razredu, natan\u010dno veste, kje iskati in kaj popraviti. Na primer: funkcija za spremembo izpisa logiranja operacij bo zahtevala spremembo samo logerja. Ni treba pre\u010desavati celotne kode. <\/p>\n<p><\/p>\n<p>Drug primer \u2014 dodajanje novega UI kontrolnika, ki je podoben prej\u0161njim. \u010ce vas to prisili, da dodate 10 razli\u010dnih entitet in 15 razli\u010dnimi konverterji \u2014 se zdi, da ste \"predelali\".<\/p>\n<p><\/p>\n<p>3) \u010ce ve\u010d razvijalcev dela na razli\u010dnih funkcionalnostih va\u0161ega projekta, je verjetnost za konflikt med zdru\u017eevanjem \u2014 torej verjetnost, da bo ista datoteka\/razred spremenjena pri ve\u010d razvijalcih hkrati \u2014 minimalna.<\/p>\n<p>\n<b class=\"spoiler_title\">pojasnila<\/b><\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 &#171;\u0412\u044b\u043b\u0438\u0442\u044c \u0432\u043e\u0434\u043a\u0443 \u043f\u043e\u0434 \u0441\u0442\u043e\u043b&#187; \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0449\u0438\u043a, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0432\u044b\u043f\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u0432\u044b\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u2014 \u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b \u043a\u0440\u0438\u0432\u043e. \u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c. <\/p>\n<p><\/p>\n<p>4) Ob pojasnjevalnem vpra\u0161anju glede poslovne logike (od razvijalca ali mened\u017eerja) se ozirate zgolj v en razred\/datoteko in dobite informacije le od tam.<\/p>\n<p>\n<b class=\"spoiler_title\">pojasnila<\/b><\/p>\n<p>Funkcije, pravila ali algoritmi so kompaktno napisani vsak na enem mestu, ne pa raztreseni po vsej kodi.<\/p>\n<p><\/p>\n<p>5) Imenovanje je jasno.<\/p>\n<p>\n<b class=\"spoiler_title\">pojasnila<\/b><\/p>\n<p>Na\u0161 razred ali metoda je odgovorna za eno samo stvar, odgovornost pa je odra\u017eena v njenem imenu.<\/p>\n<p><\/p>\n<p>AllManagersManagerService \u2014 verjetno Bo\u017eji razred.<br \/>\nLocalPayment \u2014 verjetno ni. <\/p>\n<p><\/p>\n<h4 id=\"formalizm-3-metodika-razrabotki-okkama-first\">\u0424\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043c 3. \u041c\u0435\u0442\u043e\u0434\u0438\u043a\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 &#171;\u041e\u043a\u043a\u0430\u043c\u0430-first&#187;.<\/h4>\n<p><\/p>\n<p>Na za\u010detku na\u010drtovanja, \u010dlovek-opica ne ve in ne \u010duti vseh podrobnosti re\u0161enega problema in lahko naredi napako. Napake so lahko razli\u010dne:<\/p>\n<p><\/p>\n<ul>\n<li>Ustvarjanje prevelikih objektov, zdru\u017eevanje razli\u010dnih odgovornosti<\/li>\n<li>Razdelitev, razdrobljenje enotne odgovornosti na razli\u010dne tipe<\/li>\n<li>Napa\u010dno dolo\u010danje meja odgovornosti<\/li>\n<\/ul>\n<p><\/p>\n<p>\u0412\u0430\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e: &#171;\u043e\u0448\u0438\u0431\u0430\u0442\u044c\u0441\u044f \u043b\u0443\u0447\u0448\u0435 \u0432 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443&#187;, \u0438\u043b\u0438 &#171;\u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u2014 \u043d\u0435 \u0434\u0440\u043e\u0431\u0438\u0442\u0435&#187;. \u0415\u0441\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0434\u0432\u0435 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u2014 \u0442\u043e \u043e\u043d \u043f\u043e \u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043f\u043e\u043d\u044f\u0442\u0435\u043d \u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0438\u043b\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u0430 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0421\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0436\u0435 \u0438\u0437 \u043e\u0441\u043a\u043e\u043b\u043a\u043e\u0432 \u0441\u0442\u0435\u043a\u043b\u0430 \u0441\u0442\u0430\u043a\u0430\u043d, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438\u0437-\u0437\u0430 \u0440\u0430\u0437\u043c\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0444\u0430\u0439\u043b\u0430\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0435. <\/p>\n<p><\/p>\n<h2 id=\"pora-zakruglyatsya\">\u010cas je, da zaklju\u010dimo<\/h2>\n<p><\/p>\n<p>\u0160irina uporabe SRP ni omejena na OOP in SOLID. Uporabljati se lahko za metode, funkcije, razrede, module, mikroservise in storitve. Uporaben je tako za 'figaks-figaks-in-v-prod' kot za 'rocketscience' razvoj, povsod izbolj\u0161uje svet. \u010ce pomislimo, je to skoraj temeljno na\u010delo celotne in\u017eenirije. Strojni\u0161tvo, kontrolni sistemi in pravzaprav vsi zapleteni sistemi - so zgrajeni iz komponent, 'neprekomerno drobljenje' odvzema konstruktorjem fleksibilnost, 'prekomerno drobljenje' - u\u010dinkovitost, napa\u010dne meje pa - razum in du\u0161evni mir. <\/p>\n<p>\n<img decoding=\"async\" alt=\"Princip jedinstvene odgovornosti. Nije tako jednostavno kao \u0161to se \u010dini\" src=\"\/wp-content\/uploads\/2019\/06\/b70fb2b0b87cf90d41462263e839902b.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>SRP ni izum narave in ni del natan\u010dne znanosti. Raste iz na\u0161ih biolo\u0161kih in psiholo\u0161kih omejitev. To je le na\u010din nadzorovanja in razvijanja zapletenih sistemov s \u010dlove\u0161kim umom-opico. Pove nam, kako dekomponirati sistem. Prvotna formulacija je zahtevala kar nekaj telepatskih spretnosti, a upam, da je ta \u010dlanek nekoliko razblinil dimno zaveso.<\/p>\n<p>Izvor: <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.4 - 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\/sl\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sl_SI\" \/>\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\/sl\/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\udd47Single Responsibility Principle. N ni tako enostaven, kot izgleda | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","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\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/34828","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=34828"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/34828\/revisions"}],"predecessor-version":[{"id":159767,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/34828\/revisions\/159767"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media\/26229"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=34828"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=34828"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=34828"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}