{"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\/et\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","title":{"rendered":"\u00dche vastutuse printsiip. Ei ole nii lihtne, nagu tundub","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"\u00dche vastutuse printsiip. Ei ole nii lihtne, nagu tundub\" src=\"\/wp-content\/uploads\/2019\/06\/5b253ff55e3c97b6baf5f7a7ae7f3b98.JPG\" style=\"display:block;margin: 0 auto;\" \/> \u00dcksikvastutuse p\u00f5him\u00f5te, mida tuntakse ka kui \u00fchtse vastutuse p\u00f5him\u00f5te,<br \/>\non \u00fchtlasi \u00fchtse muutlikkuse p\u00f5him\u00f5te \u2013 \u00e4\u00e4rmiselt libe m\u00f5iste ja v\u00e4ga n\u00e4rviline teema programmeerija vestlusel. <\/p>\n<p><\/p>\n<p>Minu esimene t\u00f5sine tutvus selle p\u00f5him\u00f5ttega toimus esimese kursuse alguses, kui noored ja rohelised meid viidi metsa, et muuta \u00f5pilastest t\u00f5elised \u00fcli\u00f5pilased.<\/p>\n<p><\/p>\n<p>Metsas jagati meid gruppidesse, kus igas oli 8-9 inimest, ja korraldati v\u00f5istlus - milline grupp joob pudeli viina kiiremini, tingimusel, et grupi esimene inimene valab viina klaasi, teine joob ning kolmas n\u00e4ksib. Esimese \u00fclesande t\u00e4itnud inimene l\u00e4heb grupi saba. <\/p>\n<p><\/p>\n<p>Juhtum, kui j\u00e4rjekorra suurus oli kolmega jagatav, oli hea SRP rakendus.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <\/p>\n<h2 id=\"opredelenie-1-edinaya-otvetstvennost\">M\u00e4\u00e4ratlemine 1. \u00dcksikvastutus.<\/h2>\n<p><\/p>\n<p>\u00dcksikvastutuse (SRP) ametlik m\u00e4\u00e4ratlus \u00fctleb, et igal objektile on oma vastutus ja olemasolu p\u00f5hjus ning sellel on ainult \u00fcks vastutus.<\/p>\n<p><\/p>\n<p>Vaatame objekti &#171;Joogimees&#187; (<strong>Tippler<\/strong>).<br \/>\n\u00dcksikvastutuse rakendamiseks jagame kohustused kolmele: <\/p>\n<p><\/p>\n<ul>\n<li>\u00dcks valab (<strong>PourOperation<\/strong>)<\/li>\n<li>\u00dcks joob (<strong>DrinkUpOperation<\/strong>)<\/li>\n<li>\u00dcks n\u00e4ksib (<strong>TakeBiteOperation<\/strong>)<\/li>\n<\/ul>\n<p><\/p>\n<p>Iga protsessi osaline vastutab \u00fche protsessi komponendi eest, see t\u00e4hendab, et tal on \u00fcks aatomaarne vastutus - juua, valada v\u00f5i n\u00e4ksida. <\/p>\n<p><\/p>\n<p>Joogimees on seevastu nende toimingute fassaad:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class Tippler {\n    \\\/\\\/...\\n    void Act(){\\n        _pourOperation.Do() \\\/\\\/ valada\\n        _drinkUpOperation.Do() \\\/\\\/ juua\\n        _takeBiteOperation.Do() \\\/\\\/ n\u00e4ksida\\n    }\\n}<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"\u00dche vastutuse printsiip. Ei ole nii lihtne, nagu tundub\" src=\"\/wp-content\/uploads\/2019\/06\/8d591a474e3555edfee3ffebc28d079b.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4 id=\"zachem\">Miks?<\/h4>\n<p><\/p>\n<p>Inimprogrammeerija kirjutab koodi inimese-ahvi jaoks ning inimene-ahv on t\u00e4helepanematu, rumal ja pidevalt kuhugi kiirus. Ta suudab korraga hoida ja m\u00f5ista umbes 3 - 7 m\u00f5istet.<br \/>\nJoogimees puhul on neid m\u00f5isteid kolm. Kuid kui kirjutame kogu koodi \u00fcheks l\u00f5iguks, tulevad sinna k\u00e4ed, klaasid, kaklused ja l\u00f5putud poliitika arutelud. Ja k\u00f5ik see on \u00fche meetodi kehas. Olen kindel, et olete sellist koodi oma praktikas n\u00e4inud. Mitte k\u00f5ige inimlikum katsumus ps\u00fc\u00fchikale.<\/p>\n<p><\/p>\n<p>Teiselt poolt on inimene-ape suunatud reaalse maailma objektide modelleerimisele oma peas. Oma kujutluses saab ta neid kokku viia, luua neist uusi objekte ja samuti neid lahti v\u00f5tta. Kujutage ette vana auto mudelit. Saate oma kujutluses ukse avada, ust lahti keerata ja seal n\u00e4ha aknat\u00f5stukite mehhanisme, mille sees on hammasrattad. Kuid te ei saa k\u00f5iki auto komponente korraga n\u00e4ha, \u00fches \"loendis\". V\u00e4hemalt inimene-ape ei saa.<\/p>\n<p><\/p>\n<p>Seet\u00f5ttu dekomponeerivad programmijad keerulisi mehhanisme lihtsamaks ja t\u00f6\u00f6tavateks elementideks. Kuid dekomponeerida saab erinevalt: paljudes vanades autodes v\u00e4ljub \u00f5hutorustik uksest, samas kui kaasaegsetes ei lase luku elektroonika rike mootorit k\u00e4ivitada, mis tekitab remondi ajal probleeme.<\/p>\n<p><\/p>\n<p>Nii et <strong>SRP on p\u00f5him\u00f5te, mis selgitab KUID dekomponeerida, s.t. kus joon alla t\u00f5mmata.<\/strong>. <\/p>\n<p><\/p>\n<p>See \u00fctleb, et dekomponeerida tuleks vastutuse \"eraldamise\" p\u00f5him\u00f5tte alusel, s.t. erinevate objektide \u00fclesannete alusel.<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00dche vastutuse printsiip. Ei ole nii lihtne, nagu tundub\" src=\"\/wp-content\/uploads\/2019\/06\/b1980c3dc9742b921eb818f14fe3527e.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Naaseme joodiku juurde ja plusside juurde, mida inimene-ape saab dekomponeerimise k\u00e4igus: <\/p>\n<p><\/p>\n<ul>\n<li>Kood on igal tasemel \u00e4\u00e4rmiselt selge.<\/li>\n<li>Koodi saavad kirjutada mitmed programmeerijad korraga (iga\u00fchel on oma eraldi element).<\/li>\n<li>Automaatne testimine muutub lihtsamaks - mida lihtsam on element, seda lihtsam on seda testida.<\/li>\n<li>Koodi kompositsioonilisus suureneb - saate asendada. <strong>DrinkUpOperation<\/strong> operatsiooniga, kus joodik kallab vedelikku laua alla. V\u00f5i asendada valamise operatsioon operatsiooniga, kus segate veini ja vett v\u00f5i viina ja \u00f5lut. Vastavalt \u00e4rin\u00f5uetele saate teha k\u00f5ike, ilma et puudutaksite meetodi koodi. <strong>Tippler.Act<\/strong>. <\/li>\n<li>Nendest operatsioonidest saate kokku panna \u00fcles\u00f6\u00f6ja (kasutades vaid <strong>TakeBitOperation<\/strong>), alkohooliku (kasutades vaid <strong>DrinkUpOperation<\/strong> otse pudelist) ja rahuldada paljusid muid \u00e4ri n\u00f5udeid.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>(Oh, tundub, et see on juba OCP p\u00f5him\u00f5te ja ma rikkusin selle postituse vastutuse). <\/em><\/p>\n<p><\/p>\n<p>Ja muidugi miinused: <\/p>\n<p><\/p>\n<ul>\n<li>Tuleb luua rohkem t\u00fc\u00fcpe. <\/li>\n<li>Joodik joob esmakordselt paar tundi hiljem, kui v\u00f5iks.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"opredelenie-2-edinaya-izmenchivost\">M\u00e4\u00e4ratlemine 2. \u00dcksik muutlikkus.<\/h2>\n<p><\/p>\n<p>Lubage, daamid ja h\u00e4rrad! Klass, kes joob, t\u00e4idab \u00fchte vastutust \u2014 ta joob! Ja \u00fcldse, s\u00f5na \u201evastutus\u201c on \u00e4\u00e4rmiselt h\u00e4gune m\u00f5isted. Keegi on vastutav inimkonna saatuse eest, samas kui keegi vastutab polaari piirkonda kukkunud pingviinide korjamise eest.<\/p>\n<p><\/p>\n<p>Vaatame kahte joobnute rakendust. Esimene, nagu eespool mainitud, sisaldab kolme klassi \u2014 valamine, joomine ja sn\u00e4kkimine.<\/p>\n<p><\/p>\n<p>Teine, mis on kirjutatud l\u00e4henemisviisi \u201eEdasi ja ainult edasi\u201c j\u00e4rgi, sisaldab kogu loogikat meetodis <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>M\u00f5lemad need klassid, v\u00e4liselt vaadates, n\u00e4evad v\u00e4lja t\u00e4iesti identsed ja t\u00e4idavad \u00fchte vastutust \u201ejuua\u201c. <\/p>\n<p><\/p>\n<p>Piinlik!<\/p>\n<p><\/p>\n<p>Siis vaatasime internetist ja \u00f5ppisime SRP teise m\u00e4\u00e4ratlemise \u2014 \u00dche Muutuvuse Printsiibi (Single Changeability Principle).<\/p>\n<p><\/p>\n<p>SCP \u00fctleb, et \u201e<strong>Moodulil on \u00fcks ja ainult \u00fcks p\u00f5hjus, miks seda muuta<\/strong>\u201e. See t\u00e4hendab, et \u201eVastutus on muutmise p\u00f5hjus\u201c. <\/p>\n<p><\/p>\n<p><em>(Tundub, et need kutid, kes algse m\u00e4\u00e4ratluse v\u00e4lja m\u00f5tlesid, uskusid inimese-ape telepaatilistesse v\u00f5imetesse)<\/em><\/p>\n<p><\/p>\n<p>N\u00fc\u00fcd on k\u00f5ik omal kohal. Eraldi saame muuta valamis-, joomis- ja sn\u00e4kkimisprotseduure, ja joobnute puhul saame muuta ainult toimingute j\u00e4rjestust ja koostist, n\u00e4iteks liigutades snacks enne joomist v\u00f5i lisades toosti lugemise.<\/p>\n<p><\/p>\n<p>L\u00e4henemises \u201eEdasi ja ainult edasi\u201c saab k\u00f5ik, mida saab muuta \u2014 muuta ainult meetodis <strong>Act<\/strong>. See v\u00f5ib olla loetav ja t\u00f5hus, kui loogikat on v\u00e4he ja see harva muutub, kuid tihti l\u00f5peb see kohutavate meetoditega, iga\u00fches 500 rida, kus if-e on rohkem, kui oleks vajalik Venemaa NATOsse astumise jaoks. <\/p>\n<p><\/p>\n<h2 id=\"opredelenie-3-lokalizaciya-izmeneniy\">M\u00e4\u00e4ratlemine 3. Muutuste lokaliseerimine.<\/h2>\n<p><\/p>\n<p>Joobnud inimesed ei m\u00f5ista sageli, miks nad \u00e4rkasid kellegi teise korteris v\u00f5i kus nende mobiiltelefon on. On aeg lisada detailne logimine.<\/p>\n<p><\/p>\n<p>Alustame logimist valamisprotsessist:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class PourOperation: IOperation{\n    PourOperation(ILogger log \/*....*\/){\/*...*\/}\n    \/\/...\n    void Do(){\n        _log.Log($\"Enne valamist koos {_hand} ja {_bottle}\");\n        \/\/Valamise \u00e4ri loogika ...\n        _log.Log($\"P\u00e4rast valamist koos {_hand} ja {_bottle}\");\n    }\n}<\/code><\/pre>\n<p><\/p>\n<p>Kapseldades selle <strong>PourOperation<\/strong>, tegime m wise vastutuse ja kapseldamise aspektist, kuid muutsime n\u00fc\u00fcd muutlikkuse p\u00f5him\u00f5ttega h\u00e4das. Peale operatsiooni, mis v\u00f5ib muutuda, muutub ka logimine. Peame eraldama ja looma spetsiaalse logijate s\u00fcsteemi valamise operatsiooni jaoks:<\/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\/*...*\/\/}\n    \/\/...\n    void Do(){\n        _log.LogBefore(_hand, _bottle);\n        try{\n             \/\/... \u00e4riloogika\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>T\u00e4pne lugeja m\u00e4rkab, et <strong>LogAfter<\/strong>, <strong>LogBefore<\/strong> ja <strong>OnError<\/strong> v\u00f5ivad samuti eraldi muutuda, ja eelnevate tegevustega sarnaselt luuakse kolm klassi: <strong>PourLoggerBefore<\/strong>, <strong>PourLoggerAfter<\/strong> ja <strong>PourErrorLogger<\/strong>.<\/p>\n<p><\/p>\n<p>Ja meenutades, et joodikute operatsioone on kolm \u2014 saame kokku \u00fcheksa logimisklassi. L\u00f5ppkokkuv\u00f5ttes koosneb kogu joodik 14 (!!!) klassist.<\/p>\n<p><\/p>\n<p>H\u00fcperbool? Kahtlemata! Inimene-elevant koos dekodeerimise granaadiga l\u00f5hestab 'valaja' krahvi, klaasi, valamise operaatoriteks, veeteeninduse teenuseks, molekulide kokkup\u00f5rke f\u00fc\u00fcsiliseks mudeliks ja j\u00e4rgmise kvartali jooksul p\u00fc\u00fcab ta lahendada s\u00f5ltuvusi ilma globaalsete muutujateta. Ja uskuge mind \u2014 ta ei peatu.<\/p>\n<p><\/p>\n<p>Just sellel hetkel j\u00f5uavad paljud j\u00e4reldusele, et SRP on muinasjutud roosadest kuningriikidest ja l\u00e4hevad nuhtlema...<\/p>\n<p><\/p>\n<p>\u2026 kuna nad ei tea kolmandast definitsioonist Srp: <\/p>\n<p><\/p>\n<p>&#171;\u00dcksiku vastutuse p\u00f5him\u00f5te \u00fctleb, et <strong>sarnased muutustega asjad peaksid olema \u00fches kohas<\/strong>&#171;. v\u00f5i \u201c<strong>Asjad, mis muutuvad koos, peaksid olema \u00fches kohas.<\/strong>\u201d<\/p>\n<p><\/p>\n<p>See t\u00e4hendab, et kui me muudame operatsiooni logimist, peame seda muutma \u00fches kohas.<\/p>\n<p><\/p>\n<p>See on v\u00e4ga oluline aspekt \u2014 kuna k\u00f5ik SRP selgused, mis olid eelnevalt, r\u00e4\u00e4kisid sellest, et t\u00fc\u00fcpide t\u00fckeldamine on vajalik, nende suuruse kohta kehtib \u00fclemine piir, siis n\u00fc\u00fcd r\u00e4\u00e4gime ka alumisest piirist. Teisis\u00f5nu, <strong>SRP mitte ainult ei n\u00f5ua, et 't\u00fckeldada seni, kuni see on t\u00fckeldatav', vaid ka mitte \u00fcle pingutada \u2014 '\u00e4ra t\u00fckelda seotud asju'<\/strong>. See on suur lahing Ockhami habeme ja inimese-eleva vahel!<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00dche vastutuse printsiip. Ei ole nii lihtne, nagu tundub\" src=\"\/wp-content\/uploads\/2019\/06\/2e349a5b119a511d716341f3f6725844.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>N\u00fc\u00fcd peaks joodikul olema lihtsam. Peale selle, et IPourLogger logijate jagamist kolmes klassis pole, saame ka k\u00f5ik logijad kokku \u00fchendada \u00fchte t\u00fc\u00fcp:<\/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>Ja kui meie neljas operatsioonit\u00fc\u00fcp lisandub, on logimine selle jaoks juba valmis. Ja operatsioonide kood ise on puhas ning vabastatud infrastruktuuri m\u00fcrast.<\/p>\n<p><\/p>\n<p>Seet\u00f5ttu on meil viis klassi \u00fclesande t\u00e4itmiseks:<\/p>\n<p><\/p>\n<ul>\n<li>Valamise operatsioon<\/li>\n<li>Joomise operatsioon<\/li>\n<li>S\u00f6\u00f6gioperatsioon<\/li>\n<li>Logija<\/li>\n<li>Joobnute fasad<\/li>\n<\/ul>\n<p><\/p>\n<p>Iga\u00fcks neist vastutab rangelt \u00fche funktsionaalsuse eest, omades \u00fche muutmise p\u00f5hjust. K\u00f5ik sarnased muutmisreeglid on l\u00e4heduses. <\/p>\n<p>\n<b class=\"spoiler_title\">N\u00e4ide reaalsest elust<\/b><\/p>\n<p>Kord kirjutasime B2B kliendi automaatse registreerimise teenust. Ja ilmnes jumala meetod, mille pikkus oli 200 rida sarnast sisu:<\/p>\n<p><\/p>\n<ul>\n<li>Mine 1C-sse ja ava konto<\/li>\n<li>Selle kontoga mine maksemoodulisse ja registreeri see seal<\/li>\n<li>Kontrolli, et sellise kontoga konto ei oleks peamises s\u00fcsteemis loodud <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/et\/server\/dts-dronten\/\"   title=\"serveris\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2485\">serveris<\/a><\/li>\n<li>Loo uus konto<\/li>\n<li>Registreerimise tulemused maksemoodulis ja 1C number lisa registreerimise tulemuste teenusesse<\/li>\n<li>Lisa sellesse tabelisse konto teave<\/li>\n<li>Loo punktinumber selle kliendi jaoks punktiteenuses. Edasta sellele teenusele 1C konto number.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ja selles nimekirjas oli veel umbes 10 \u00e4ritegevust, millel oli kohutav omavaheline s\u00f5ltuvus. Konto objekt oli vajalik peaaegu k\u00f5igile. Punkti identifikaator ja kliendi nimi olid vajalikud pooled kutsed.<\/p>\n<p><\/p>\n<p>P\u00e4rast tunni pikkust refaktoreerimist suutsime eraldada infrastruktuuri koodi ja m\u00f5ned konto t\u00f6\u00f6 n\u00fcansid eraldi meetoditeks\/klassideks. Jumala meetod kergendus, kuid j\u00e4\u00e4nud oli 100 koodirida, mis ei soovinud end kududa. <\/p>\n<p><\/p>\n<p>Ainult m\u00f5ne p\u00e4eva p\u00e4rast tuli arusaamine, et selle &#171;kergendatud&#187; meetodi olemus ongi \u00e4rialgoritm. Ja et algne spetsifikatsiooni kirjeldus oli \u00fcsna keeruline. Ja see, et see meetod t\u00fckkideks jagada, rikub SRP-d, mitte vastupidi. <\/p>\n<p><\/p>\n<h2 id=\"formalizm\">Formalism.<\/h2>\n<p><\/p>\n<p>On aeg j\u00e4tta meie joobnukesed rahule. Kustuta pisarad \u2014 me kindlasti naaseme tema juurde kunagi. Ja n\u00fc\u00fcd formaliseerime selle artikli teadmised. <\/p>\n<p><\/p>\n<h4 id=\"formalizm-1-opredelenie-srp\">Formalism 1. SRP m\u00e4\u00e4ratlemine<\/h4>\n<p><\/p>\n<ol>\n<li>Eraldage elemendid nii, et iga\u00fchel neist oleks ainult \u00fcks vastutus.<\/li>\n<li>Vastutus t\u00e4hendab &#171;mise p\u00f5hjust&#187;. See t\u00e4hendab, et igal elemendil on ainult \u00fcks muutmise p\u00f5hjus, \u00e4riloogika m\u00f5istes.<\/li>\n<li>Potentsiaalsed muudatused \u00e4riloogikas peavad olema lokaliseeritud. Muudetavad s\u00fcnkroonsed elemendid peaksid olema k\u00f5rvuti.<\/li>\n<\/ol>\n<p><\/p>\n<h4 id=\"formalizm-2-neobhodimye-kriterii-samoproverki\">Formalisme 2. Vajalikud iset\u00f5endi kriteeriumid.<\/h4>\n<p><\/p>\n<p>Ma ei ole kohtunud piisavate SRP t\u00e4itmise kriteeriumidega. Kuid on m\u00f5ned vajalikud tingimused:<\/p>\n<p><\/p>\n<p>1) K\u00fcsi endalt k\u00fcsimus - mida teeb see klass\/metod\/moodul\/teenus. Pead sellele vastama lihtsa m\u00e4\u00e4ratlusega. (Ait\u00e4h <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\">selgitused<\/b><\/p>\n<p>Kuid vahel on lihtsa m\u00e4\u00e4ratluse leidmine v\u00e4ga keeruline <\/p>\n<p><\/p>\n<p>2) Teatud vea parandamine v\u00f5i uue funktsiooni lisamine m\u00f5jutab minimaalset arvu faile\/klasse. Ideaalis - \u00fcks. <\/p>\n<p>\n<b class=\"spoiler_title\">selgitused<\/b><\/p>\n<p>Kuna vastutus (funktsiooni v\u00f5i vea) on kapseldatud \u00fchte faili\/klassidesse, tead kindlalt, kus otsida ja mida muuta. N\u00e4iteks: funktsioon, mis muudab logimise v\u00e4ljundit, n\u00f5uab muutmist ainult logijalt. Teise koodi vahtimise ei ole vaja. <\/p>\n<p><\/p>\n<p>Teine n\u00e4ide - uue kasutajaliidese kontrolli lisamine, mis sarnaneb eelnevale. Kui see sunnib sind lisama 10 erinevat elementi ja 15 erinevat konverteerijat - tundub, et oled \"liialdanud\".<\/p>\n<p><\/p>\n<p>3) Kui mitmed arendajad t\u00f6\u00f6tavad erinevate funktsioonide kallal teie projektis, on t\u00f5en\u00e4osus merge-konflikti, st t\u00f5en\u00e4osus, et sama faili\/klassiga muudetakse korraga mitme arendaja poolt - minimaalne.<\/p>\n<p>\n<b class=\"spoiler_title\">selgitused<\/b><\/p>\n<p>Kui uue operatsiooni \"Valage viina laua alla\" lisamisel pead sa haarama logijast, joomise ja valamise operatsioonidest - siis n\u00e4ib, et vastutus on valesti jagatud. Muidugi ei ole see alati v\u00f5imalik, kuid tuleb p\u00fc\u00fcda seda n\u00e4itajat v\u00e4hendada. <\/p>\n<p><\/p>\n<p>4) T\u00e4psustava k\u00fcsimuse puhul \u00e4riloogika kohta (arendajalt v\u00f5i juhilt) kaevud rangelt \u00fchte klassi\/ faili ja saad teavet ainult sealt.<\/p>\n<p>\n<b class=\"spoiler_title\">selgitused<\/b><\/p>\n<p>Funktsioonid, reeglid v\u00f5i algoritmid on kompaktselt kirjutatud iga\u00fches \u00fches kohas, mitte laiali visatud lippudena \u00fcle kogu koodi ruumi.<\/p>\n<p><\/p>\n<p>5) Nimeandmine on arusaadav.<\/p>\n<p>\n<b class=\"spoiler_title\">selgitused<\/b><\/p>\n<p>Meie klass v\u00f5i metod on vastutav millegi \u00fche eest, ja vastutus peegeldub selle nimes.<\/p>\n<p><\/p>\n<p>AllManagersManagerService - t\u00f5en\u00e4oliselt Jumal-klass<br \/>\nLocalPayment - t\u00f5en\u00e4oliselt mitte <\/p>\n<p><\/p>\n<h4 id=\"formalizm-3-metodika-razrabotki-okkama-first\">Formalisme 3. Arendamise meetod \"Okkami-esimene\".<\/h4>\n<p><\/p>\n<p>Projekti kavandamise alguses ei tea inimesest ahv k\u00f5iki lahendatava \u00fclesande n\u00fcansse ja v\u00f5ib eksida. Eksida saab erinevalt:<\/p>\n<p><\/p>\n<ul>\n<li>Teha liiga suuri objekte, \u00fchendades erinevaid vastutusi<\/li>\n<li>H\u00e4vitada, jagades \u00fche vastutuse paljude erinevate t\u00fc\u00fcpide peale<\/li>\n<li>Vale vastutuse piiride m\u00e4\u00e4ratlemine<\/li>\n<\/ul>\n<p><\/p>\n<p>Oluline on meeles pidada reeglit: \u201eparem on eksida suuruses\u201c, v\u00f5i \u201ekui pole kindel \u2014 \u00e4ra j\u00e4ta natuke\u201d. N\u00e4iteks, kui teie klass kogub kahte vastutust \u2014 on see endiselt arusaadav ja seda saab jagada kaheks minimaalse muutusega kliendi koodis. Klaasi kokku panemine klaasikildudest on tavaliselt keerulisem, kuna kontekst on jaotatud mitmesse faili ja vajalikud s\u00f5ltuvused puuduvad kliendi koodis. <\/p>\n<p><\/p>\n<h2 id=\"pora-zakruglyatsya\">On aeg l\u00f5petada<\/h2>\n<p><\/p>\n<p>SRP kasutusala ei piirdu OOP ja SOLIDiga. See on rakendatav meetoditele, funktsioonidele, klassidele, moodulitele, mikroteenustele ja teenustele. Seda saab rakendada nii \u201efigaks-figaks-ja-\u00fche-kordselt\u201d kui ka \u201erakett-teadus\u201d arenduses, muutes igal pool maailma veidi paremaks. Kui m\u00f5elda, siis see on peaaegu kogu inseneritehnika fundamentaalne p\u00f5him\u00f5te. Masinatootmine, juhtimisse s\u00fcsteemid ja \u00fcldiselt k\u00f5ik keerulised s\u00fcsteemid \u2014 ehitatakse komponentidest, ning \u201e\u00fched pole piisavad\u201d l\u00f5hub ehitajate paindlikkust, \u201eliigne killustamine\u201d \u2014 efektiivsust, ja valed piirid \u2014 arusaama ja vaimset rahu. <\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00dche vastutuse printsiip. Ei ole nii lihtne, nagu tundub\" src=\"\/wp-content\/uploads\/2019\/06\/b70fb2b0b87cf90d41462263e839902b.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>SRP ei ole loodud looduse poolt ega ole osa t\u00e4psest teadusest. See tuleneb meie bioloogilistest ja ps\u00fchholoogilistest piirangutest. See on lihtsalt viis, kuidas kontrollida ja arendada keerulisi s\u00fcsteeme inimesena-\u00e4sja. See \u00fctleb meile, kuidas dekomponeerida s\u00fcsteemi. Algne s\u00f5nastus n\u00f5udis m\u00e4rkimisv\u00e4\u00e4rset telepaatia oskust, kuid loodan, et see artikkel ajas veidi suitsukatet selgemaks.<\/p>\n<p>Allikas: <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.1.1 - 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\/et\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/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\udd47\u00dche vastutuse p\u00f5him\u00f5te. Pole nii lihtne, nagu paistab | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/et\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/34828","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=34828"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/34828\/revisions"}],"predecessor-version":[{"id":159767,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/34828\/revisions\/159767"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/26229"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=34828"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=34828"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=34828"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}