{"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\/sv\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","title":{"rendered":"Principen om enkel ansvarighet. Inte s\u00e5 enkelt som det verkar","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Principen om enkel ansvarighet. Inte s\u00e5 enkelt som det verkar\" src=\"\/wp-content\/uploads\/2019\/06\/5b253ff55e3c97b6baf5f7a7ae7f3b98.JPG\" style=\"display:block;margin: 0 auto;\" \/> Single responsibility principle, \u00e4ven k\u00e4nt som principen f\u00f6r enhetligt ansvar,<br \/>\nden \u00e4r ocks\u00e5 principen f\u00f6r enhetlig f\u00f6r\u00e4ndring \u2013 en ganska glidig och nerv\u00f6s fr\u00e5ga under programmerarintervjuer. <\/p>\n<p><\/p>\n<p>Min f\u00f6rsta seri\u00f6sa bekantskap med denna princip skedde i b\u00f6rjan av f\u00f6rsta terminen, n\u00e4r vi, unga och gr\u00f6na, blev tagna till skogen f\u00f6r att g\u00f6ra om studenterna till riktiga studenter.<\/p>\n<p><\/p>\n<p>I skogen delades vi upp i grupper om 8-9 personer i varje och en t\u00e4vling anordnades \u2013 vilken grupp som snabbast kunde dricka en flaska vodka, med f\u00f6ruts\u00e4ttningen att den f\u00f6rsta personen i gruppen h\u00e4ller vodka i glaset, den andra dricker och den tredje \u00e4ter n\u00e5got. Den som genomf\u00f6rt sin uppgift st\u00e4ller sig sist i k\u00f6n. <\/p>\n<p><\/p>\n<p>Situationen d\u00e4r k\u00f6n var delbar med tre var en bra implementering av SRP.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <\/p>\n<h2 id=\"opredelenie-1-edinaya-otvetstvennost\">Definition 1. Enhetligt ansvar.<\/h2>\n<p><\/p>\n<p>Den officiella definitionen av principen f\u00f6r enhetligt ansvar (SRP) s\u00e4ger att varje objekt har ett eget ansvar och sk\u00e4l att existera, och detta ansvar \u00e4r endast ett.<\/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 \/>\nF\u00f6r att till\u00e4mpa SRP delar vi upp ansvaret p\u00e5 tre: <\/p>\n<p><\/p>\n<ul>\n<li>En h\u00e4ller (<strong>PourOperation<\/strong>)<\/li>\n<li>En dricker (<strong>DrinkUpOperation<\/strong>)<\/li>\n<li>En \u00e4ter (<strong>TakeBiteOperation<\/strong>)<\/li>\n<\/ul>\n<p><\/p>\n<p>Varje deltagare i processen ansvarar f\u00f6r en komponent av processen, vilket inneb\u00e4r att de har ett atom\u00e4rt ansvar \u2013 att dricka, h\u00e4lla eller \u00e4ta. <\/p>\n<p><\/p>\n<p>Tipplern \u00e4r \u00e5 sin sida en fasad f\u00f6r dessa operationer:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class Tippler {\n    \/\/...\n    void Act(){\n        _pourOperation.Do() \/\/ h\u00e4lla\n        _drinkUpOperation.Do() \/\/ dricka\n        _takeBiteOperation.Do() \/\/ \u00e4ta\n    }\n}<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Principen om enkel ansvarighet. Inte s\u00e5 enkelt som det verkar\" src=\"\/wp-content\/uploads\/2019\/06\/8d591a474e3555edfee3ffebc28d079b.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4 id=\"zachem\">Varf\u00f6r?<\/h4>\n<p><\/p>\n<p>M\u00e4nniskan-programmeraren skriver kod f\u00f6r m\u00e4nniskan-apan, och m\u00e4nniskan-apan \u00e4r ouppm\u00e4rksam, dum och rusar alltid vidare n\u00e5gonstans. Han kan h\u00e5lla och f\u00f6rst\u00e5 cirka 3 till 7 termer vid ett och samma tillf\u00e4lle.<br \/>\nI fallet med Tipplern \u00e4r dessa termer tre. Men om vi skriver koden som en l\u00e5ng text, s\u00e5 dyker h\u00e4nder, glas, slagsm\u00e5l och o\u00e4ndliga diskussioner om politik upp. Och allt detta kommer att vara i kroppen av en metod. Jag \u00e4r s\u00e4ker p\u00e5 att du har sett s\u00e5dan kod i din praktik. Det \u00e4r inte det mest humana provet f\u00f6r psyket.<\/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>D\u00e4rf\u00f6r dekomponerar programmerande m\u00e4nniskor komplexa mekanismer i en upps\u00e4ttning mindre komplexa och fungerande element. Men de kan dekomponera p\u00e5 olika s\u00e4tt: i m\u00e5nga gamla bilar g\u00e5r luftkanalen ut i d\u00f6rren, medans en modern bils elektroniska l\u00e5s kan misslyckas och hindra motorn fr\u00e5n att starta, vilket kan vara frustrerande vid reparation.<\/p>\n<p><\/p>\n<p>S\u00e5 <strong>SRP \u00e4r en princip som f\u00f6rklarar HUR man dekomponerar, det vill s\u00e4ga var man ska dra linjen f\u00f6r uppdelning.<\/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=\"Principen om enkel ansvarighet. Inte s\u00e5 enkelt som det verkar\" src=\"\/wp-content\/uploads\/2019\/06\/b1980c3dc9742b921eb818f14fe3527e.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>L\u00e5t oss \u00e5terv\u00e4nda till dryckaren och de f\u00f6rdelar som m\u00e4nniskan-apa f\u00e5r vid dekomponering: <\/p>\n<p><\/p>\n<ul>\n<li>Koden blir mycket tydlig p\u00e5 varje niv\u00e5.<\/li>\n<li>Koden kan skrivas av flera programmerare samtidigt (var och en skriver ett separat element).<\/li>\n<li>Automatiserad testning underl\u00e4ttas \u2014 ju enklare elementet \u00e4r, desto l\u00e4ttare \u00e4r det att testa.<\/li>\n<li>Kodens komposition framtr\u00e4der \u2014 det g\u00e5r att byta ut <strong>DrinkUpOperation<\/strong> mot en operation d\u00e4r dryckaren h\u00e4ller ut v\u00e4tska under bordet. Eller byta ut h\u00e4lloperationen mot en d\u00e4r du blandar vin och vatten eller vodka och \u00f6l. Beroende p\u00e5 aff\u00e4rens krav kan du g\u00f6ra allt detta utan att r\u00f6ra koden f\u00f6r metoden. <strong>Tippler.Act<\/strong>. <\/li>\n<li>Utifr\u00e5n dessa operationer kan du kombinera glutton (anv\u00e4nder bara <strong>TakeBitOperation<\/strong>), alkoholisten (anv\u00e4nder bara <strong>DrinkUpOperation<\/strong> direkt fr\u00e5n flaskan) och uppfylla m\u00e5nga andra aff\u00e4rsbehov.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>(Ojd\u00e5, ser ut som detta redan \u00e4r en OCP-princip, och jag har brutit mot detta inl\u00e4ggets ansvar.) <\/em><\/p>\n<p><\/p>\n<p>Och s\u00e5klart, nackdelarna: <\/p>\n<p><\/p>\n<ul>\n<li>Det kommer att kr\u00e4vas att skapa fler typer. <\/li>\n<li>Dryckaren kommer att dricka ett par timmar senare \u00e4n han skulle kunna.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"opredelenie-2-edinaya-izmenchivost\">Definition 2. Enhetlig f\u00f6r\u00e4ndring.<\/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>L\u00e5t oss betrakta tv\u00e5 implementationer av drinkaren. Den f\u00f6rsta, som n\u00e4mndes ovan, inneh\u00e5ller tre klasser \u2013 h\u00e4lla, dricka och snaska.<\/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>Klausul!<\/p>\n<p><\/p>\n<p>D\u00e5 tar vi oss en titt p\u00e5 internet och l\u00e4r oss en annan definition av SRP \u2013 Principen om enstaka f\u00f6r\u00e4ndring (Single Changeability Principle).<\/p>\n<p><\/p>\n<p>SCP \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e &#171;<strong>Modulen har en och enbart en anledning till f\u00f6r\u00e4ndring<\/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>(Tydligen var killarna som kom p\u00e5 den ursprungliga definitionen \u00f6vertygade om m\u00e4nniskans telepatiska f\u00f6rm\u00e5gor)<\/em><\/p>\n<p><\/p>\n<p>Nu faller allt p\u00e5 plats. Separat kan vi \u00e4ndra procedurerna f\u00f6r att h\u00e4lla, dricka och snaska, och i sj\u00e4lva drinkaren kan vi bara \u00e4ndra sekvensen och sammans\u00e4ttningen av operationerna, till exempel genom att flytta snacket till f\u00f6re drickandet eller l\u00e4gga till en sk\u00e5l.<\/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>. Detta kan vara l\u00e4sbart och effektivt n\u00e4r logiken \u00e4r minimal och s\u00e4llan f\u00f6r\u00e4ndras, men ofta slutar det med hemska metoder p\u00e5 500 rader vardera, med fler if-satser \u00e4n som kr\u00e4vs f\u00f6r att Ryssland ska g\u00e5 med i NATO. <\/p>\n<p><\/p>\n<h2 id=\"opredelenie-3-lokalizaciya-izmeneniy\">Definition 3. Lokalisering av f\u00f6r\u00e4ndringar.<\/h2>\n<p><\/p>\n<p>Drinkare f\u00f6rst\u00e5r ofta inte varf\u00f6r de vaknar i n\u00e5gon annans l\u00e4genhet, eller var deras mobiltelefon \u00e4r. Det \u00e4r dags att l\u00e4gga till detaljerad loggning.<\/p>\n<p><\/p>\n<p>Vi b\u00f6rjar loggningen med h\u00e4llprocessen:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class PourOperation: IOperation{\n    PourOperation(ILogger log \/*....*\/){\/*...*\/}\n    \/\/...\n    void Do(){\n        _log.Log($\"Innan h\u00e4llning med {_hand} och {_bottle}\");\n        \/\/H\u00e4ll aff\u00e4rslogik ...\n        _log.Log($\"Efter h\u00e4llning med {_hand} och {_bottle}\");\n    }\n}<\/code><\/pre>\n<p><\/p>\n<p>Inkaplulerar den i <strong>PourOperation<\/strong>, vi har agerat klokt n\u00e4r det g\u00e4ller ansvar och inkapsling, men nu har vi en klurig situation n\u00e4r det g\u00e4ller f\u00f6r\u00e4nderliga principer. Ut\u00f6ver sj\u00e4lva operationen, som kan f\u00f6r\u00e4ndras, blir \u00e4ven loggningen f\u00f6r\u00e4ndlig. Vi kommer att beh\u00f6va separera och skapa en specialiserad loggare f\u00f6r h\u00e4lloperationen:<\/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             \/\/... aff\u00e4rslogik\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>Den noggranna l\u00e4saren kommer att m\u00e4rka att <strong>LogAfter<\/strong>, <strong>LogBefore<\/strong> och <strong>OnError<\/strong> kan ocks\u00e5 f\u00f6r\u00e4ndras separat, och i likhet med tidigare \u00e5tg\u00e4rder kommer tre klasser att skapas: <strong>PourLoggerBefore<\/strong>, <strong>PourLoggerAfter<\/strong> och <strong>PourErrorLogger<\/strong>.<\/p>\n<p><\/p>\n<p>Och med tanke p\u00e5 att det finns tre operationer f\u00f6r h\u00e4llandet, f\u00e5r vi nio loggningsklasser. Totalt best\u00e5r h\u00e4lloperationen av 14 (!!!) klasser.<\/p>\n<p><\/p>\n<p>Hyperbol? Sannolikt inte! M\u00e4nniskoskapelsen med en dekompositionsgranat kommer att krossa \"h\u00e4llaren\" i karaff, glas, h\u00e4lloperat\u00f6rer, vattenleveransservice, den fysiska modellen f\u00f6r molekylkollisioner, och under n\u00e4sta kvartal kommer den att f\u00f6rs\u00f6ka reda ut beroenden utan globala variabler. Och tro mig - den kommer inte att stanna.<\/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>... utan att veta om existensen av den tredje definitionen av 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>liknande objekt f\u00f6r f\u00f6r\u00e4ndring b\u00f6r f\u00f6rvaras p\u00e5 ett st\u00e4lle<\/strong>&#171;. \u0438\u043b\u0438 \u201c<strong>Det som f\u00f6r\u00e4ndras tillsammans b\u00f6r f\u00f6rvaras p\u00e5 ett st\u00e4lle.<\/strong>\u201d<\/p>\n<p><\/p>\n<p>Det vill s\u00e4ga, om vi \u00e4ndrar loggningen av operationen, s\u00e5 m\u00e5ste vi g\u00f6ra det p\u00e5 ett st\u00e4lle.<\/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>. Detta \u00e4r det stora slaget mellan Ockhams rakkniv och m\u00e4nniskoskapelsen!<\/p>\n<p>\n<img decoding=\"async\" alt=\"Principen om enkel ansvarighet. Inte s\u00e5 enkelt som det verkar\" src=\"\/wp-content\/uploads\/2019\/06\/2e349a5b119a511d716341f3f6725844.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nu b\u00f6r det bli l\u00e4ttare f\u00f6r h\u00e4llaren. F\u00f6rutom att vi inte beh\u00f6ver dela loggaren IPourLogger i tre klasser, kan vi ocks\u00e5 samla alla loggare i en typ:<\/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>Och om vi l\u00e4gger till en fj\u00e4rde typ av operation, s\u00e5 \u00e4r loggningen redan klar f\u00f6r den. Och koden f\u00f6r sj\u00e4lva operationerna \u00e4r ren och fri fr\u00e5n infrastruktursbrus.<\/p>\n<p><\/p>\n<p>Resultatet \u00e4r att vi har 5 klasser f\u00f6r att l\u00f6sa problemet med drickande:<\/p>\n<p><\/p>\n<ul>\n<li>H\u00e4gningsoperation<\/li>\n<li>Uppdragsutf\u00f6rande<\/li>\n<li>\u00c4tandeoperation<\/li>\n<li>Loggskribent<\/li>\n<li>Bara f\u00f6r drickande<\/li>\n<\/ul>\n<p><\/p>\n<p>Varje klass ansvarar strikt f\u00f6r en funktionalitet och har ett enda sk\u00e4l f\u00f6r f\u00f6r\u00e4ndring. Alla liknande regler f\u00f6r f\u00f6r\u00e4ndring ligger n\u00e4ra varandra. <\/p>\n<p>\n<b class=\"spoiler_title\">Exempel fr\u00e5n verkliga livet<\/b><\/p>\n<p>En g\u00e5ng skrev vi en tj\u00e4nst f\u00f6r automatisk registrering av b2b-kunder. Och en GOD-metod p\u00e5 200 rader liknande inneh\u00e5ll d\u00f6k upp:<\/p>\n<p><\/p>\n<ul>\n<li>G\u00e5 till 1C och registrera ett konto<\/li>\n<li>Med det kontot, g\u00e5 till betalningsmodulen och registrera det d\u00e4r<\/li>\n<li>Kontrollera att ett konto med det kontot inte redan finns i huvudsystemet <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/sv\/server\/dts-dronten\/\"   title=\"servern\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2485\">servern<\/a><\/li>\n<li>Skapa ett nytt konto<\/li>\n<li>Registreringsresultatet i betalningsmodulen och numret 1C l\u00e4ggs till i registreringstj\u00e4nsten<\/li>\n<li>L\u00e4gg till information om kontot i den h\u00e4r tabellen<\/li>\n<li>Skapa en punktnummer f\u00f6r den h\u00e4r kunden i punkttj\u00e4nsten. Skicka punktnumret 1C till den tj\u00e4nsten.<\/li>\n<\/ul>\n<p><\/p>\n<p>Och det fanns omkring 10 andra aff\u00e4rsoperationer i den h\u00e4r listan med fruktansv\u00e4rd koppling. Kontoobjektet beh\u00f6vdes av n\u00e4stan alla. Punktidentifierare och kundnamn beh\u00f6vdes i h\u00e4lften av anropen.<\/p>\n<p><\/p>\n<p>Efter en timmes refaktorering kunde vi separera infrastrukturskoden och vissa nyanser av arbete med kontot i separata metoder\/klasser. Godmetoden blev l\u00e4ttare, men fortfarande fanns det 100 rader kod som inte ville l\u00f6sa sig. <\/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\">Formalism.<\/h2>\n<p><\/p>\n<p>Det \u00e4r dags att l\u00e4mna v\u00e5r drickare i fred. Torka t\u00e5rarna - vi kommer definitivt att \u00e5terkomma till honom n\u00e5gon g\u00e5ng. Men nu formaliserar vi kunskaperna fr\u00e5n denna artikel. <\/p>\n<p><\/p>\n<h4 id=\"formalizm-1-opredelenie-srp\">Formalism 1. Definition av SRP<\/h4>\n<p><\/p>\n<ol>\n<li>Separera element s\u00e5 att var och en av dem ansvarar f\u00f6r n\u00e5got enskilt.<\/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>Potentiella f\u00f6r\u00e4ndringar av aff\u00e4rslogik m\u00e5ste lokaliseras. \u00c4ndringsbara synkrona element b\u00f6r placeras n\u00e4ra varandra.<\/li>\n<\/ol>\n<p><\/p>\n<h4 id=\"formalizm-2-neobhodimye-kriterii-samoproverki\">Formalism 2. N\u00f6dv\u00e4ndiga sj\u00e4lvgenererade kriterier.<\/h4>\n<p><\/p>\n<p>Jag har inte st\u00f6tt p\u00e5 tillr\u00e4ckliga kriterier f\u00f6r att uppfylla SRP. Men det finns n\u00f6dv\u00e4ndiga villkor:<\/p>\n<p><\/p>\n<p>1) St\u00e4ll dig sj\u00e4lv fr\u00e5gan - vad g\u00f6r denna klass\/metod\/modul\/tj\u00e4nst. Du b\u00f6r kunna svara p\u00e5 den med en enkel definition. (Tack) <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\">f\u00f6rklaringar<\/b><\/p>\n<p>Det \u00e4r dock ibland mycket sv\u00e5rt att hitta en enkel definition <\/p>\n<p><\/p>\n<p>2) Fixandet av ett visst fel eller till\u00e4gg av en ny funktion p\u00e5verkar ett minimalt antal filer\/klasser. Idealiskt - en. <\/p>\n<p>\n<b class=\"spoiler_title\">f\u00f6rklaringar<\/b><\/p>\n<p>Eftersom ansvaret (f\u00f6r funktionen eller felet) \u00e4r inkapslat i en fil\/klass, vet du exakt var du ska leta och vad du ska \u00e4ndra. Till exempel: funktionen f\u00f6r att \u00e4ndra loggningen av operationer kr\u00e4ver endast att loggaren \u00e4ndras. Det beh\u00f6vs inte att jaga runt i resten av koden. <\/p>\n<p><\/p>\n<p>Ett annat exempel - till\u00e4gget av en ny UI-kontroll, liknande tidigare. Om detta f\u00e5r dig att beh\u00f6va l\u00e4gga till 10 olika enheter och 15 olika konverterare - tycks det som om du har \"\u00f6verarbetat\".<\/p>\n<p><\/p>\n<p>3) Om flera utvecklare arbetar med olika funktioner i ditt projekt, s\u00e5 \u00e4r risken f\u00f6r merge-konflikt, det vill s\u00e4ga risken f\u00f6r att samma fil\/klass \u00e4ndras av flera utvecklare samtidigt - minimal.<\/p>\n<p>\n<b class=\"spoiler_title\">f\u00f6rklaringar<\/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) Vid klarg\u00f6rande fr\u00e5gor om aff\u00e4rslogik (fr\u00e5n utvecklaren eller managern) gr\u00e4ver du strikt i en enda klass\/fil och f\u00e5r informationen endast d\u00e4rifr\u00e5n.<\/p>\n<p>\n<b class=\"spoiler_title\">f\u00f6rklaringar<\/b><\/p>\n<p>Funktioner, regler eller algoritmer skrivs kompakt, var och en p\u00e5 en plats, och inte spridda som flaggor \u00f6ver hela kodutrymmet.<\/p>\n<p><\/p>\n<p>5) Namngivningen \u00e4r tydlig.<\/p>\n<p>\n<b class=\"spoiler_title\">f\u00f6rklaringar<\/b><\/p>\n<p>V\u00e5r klass eller metod \u00e4r ansvarig f\u00f6r n\u00e5got enda, och ansvaret \u00e5terspeglas i dess namn<\/p>\n<p><\/p>\n<p>AllManagersManagerService - \u00e4r f\u00f6rmodligen en Gud-klass<br \/>\nLocalPayment - sannolikt inte <\/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>I b\u00f6rjan av designen vet inte apmannen alla nyanser av det problem som ska l\u00f6sas och kan g\u00f6ra misstag. Man kan fela p\u00e5 olika s\u00e4tt:<\/p>\n<p><\/p>\n<ul>\n<li>Att g\u00f6ra f\u00f6r stora objekt genom att klistra samman olika ansvar<\/li>\n<li>Att dela upp ett enhetligt ansvar i m\u00e5nga olika typer<\/li>\n<li>Felaktigt definiera gr\u00e4nser f\u00f6r ansvar<\/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\">Det \u00e4r dags att avrunda<\/h2>\n<p><\/p>\n<p>Till\u00e4mpningsomr\u00e5det f\u00f6r SRP \u00e4r inte begr\u00e4nsat till OOP och SOLID. Det \u00e4r till\u00e4mpligt p\u00e5 metoder, funktioner, klasser, moduler, mikrotj\u00e4nster och tj\u00e4nster. Det \u00e4r till\u00e4mpligt b\u00e5de p\u00e5 \"fixa-fixa-och-i-produktion\" och \"raketvetenskap\" utveckling, och g\u00f6r v\u00e4rlden lite b\u00e4ttre \u00f6verallt. Om man t\u00e4nker efter \u00e4r det knappt inte en grundl\u00e4ggande princip f\u00f6r all ingenj\u00f6rskonst. Maskinteknik, styrsystem och faktiskt alla komplexa system byggs av komponenter, och \"underuppdelning\" tar bort konstrukt\u00f6rernas flexibilitet, \"\u00f6veruppdelning\" tar bort effektiviteten, och felaktiga gr\u00e4nser tar bort f\u00f6rnuft och sj\u00e4lslig ro. <\/p>\n<p>\n<img decoding=\"async\" alt=\"Principen om enkel ansvarighet. Inte s\u00e5 enkelt som det verkar\" src=\"\/wp-content\/uploads\/2019\/06\/b70fb2b0b87cf90d41462263e839902b.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>SRP \u00e4r inte uppt\u00e4ckt av naturen och \u00e4r inte en del av en exakt vetenskap. Det kommer fr\u00e5n v\u00e5ra biologiska och psykologiska begr\u00e4nsningar. Det \u00e4r helt enkelt ett s\u00e4tt att kontrollera och utveckla komplexa system med hj\u00e4lp av den m\u00e4nskliga apan. Det l\u00e4r oss hur man dekomponerar ett system. Den ursprungliga formuleringen kr\u00e4vde en hel del telepatiska f\u00e4rdigheter, men jag hoppas att denna artikel har lyft lite av dimman.<\/p>\n<p>K\u00e4lla: <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\/sv\/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=\"sv_SE\" \/>\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\/sv\/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. Inte s\u00e5 enkel som den verkar | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/34828","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=34828"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/34828\/revisions"}],"predecessor-version":[{"id":159767,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/34828\/revisions\/159767"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/26229"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=34828"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=34828"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=34828"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}