{"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\/it\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","title":{"rendered":"Principio di Responsabilit\u00e0 Singola. Non \u00e8 cos\u00ec semplice come sembra","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Principio di Responsabilit\u00e0 Singola. Non \u00e8 cos\u00ec semplice come sembra\" src=\"\/wp-content\/uploads\/2019\/06\/5b253ff55e3c97b6baf5f7a7ae7f3b98.JPG\" style=\"display:block;margin: 0 auto;\" \/> Principio di responsabilit\u00e0 singola, noto anche come principio di unica responsabilit\u00e0,<br \/>\n\u00e8 un principio estremamente scivoloso per essere compreso e una questione cos\u00ec nervosa durante i colloqui per programmatori. <\/p>\n<p><\/p>\n<p>Il mio primo serio incontro con questo principio \u00e8 avvenuto all'inizio del primo anno, quando noi giovani e inesperti siamo stati portati nel bosco per trasformare i bruchi in studenti veri.<\/p>\n<p><\/p>\n<p>Nel bosco siamo stati divisi in gruppi di 8-9 persone ciascuno e abbiamo organizzato una competizione: quale gruppo riesce a bere pi\u00f9 velocemente una bottiglia di vodka, a patto che il primo della squadra versa la vodka nel bicchiere, il secondo beve e il terzo mangia Snack. L'unit\u00e0 che ha completato la propria operazione si posiziona alla fine della fila del gruppo. <\/p>\n<p><\/p>\n<p>Un caso in cui la dimensione della fila era un multiplo di tre \u00e8 stato una buona realizzazione del SRP.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <\/p>\n<h2 id=\"opredelenie-1-edinaya-otvetstvennost\">Definizione 1. Unica responsabilit\u00e0.<\/h2>\n<p><\/p>\n<p>La definizione ufficiale del principio di unica responsabilit\u00e0 (SRP) afferma che ogni oggetto ha la propria responsabilit\u00e0 e una ragione per esistere, e questa responsabilit\u00e0 \u00e8 unica.<\/p>\n<p><\/p>\n<p>Consideriamo l'oggetto \u00abBibi\u00bb (<strong>Tippler<\/strong>).<br \/>\nPer applicare il principio SRP dividiamo i compiti in tre: <\/p>\n<p><\/p>\n<ul>\n<li>Uno versa (<strong>PourOperation<\/strong>)<\/li>\n<li>Uno beve (<strong>DrinkUpOperation<\/strong>)<\/li>\n<li>Uno mangia (<strong>TakeBiteOperation<\/strong>)<\/li>\n<\/ul>\n<p><\/p>\n<p>Ogni partecipante al processo \u00e8 responsabile di un componente del processo, ovvero ha una responsabilit\u00e0 atomica \u2014 bere, versare o mangiare. <\/p>\n<p><\/p>\n<p>Il Bevitore, a sua volta, \u00e8 un facciata per queste operazioni:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class Tippler {\n    \/\/...\n    void Act(){\n        _pourOperation.Do() \/\/ versare\n        _drinkUpOperation.Do() \/\/ bere\n        _takeBiteOperation.Do() \/\/ mangiare\n    }\n}<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Principio di Responsabilit\u00e0 Singola. Non \u00e8 cos\u00ec semplice come sembra\" src=\"\/wp-content\/uploads\/2019\/06\/8d591a474e3555edfee3ffebc28d079b.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4 id=\"zachem\">Perch\u00e9?<\/h4>\n<p><\/p>\n<p>Il programmatore scrive codice per una scimmia, e la scimmia \u00e8 distratta, stupida e sempre di fretta. Pu\u00f2 mantenere e capire circa 3-7 termini in un momento.<br \/>\nNel caso del Bevitore, queste terminologie sono tre. Tuttavia, se scriviamo il codice in un unico grande blocco, appariranno mani, bicchieri, scazzottate e infinite dispute sulla politica. E tutto ci\u00f2 sar\u00e0 all'interno di un unico metodo. Sono sicuro che hai visto un codice del genere nella tua pratica. Non \u00e8 la prova pi\u00f9 umana per la psiche.<\/p>\n<p><\/p>\n<p>D'altro canto, l'uomo-scimmia \u00e8 impegnato a modellare oggetti del mondo reale nella sua testa. Nella sua immaginazione pu\u00f2 farli scontrare, assemblarli in nuovi oggetti e smontarli esattamente allo stesso modo. Immaginate un vecchio modello di auto. Potete immaginare di aprire la porta, svitare la copertura della porta e vedere i meccanismi dei finestrini, all'interno dei quali ci sono ingranaggi. Ma non potete vedere tutti i componenti dell'auto contemporaneamente, in un unico \u00ablisting\u00bb. Almeno l'\u00abuomo-scimmia\u00bb non pu\u00f2.<\/p>\n<p><\/p>\n<p>Pertanto, gli uomini-programmatori decomponendo i meccanismi complessi in un insieme di elementi meno complessi e funzionanti. Tuttavia, si pu\u00f2 decomporre in modi differenti: in molte auto vecchie, il condotto dell'aria esce dalla porta, e nelle moderne, un guasto all'elettronica della serratura impedisce al motore di avviarsi, causando problemi durante la riparazione.<\/p>\n<p><\/p>\n<p>Quindi, <strong>SRP \u00e8 il principio che spiega COME decomporre, cio\u00e8 dove tracciare la linea di separazione.<\/strong>. <\/p>\n<p><\/p>\n<p>Dice che \u00e8 necessario decomporsi secondo il principio di separazione \u00abdelle responsabilit\u00e0\u00bb, cio\u00e8 in base ai compiti di determinati oggetti.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Principio di Responsabilit\u00e0 Singola. Non \u00e8 cos\u00ec semplice come sembra\" src=\"\/wp-content\/uploads\/2019\/06\/b1980c3dc9742b921eb818f14fe3527e.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Torniamo all'alcolista e ai vantaggi che l'uomo-scimmia ottiene decomponendo: <\/p>\n<p><\/p>\n<ul>\n<li>Il codice diventa estremamente chiaro a ogni livello.<\/li>\n<li>Il codice pu\u00f2 essere scritto da pi\u00f9 programmatori contemporaneamente (ognuno scrive un elemento separato).<\/li>\n<li>Si semplifica il test automatico: pi\u00f9 semplice \u00e8 l'elemento, pi\u00f9 facile \u00e8 testarlo.<\/li>\n<li>Si sviluppa la compositivit\u00e0 del codice: si pu\u00f2 sostituire <strong>DrinkUpOperation<\/strong> con un'operazione in cui l'alcolista versa un liquido sotto il tavolo. Oppure sostituire l'operazione di versamento con una operazione in cui mescoli vino e acqua o vodka e birra. A seconda delle esigenze del business, puoi fare tutto ci\u00f2, senza toccare il codice del metodo. <strong>Tippler.Act<\/strong>. <\/li>\n<li>Da queste operazioni puoi assemblare un ingordo (utilizzando solo <strong>TakeBitOperation<\/strong>), un alcolista (utilizzando solo <strong>DrinkUpOperation<\/strong> direttamente dalla bottiglia) e soddisfare molte altre esigenze di business.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>(Oh, sembra che questo sia gi\u00e0 il principio OCP, e ho violato la responsabilit\u00e0 di questo post). <\/em><\/p>\n<p><\/p>\n<p>E, naturalmente, ci sono svantaggi: <\/p>\n<p><\/p>\n<ul>\n<li>Sar\u00e0 necessario creare pi\u00f9 tipi. <\/li>\n<li>L'alcolista berr\u00e0 per la prima volta un paio d'ore pi\u00f9 tardi di quanto potrebbe.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"opredelenie-2-edinaya-izmenchivost\">Definizione 2. Variazione uniforme.<\/h2>\n<p><\/p>\n<p>Permettetemi, signori! La classe bibi ha anche una singola responsabilit\u00e0 \u2014 beve! E in generale, la parola \u00abresponsabilit\u00e0\u00bb \u00e8 un concetto estremamente vago. Qualcuno \u00e8 responsabile del destino dell'umanit\u00e0, mentre qualcun altro \u00e8 responsabile di sollevare i pinguini rovesciati al polo.<\/p>\n<p><\/p>\n<p>Consideriamo due implementazioni del beone. La prima, sopra menzionata, contiene tre classi: versare, bere e stuzzicare.<\/p>\n<p><\/p>\n<p>Il secondo, scritto attraverso la metodologia \u00abAvanti e solo avanti\u00bb e contiene tutta la logica nel metodo <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>Entrambe queste classi, dal punto di vista di un osservatore esterno, appaiono assolutamente identiche e svolgono una singola responsabilit\u00e0 \u00abbere\u00bb. <\/p>\n<p><\/p>\n<p>Confusione!<\/p>\n<p><\/p>\n<p>Allora andiamo su Internet e scopriamo un'altra definizione dell'SRP \u2014 il Principio di Unica Variazione (Single Changeability Principle).<\/p>\n<p><\/p>\n<p>L'SCP afferma che \u00ab<strong>Un modulo ha un solo e unico motivo per cambiare<\/strong>\u00ab. Cio\u00e8 \u00abLa responsabilit\u00e0 \u00e8 un motivo per il cambiamento\u00bb. <\/p>\n<p><\/p>\n<p><em>(Sembra che i ragazzi che hanno inventato la definizione originale fossero certi delle capacit\u00e0 telepatiche dell'uomo-scimmia)<\/em><\/p>\n<p><\/p>\n<p>Ora tutto ha senso. Possiamo cambiare separatamente le procedure di versamento, di consumo e di stuzzicheria, mentre nel vero e proprio beone possiamo modificare solo la sequenza e la composizione delle operazioni, per esempio, spostando la stuzzicheria prima del bere o aggiungendo la lettura di un brindisi.<\/p>\n<p><\/p>\n<p>Nell'approccio \u00abAvanti e solo avanti\u00bb, tutto ci\u00f2 che pu\u00f2 essere cambiato \u2014 viene cambiato solo nel metodo <strong>Act<\/strong>. Questo pu\u00f2 essere leggibile ed efficiente quando la logica \u00e8 limitata e cambia raramente, ma spesso si traduce in terribili metodi di 500 righe ciascuno, con un numero di if maggiore di quanto richiesto per l'ingresso della Russia nella NATO. <\/p>\n<p><\/p>\n<h2 id=\"opredelenie-3-lokalizaciya-izmeneniy\">Definizione 3. Localizzazione dei cambiamenti.<\/h2>\n<p><\/p>\n<p>I beoni spesso non capiscono perch\u00e9 si siano svegliati in un appartamento straniero, o dove sia il loro cellulare. \u00c8 tempo di aggiungere un dettagliato logging.<\/p>\n<p><\/p>\n<p>Iniziamo il logging dal processo di versamento:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class PourOperation: IOperation{\n    PourOperation(ILogger log \/*....*\/){\/*...*\/}\n    \/\/...\n    void Do(){\n        _log.Log($\"Prima del versamento con {_hand} e {_bottle}\");\n        \/\/Logica di versamento ...\n        _log.Log($\"Dopo il versamento con {_hand} e {_bottle}\");\n    }\n}<\/code><\/pre>\n<p><\/p>\n<p>Incorporandola in <strong>PourOperation<\/strong>, abbiamo agito saggiamente dal punto di vista della responsabilit\u00e0 e dell'incapsulamento, ma ora abbiamo confusione riguardo al principio di mutabilit\u00e0. Oltre all'operazione stessa, che pu\u00f2 variare, anche il logging diventa mutevole. Dovremo separarlo e creare un logger speciale per l'operazione di versamento:<\/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             \/\/... logica aziendale\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>Il lettore attento noter\u00e0 che <strong>LogAfter<\/strong>, <strong>LogBefore<\/strong> e <strong>OnError<\/strong> possono anch'essi variare separatamente e, analogamente alle azioni precedenti, creer\u00e0 tre classi: <strong>PourLoggerBefore<\/strong>, <strong>PourLoggerAfter<\/strong> e <strong>PourErrorLogger<\/strong>.<\/p>\n<p><\/p>\n<p>E ricordando che le operazioni per il versatore sono tre, otteniamo nove classi di logging. In totale, il versatore consiste in 14 (!!!) classi.<\/p>\n<p><\/p>\n<p>\u00c8 un'iperbole? Difficilmente! L'uomo-scimmia con una granata di decomposto frantumer\u00e0 il 'versatore' in decanter, bicchieri, operatori di versamento, servizio di erogazione dell'acqua, modello fisico di collisione delle molecole e il prossimo trimestre tenter\u00e0 di districare le dipendenze senza variabili globali. E credetemi \u2014 non si fermer\u00e0.<\/p>\n<p><\/p>\n<p>Proprio su questo punto molti giungono alla conclusione che SRP \u00e8 una favola dei regni rosa, e iniziano a tessere fuffa\u2026<\/p>\n<p><\/p>\n<p>... senza mai scoprire l'esistenza della terza definizione di SRP: <\/p>\n<p><\/p>\n<p>\u00abIl principio della singola responsabilit\u00e0 afferma che <strong>le cose simili per la modifica devono essere conservate in un unico posto<\/strong>\u00ab. oppure \u201c<strong>Ci\u00f2 che cambia insieme deve essere conservato in un unico posto<\/strong>\u201d<\/p>\n<p><\/p>\n<p>In altre parole, se modifichiamo il logging dell'operazione, dobbiamo farlo in un unico posto.<\/p>\n<p><\/p>\n<p>\u00c8 un momento molto importante \u2014 poich\u00e9 tutte le spiegazioni SRP precedenti dicevano che bisognava scomporre i tipi finch\u00e9 si scomponessero, cio\u00e8 imponevano un \u00abvincolo superiore\u00bb sulla dimensione dell'oggetto, e ora stiamo parlando anche di un \u00abvincolo inferiore\u00bb. In altre parole, <strong>SRP non solo richiede di \u00abscomporre finch\u00e9 si scompone\u00bb, ma anche di non esagerare \u2014 \u00abnon scomporre cose collegate\u00bb<\/strong>. Questa \u00e8 una grande battaglia tra il rasoio di Occam e l'uomo-scimmia!<\/p>\n<p>\n<img decoding=\"async\" alt=\"Principio di Responsabilit\u00e0 Singola. Non \u00e8 cos\u00ec semplice come sembra\" src=\"\/wp-content\/uploads\/2019\/06\/2e349a5b119a511d716341f3f6725844.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ora il versatore dovrebbe sentirsi pi\u00f9 a suo agio. Oltre al fatto che non \u00e8 necessario suddividere il logger IPourLogger in tre classi, possiamo anche unire tutti i logger in un unico tipo:<\/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>E se aggiungeremo un quarto tipo di operazione, la registrazione sar\u00e0 gi\u00e0 pronta. E il codice delle operazioni stesse \u00e8 pulito e privo di rumore infrastrutturale.<\/p>\n<p><\/p>\n<p>Di conseguenza, abbiamo 5 classi per risolvere il problema dell'imbottigliamento:<\/p>\n<p><\/p>\n<ul>\n<li>Operazione di riempimento<\/li>\n<li>Operazione di svuotamento<\/li>\n<li>Operazione di abbinamento<\/li>\n<li>Logger<\/li>\n<li>Facciata dell'imbottigliatore<\/li>\n<\/ul>\n<p><\/p>\n<p>Ognuna di esse \u00e8 responsabile di una sola funzionalit\u00e0, ha una sola causa di cambiamento. Tutte le regole simili per il cambiamento si trovano vicine. <\/p>\n<p>\n<b class=\"spoiler_title\">Esempio dalla vita reale<\/b><\/p>\n<p>Una volta abbiamo scritto un servizio di registrazione automatica per clienti b2b. E si \u00e8 presentato il metodo GOD di 200 righe con contenuti simili:<\/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 l'account con questo conto non sia stato creato nel principale <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/it\/server\/dts-dronten\/\"   title=\"server\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2485\">server<\/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 dei punti. Passa a questo servizio il numero di conto 1C.<\/li>\n<\/ul>\n<p><\/p>\n<p>E c'erano in questo elenco circa 10 operazioni commerciali con una terribile interconnessione. L'oggetto conto era necessario per quasi tutti. L'identificatore del punto e il nome del cliente erano necessari nella met\u00e0 delle chiamate.<\/p>\n<p><\/p>\n<p>Dopo un'ora di rifattorizzazione, siamo riusciti a separare il codice infrastrutturale e alcune sfumature del lavoro con l'account in metodi\/classi separati. Il metodo God si \u00e8 alleggerito, ma sono rimaste 100 righe di codice che non volevano sciogliersi. <\/p>\n<p><\/p>\n<p>Solo dopo alcuni giorni \u00e8 arrivata la comprensione che l'essenza di questo metodo \u00aballeggerito\u00bb \u00e8 il business algorithm. E che la descrizione iniziale del capitolato era piuttosto complessa. E sar\u00e0 proprio il tentativo di rompere questo metodo in pezzi a violare SRP, e non viceversa. <\/p>\n<p><\/p>\n<h2 id=\"formalizm\">Formalismo.<\/h2>\n<p><\/p>\n<p>\u00c8 tempo di lasciare in pace il nostro imbottigliatore. Asciuga le lacrime: torneremo sicuramente a lui in un altro momento. Ma ora formalizziamo le conoscenze da questo articolo. <\/p>\n<p><\/p>\n<h4 id=\"formalizm-1-opredelenie-srp\">Formalismo 1. Definizione del SRP<\/h4>\n<p><\/p>\n<ol>\n<li>Separare gli elementi in modo che ognuno di essi sia responsabile di una sola cosa.<\/li>\n<li>La responsabilit\u00e0 si interpreta come \u00abmotivo per modifica\u00bb. Cio\u00e8, ogni elemento ha solo un motivo per modifica, in termini di logica aziendale.<\/li>\n<li>Le potenziali modifiche alla logica aziendale devono essere localizzate. Gli elementi modificabili in modo sincronizzato devono essere vicini.<\/li>\n<\/ol>\n<p><\/p>\n<h4 id=\"formalizm-2-neobhodimye-kriterii-samoproverki\">Formalismo 2. Criteri necessari per l'autovalutazione.<\/h4>\n<p><\/p>\n<p>Non ho trovato criteri sufficienti per soddisfare l'SRP. Ma ci sono condizioni necessarie:<\/p>\n<p><\/p>\n<p>1) Fai a te stesso la domanda: cosa fa questa classe\/questo metodo\/questo modulo\/questo servizio. Devi rispondere con una definizione semplice. (grazie <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\">chiarimenti<\/b><\/p>\n<p>Tuttavia, a volte \u00e8 molto difficile trovare una definizione semplice <\/p>\n<p><\/p>\n<p>2) La correzione di un bug o l'aggiunta di una nuova funzionalit\u00e0 deve interessare il minor numero possibile di file\/classi. Idealmente, uno. <\/p>\n<p>\n<b class=\"spoiler_title\">chiarimenti<\/b><\/p>\n<p>Poich\u00e9 la responsabilit\u00e0 (per la funzionalit\u00e0 o il bug) \u00e8 incapsulata in un solo file\/classe, sai esattamente dove cercare e cosa modificare. Ad esempio, una funzionalit\u00e0 che cambia l'output della registrazione delle operazioni richieder\u00e0 di modificare solo il registratore. Non \u00e8 necessario correre per tutto il resto del codice. <\/p>\n<p><\/p>\n<p>Un altro esempio: aggiungere un nuovo controllo UI simile ai precedenti. Se questo ti costringe ad aggiungere 10 diverse entit\u00e0 e 15 diversi convertitori, sembra che tu abbia \"esagerato\".<\/p>\n<p><\/p>\n<p>3) Se pi\u00f9 sviluppatori stanno lavorando su diverse funzionalit\u00e0 del tuo progetto, la probabilit\u00e0 di conflitto di fusione, cio\u00e8 la probabilit\u00e0 che lo stesso file\/classe venga modificato da diversi sviluppatori contemporaneamente, \u00e8 minima.<\/p>\n<p>\n<b class=\"spoiler_title\">chiarimenti<\/b><\/p>\n<p>Se, durante l'aggiunta di una nuova operazione \u00abVersare vodka sotto il tavolo\u00bb, \u00e8 necessario toccare il logger, l'operazione di consumo e versamento, allora sembra che le responsabilit\u00e0 siano divise in modo irregolare. Certamente, questo non \u00e8 sempre possibile, ma bisogna cercare di ridurre questo indicatore. <\/p>\n<p><\/p>\n<p>4) Quando fai una domanda chiarificatrice sulla logica aziendale (da uno sviluppatore o un manager), ti concentri rigorosamente su una sola classe\/file e ottieni informazioni solo da l\u00ec.<\/p>\n<p>\n<b class=\"spoiler_title\">chiarimenti<\/b><\/p>\n<p>Le funzionalit\u00e0, le regole o gli algoritmi sono scritti in modo compatto, ciascuno in un unico posto e non sparsi con flag in tutto il codice.<\/p>\n<p><\/p>\n<p>5) La denominazione \u00e8 chiara.<\/p>\n<p>\n<b class=\"spoiler_title\">chiarimenti<\/b><\/p>\n<p>La nostra classe o metodo \u00e8 responsabile di una sola cosa e la responsabilit\u00e0 \u00e8 riflessa nel suo nome.<\/p>\n<p><\/p>\n<p>AllManagersManagerService \u2014 molto probabilmente un God class.<br \/>\nLocalPayment \u2014 probabilmente no. <\/p>\n<p><\/p>\n<h4 id=\"formalizm-3-metodika-razrabotki-okkama-first\">Formalismo 3. Metodologia di sviluppo \u00abOccam-first\u00bb.<\/h4>\n<p><\/p>\n<p>All'inizio della progettazione, l'uomo-scimpanz\u00e9 non conosce e non percepisce tutte le sfumature del problema da risolvere e potrebbe commettere errori. Gli errori possono avvenire in vari modi:<\/p>\n<p><\/p>\n<ul>\n<li>Creare oggetti troppo grandi, accorpando diverse responsabilit\u00e0<\/li>\n<li>Ridistribuire, suddividendo una responsabilit\u00e0 unica in molti tipi diversi<\/li>\n<li>Definire erroneamente i confini delle responsabilit\u00e0<\/li>\n<\/ul>\n<p><\/p>\n<p>\u00c8 importante ricordare la regola: \u00ab\u00e8 meglio sbagliare in eccesso\u00bb, o \u00abse non si \u00e8 sicuri, non frammentare\u00bb. Se, ad esempio, la tua classe raccoglie due responsabilit\u00e0, essa rimane comunque comprensibile e pu\u00f2 essere divisa in due con il minimo cambiamento del codice cliente. Creare un bicchiere dai frammenti di vetro \u00e8 generalmente pi\u00f9 difficile a causa del contesto disperso su pi\u00f9 file e della mancanza delle dipendenze necessarie nel codice cliente. <\/p>\n<p><\/p>\n<h2 id=\"pora-zakruglyatsya\">\u00c8 tempo di concludere<\/h2>\n<p><\/p>\n<p>L'ambito di applicazione del SRP non si limita alla OOP e al SOLID. \u00c8 applicabile a metodi, funzioni, classi, moduli, microservizi e servizi. \u00c8 valido sia per lo sviluppo \u201cfigacs-figacs-e-in-prod\u201d che per il \u201crocket-science\u201d, migliorando ovunque il mondo un po' alla volta. A pensarci bene, \u00e8 quasi un principio fondamentale di tutta l'ingegneria. L'ingegneria meccanica, i sistemi di controllo e, in generale, tutti i sistemi complessi \u2014 sono costruiti da componenti, e il \u201cnon suddividere\u201d priva i progettisti di flessibilit\u00e0, il \u201csuddividere eccessivamente\u201d di efficienza, mentre confini errati privano della razionalit\u00e0 e della tranquillit\u00e0. <\/p>\n<p>\n<img decoding=\"async\" alt=\"Principio di Responsabilit\u00e0 Singola. Non \u00e8 cos\u00ec semplice come sembra\" src=\"\/wp-content\/uploads\/2019\/06\/b70fb2b0b87cf90d41462263e839902b.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Il SRP non \u00e8 stato inventato dalla natura e non fa parte delle scienze esatte. Emerse dalle nostre limitazioni biologiche e psicologiche. \u00c8 solo un modo per controllare e sviluppare sistemi complessi utilizzando il cervello di un primate umano. Ci indica come decomporre un sistema. La formulazione iniziale richiedeva notevoli abilit\u00e0 di telepatia, ma spero che questo articolo abbia un po' dissipato la nebbia.<\/p>\n<p>Fonte: <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\/it\/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=\"it_IT\" \/>\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\/it\/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\udd47Principio di Responsabilit\u00e0 Singola. Non cos\u00ec semplice come sembra | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/it\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/34828","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=34828"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/34828\/revisions"}],"predecessor-version":[{"id":159767,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/34828\/revisions\/159767"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/26229"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=34828"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=34828"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=34828"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}