{"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\/novosti-interneta\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","title":{"rendered":"Principio di Responsabilit\u00e0 Unica. Non cos\u00ec semplice come sembra","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Principio di Responsabilit\u00e0 Unica. Non cos\u00ec semplice come sembra\" src=\"\/wp-content\/uploads\/2019\/06\/5b253ff55e3c97b6baf5f7a7ae7f3b98.JPG\" style=\"display:block;margin: 0 auto;\" \/> Principio di responsabilit\u00e0 singola, ovvero il principio di unica responsabilit\u00e0,<br \/>\nche \u00e8 anche il principio di unica mutabilit\u00e0 \u2014 un argomento difficile da comprendere e un tema piuttosto delicato da affrontare durante un colloquio 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 in una foresta per trasformarci da larve di studenti in veri studenti.<\/p>\n<p><\/p>\n<p>Nella foresta, 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 la prima persona del gruppo versa la vodka nel bicchiere, la seconda beve e la terza mangia uno stuzzichino. L'unit\u00e0 che ha completato la sua operazione si mette in fondo alla fila del gruppo. <\/p>\n<p><\/p>\n<p>Un caso in cui la dimensione della fila era multipla di tre \u00e8 stata una buona implementazione 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 sua responsabilit\u00e0 e motivo di esistenza, e questa responsabilit\u00e0 \u00e8 unica.<\/p>\n<p><\/p>\n<p>Consideriamo l'oggetto &#171;Bevitore&#187; (<strong>Tippler<\/strong>).<br \/>\nPer applicare il principio SRP, dividiamo i compiti in tre parti: <\/p>\n<p><\/p>\n<ul>\n<li>Uno versa (<strong>OperazioneVersamento<\/strong>)<\/li>\n<li>Uno beve (<strong>OperazioneBevuta<\/strong>)<\/li>\n<li>Uno morda (<strong>OperazioneMordere<\/strong>)<\/li>\n<\/ul>\n<p><\/p>\n<p>Ogni partecipante al processo \u00e8 responsabile di un componente del processo, ossia ha una responsabilit\u00e0 atomica \u2014 bere, versare o masticare. <\/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 Bevitore {\n    \/\/...\n    void Azione() {\n        _operazioneVersamento.Fai() \/\/ versare\n        _operazioneBevuta.Fai() \/\/ bere\n        _operazioneMordere.Fai() \/\/ masticare\n    }\n}<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Principio di Responsabilit\u00e0 Unica. Non 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>L'uomo-programmatore scrive codice per l'uomo-scimmia, e l'uomo-scimmia \u00e8 distratto, stupido e sempre di fretta. Pu\u00f2 tenere e comprendere circa 3-7 termini alla volta.<br \/>\nNel caso del bevitore, questi termini sono tre. Tuttavia, se scriviamo codice su un unico foglio, appariranno mani, bicchieri, risse e infinite discussioni sulla politica. E tutto questo sar\u00e0 nel corpo di un unico metodo. Sono sicuro che hai visto questo codice nella tua pratica. Non \u00e8 la prova pi\u00f9 umana per la psiche.<\/p>\n<p><\/p>\n<p>D'altra parte, l'uomo-scimmia \u00e8 focalizzato sulla modellazione di oggetti del mondo reale nella propria mente. Nella sua immaginazione, pu\u00f2 farli cozzare, assemblarli in nuovi oggetti e smontarli allo stesso modo. Immagina un vecchio modello di auto. Puoi mentalmente aprire la porta, svitare la copertura della porta e vedere i meccanismi degli alzacristalli, all'interno dei quali ci saranno ingranaggi. Ma non puoi vedere tutti i componenti dell'auto contemporaneamente, in un unico &#171;elenco&#187;. Almeno l'&#171;uomo-scimmia&#187; non pu\u00f2.<\/p>\n<p><\/p>\n<p>Pertanto, i programmatori umani decompongono meccanismi complessi in un insieme di elementi meno complessi e funzionanti. Tuttavia, la decomposizione pu\u00f2 avvenire in modi diversi: in molte auto pi\u00f9 vecchie, il condotto dell'aria passa nella porta, mentre in quelle moderne, un guasto elettronico della serratura impedisce all'auto di avviarsi, creando problemi durante la riparazione.<\/p>\n<p><\/p>\n<p>Quindi, <strong>SRP \u00e8 un principio che spiega COME decomporsi, ovvero dove tracciare la linea di separazione.<\/strong>. <\/p>\n<p><\/p>\n<p>Dice che bisogna decomporre in base al principio di separazione dell'&#171;responsabilit\u00e0&#187;, cio\u00e8 secondo i compiti di determinati oggetti.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Principio di Responsabilit\u00e0 Unica. Non cos\u00ec semplice come sembra\" src=\"\/wp-content\/uploads\/2019\/06\/b1980c3dc9742b921eb818f14fe3527e.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Torniamo al bere e ai vantaggi che ottiene l'uomo-scimmia nella decomposizione: <\/p>\n<p><\/p>\n<ul>\n<li>Il codice \u00e8 diventato 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>\u00c8 semplificato il test automatico: pi\u00f9 semplice \u00e8 l'elemento, pi\u00f9 facile \u00e8 testarlo<\/li>\n<li>Si ottiene la composizione del codice: \u00e8 possibile sostituire <strong>OperazioneBevuta<\/strong> con un'operazione in cui l'uomo-scimmia versa un liquido sotto il tavolo. Oppure sostituire l'operazione di versamento con un'operazione in cui mescoli vino e acqua o vodka e birra. A seconda delle esigenze aziendali, puoi fare di tutto, senza toccare il codice del metodo <strong>Tippler.Act<\/strong>. <\/li>\n<li>Da queste operazioni puoi comporre un mangione (utilizzando solo <strong>TakeBitOperation<\/strong>), un alcolizzato (utilizzando solo <strong>OperazioneBevuta<\/strong> direttamente dalla bottiglia) e soddisfare molte altre esigenze aziendali.<\/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, i svantaggi: <\/p>\n<p><\/p>\n<ul>\n<li>Dovrai creare pi\u00f9 tipi. <\/li>\n<li>L'uomo-scimmia 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. Variabilit\u00e0 unitaria.<\/h2>\n<p><\/p>\n<p>Permettete, signori! La classe del bevitore ha anche essa una responsabilit\u00e0 unica \u2014 quella di bere! E in generale, la parola &#171;responsabilit\u00e0&#187; \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 di alcolista. La prima, quella citata sopra, contiene tre classi: versare, bere e stuzzicare.<\/p>\n<p><\/p>\n<p>La seconda \u00e8 scritta secondo la metodologia &#171;Avanti e solo avanti&#187; 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>Entrambi questi classi, dal punto di vista di un osservatore esterno, appaiono assolutamente identici e svolgono un'unica responsabilit\u00e0 &#171;bere&#187;. <\/p>\n<p><\/p>\n<p>Confusione!<\/p>\n<p><\/p>\n<p>Allora navighiamo in internet e scopriamo un'altra definizione di SRP \u2014 Principio di Unica Cambiabilit\u00e0 (Single Changeability Principle).<\/p>\n<p><\/p>\n<p>SCP dichiara che &#171;<strong>Un modulo ha uno e solo uno scopo per cambiare<\/strong>&#171;. Cio\u00e8, &#171;La responsabilit\u00e0 \u00e8 il motivo per il cambiamento&#187;. <\/p>\n<p><\/p>\n<p><em>(Sembra che i ragazzi che hanno inventato la definizione originale fossero sicuri delle capacit\u00e0 telepatiche dell'uomo-scimmia)<\/em><\/p>\n<p><\/p>\n<p>Ora tutto torna al suo posto. \u00c8 possibile modificare separatamente le procedure di versamento, consumo e accompagnamento, mentre nella bevuta possiamo cambiare solo l'ordine e il contenuto delle operazioni, ad esempio spostando l'accompagnamento prima del consumo o aggiungendo la lettura di un brindisi.<\/p>\n<p><\/p>\n<p>Nel approccio &#171;Avanti e solo avanti&#187;, tutto ci\u00f2 che pu\u00f2 essere cambiato, viene cambiato solo nel metodo <strong>Act<\/strong>. Questo pu\u00f2 essere leggibile ed efficace quando la logica \u00e8 ridotta e cambia raramente, ma spesso questo si traduce in metodi terribili di 500 righe a ciascuno, con un numero di if superiore a quello necessario per l'entrata della Russia nella NATO. <\/p>\n<p><\/p>\n<h2 id=\"opredelenie-3-lokalizaciya-izmeneniy\">Definizione 3. Localizzazione delle modifiche.<\/h2>\n<p><\/p>\n<p>I bevitori spesso non capiscono perch\u00e9 si siano svegliati in un appartamento sconosciuto o dove sia il loro cellulare. \u00c8 tempo di aggiungere un log dettagliato.<\/p>\n<p><\/p>\n<p>Iniziamo a loggare il 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 di versare con {_hand} e {_bottle}\");\n        \/\/Logica di versamento ...\n        _log.Log($\"Dopo aver versato con {_hand} e {_bottle}\");\n    }\n}<\/code><\/pre>\n<p><\/p>\n<p>Incorporandola in <strong>OperazioneVersamento<\/strong>, abbiamo agito saggiamente in termini di responsabilit\u00e0 e incapsulamento, ma ora abbiamo un imbarazzo riguardo al principio di variabilit\u00e0. Oltre all'operazione stessa, che pu\u00f2 variare, anche la registrazione diventa variabile. Dovremo separare 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    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>Un lettore attento noter\u00e0 che <strong>LogAfter<\/strong>, <strong>LogBefore<\/strong> e <strong>OnError<\/strong> possono anche cambiare individualmente 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>Ricordando che ci sono tre operazioni per il bevitore, otteniamo nove classi di logging. In totale, il bevitore \u00e8 composto da 14 (!!!) classi.<\/p>\n<p><\/p>\n<p>Iperbole? Ben poco! Un uomo-scimmia con una granata di decomposizione distrugger\u00e0 il \u201criempitore\u201d in decanter, bicchiere, operatori di versamento, servizio di erogazione dell'acqua, modello fisico dell'interazione delle molecole; e nel prossimo trimestre cercher\u00e0 di districare le dipendenze senza variabili globali. E credetemi \u2014 non si fermer\u00e0.<\/p>\n<p><\/p>\n<p>Proprio a questo punto molti giungono alla conclusione che SRP \u00e8 solo una favola di regni incantati, e si allontanano...<\/p>\n<p><\/p>\n<p>\u2026 senza mai scoprire l'esistenza della terza definizione di SRP: <\/p>\n<p><\/p>\n<p>&#171;Il principio della responsabilit\u00e0 unica afferma che <strong>le cose simili da modificare devono essere conservate in un unico posto<\/strong>&#171;. 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 cambiamo la registrazione dell'operazione, dobbiamo farlo in un solo luogo.<\/p>\n<p><\/p>\n<p>Questo \u00e8 un punto molto importante, poich\u00e9 tutte le spiegazioni SRP precedenti parlavano di suddividere i tipi finch\u00e9 si possono suddividere, imponendo quindi un &#171;limite superiore&#187; sulla dimensione dell'oggetto, mentre ora stiamo parlando anche di un &#171;limite inferiore&#187;. In altre parole, <strong>SRP non solo richiede di &#171;suddividere finch\u00e9 si pu\u00f2 suddividere&#187;, ma anche di non esagerare \u2014 &#171;non suddividere cose legate&#187;<\/strong>. \u00c8 la grande battaglia tra il rasoio di Occam e l'uomo-scimmia!<\/p>\n<p>\n<img decoding=\"async\" alt=\"Principio di Responsabilit\u00e0 Unica. Non cos\u00ec semplice come sembra\" src=\"\/wp-content\/uploads\/2019\/06\/2e349a5b119a511d716341f3f6725844.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ora dovrebbe essere pi\u00f9 facile per il bevitore. 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    public void LogBefore(object[] args){\/*...*\/}       \n    public void LogAfter(object[] args){\/*..*\/}\n    public void LogError(object[] args, exception e){\/*..*\/}\n}<\/code><\/pre>\n<p><\/p>\n<p>E se dovessimo aggiungere un quarto tipo di operazione, la registrazione \u00e8 gi\u00e0 pronta. E il codice delle operazioni \u00e8 pulito e privo di rumore infrastrutturale.<\/p>\n<p><\/p>\n<p>Di conseguenza, abbiamo 5 classi per risolvere il compito del bere:<\/p>\n<p><\/p>\n<ul>\n<li>Operazione di versamento<\/li>\n<li>Operazione di bevuta<\/li>\n<li>Operazione di accompagnamento<\/li>\n<li>Logger<\/li>\n<li>Fintore per il bevitore<\/li>\n<\/ul>\n<p><\/p>\n<p>Ognuno di essi \u00e8 responsabile di una funzionalit\u00e0 specifica e ha una sola ragione per cambiare. Tutte le regole simili per le modifiche sono vicine tra loro. <\/p>\n<p>\n<b class=\"spoiler_title\">Esempio della vita reale<\/b><\/p>\n<p>Una volta stavamo scrivendo un servizio di registrazione automatica per clienti B2B. E c'era un metodo GOD di 200 righe simile a questo:<\/p>\n<p><\/p>\n<ul>\n<li>Vai in 1C e apri un conto<\/li>\n<li>Con questo conto, vai al modulo di pagamento e registralo l\u00ec<\/li>\n<li>Controlla che l'account con quel conto non sia gi\u00e0 stato creato nella 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>Risultato della registrazione nel modulo di pagamento e il numero 1c da aggiungere 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. Trasferisci in questo servizio il numero di conto 1c.<\/li>\n<\/ul>\n<p><\/p>\n<p>E in questo elenco c'erano circa 10 operazioni commerciali con una connessione complessa. L'oggetto del conto era necessario per quasi tutti. L'identificatore del punto e il nome del cliente erano richiesti nella met\u00e0 delle chiamate.<\/p>\n<p><\/p>\n<p>Dopo un'ora di refactoring, siamo riusciti a separare il codice infrastrutturale e alcune specificit\u00e0 del lavoro con l'account in metodi\/classi separate. Il metodo God \u00e8 diventato pi\u00f9 leggero, ma sono rimaste 100 righe di codice che non volevano essere districate. <\/p>\n<p><\/p>\n<p>Solo dopo alcuni giorni \u00e8 arrivata la comprensione che l'essenza di questo metodo \"alleggerito\" \u00e8 proprio un algoritmo di business. E che la descrizione iniziale del documento di specifiche era piuttosto complessa. \u00c8 proprio il tentativo di suddividere questo metodo in parti a violare il principio SRP, e non il contrario. <\/p>\n<p><\/p>\n<h2 id=\"formalizm\">Formalismo.<\/h2>\n<p><\/p>\n<p>\u00c8 tempo di lasciare in pace il nostro bevitore. Asciuga le lacrime: torneremo da lui in futuro. Ma ora formalizziamo le conoscenze di questo articolo. <\/p>\n<p><\/p>\n<h4 id=\"formalizm-1-opredelenie-srp\">Formalismo 1. Definizione del SRP<\/h4>\n<p><\/p>\n<ol>\n<li>Separare gli elementi in modo che ognuno di essi sia responsabile di un singolo aspetto.<\/li>\n<li>La responsabilit\u00e0 si traduce come \"motivo di cambiamento\". Cio\u00e8, ogni elemento ha un solo motivo per essere modificato, in termini di logica business.<\/li>\n<li>Le potenziali modifiche alla logica aziendale devono essere localizzate. Gli elementi modificabili simultaneamente 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 il compimento del SRP. Ma ci sono condizioni necessarie:<\/p>\n<p><\/p>\n<p>1) Chiediti: cosa fa questa classe\/metodo\/modulo\/servizio? Devi rispondere a questa domanda 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\">suggerimenti<\/b><\/p>\n<p>Dopotutto, a volte \u00e8 molto difficile trovare una definizione semplice. <\/p>\n<p><\/p>\n<p>2) La correzione di un certo bug o l'aggiunta di una nuova funzionalit\u00e0 deve coinvolgere il minor numero possibile di file\/classi. Idealmente, uno solo. <\/p>\n<p>\n<b class=\"spoiler_title\">suggerimenti<\/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: la funzionalit\u00e0 di modifica dell'output del log delle operazioni richieder\u00e0 di modificare solo il logger. Non \u00e8 necessario setacciare tutto il resto del codice. <\/p>\n<p><\/p>\n<p>Un altro esempio \u00e8 l'aggiunta di un nuovo controllo UI, simile ai precedenti. Se questo ti porta ad aggiungere 10 entit\u00e0 diverse e 15 convertitori diversi, sembra che tu stia \"andando oltre\".<\/p>\n<p><\/p>\n<p>3) Se pi\u00f9 sviluppatori stanno lavorando su diverse funzionalit\u00e0 del tuo progetto, la probabilit\u00e0 di conflitti di merge, cio\u00e8 la probabilit\u00e0 che lo stesso file\/classe venga modificato da pi\u00f9 sviluppatori contemporaneamente, \u00e8 minima.<\/p>\n<p>\n<b class=\"spoiler_title\">suggerimenti<\/b><\/p>\n<p>Se, aggiungendo una nuova operazione \"Versare vodka sotto il tavolo\", \u00e8 necessario coinvolgere il logger, l'operazione di bere e versare, allora sembra che le responsabilit\u00e0 siano suddivise in modo errato. Certamente, ci\u00f2 non \u00e8 sempre possibile, ma bisogna cercare di ridurre questo indicatore. <\/p>\n<p><\/p>\n<p>4) Quando fai una domanda di chiarimento sulla logica di business (da un sviluppatore o da un manager), vai a cercare informazioni in una sola classe\/file e ottieni le informazioni solo da l\u00ec.<\/p>\n<p>\n<b class=\"spoiler_title\">suggerimenti<\/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 per tutto il codice con flag.<\/p>\n<p><\/p>\n<p>5) I nomi sono chiari.<\/p>\n<p>\n<b class=\"spoiler_title\">suggerimenti<\/b><\/p>\n<p>La nostra classe o metodo \u00e8 responsabile di un'unica cosa, e la responsabilit\u00e0 \u00e8 riflessa nel suo nome.<\/p>\n<p><\/p>\n<p>AllManagersManagerService \u00e8 probabilmente un God-class.<br \/>\nLocalPayment \u2014 probabilmente no <\/p>\n<p><\/p>\n<h4 id=\"formalizm-3-metodika-razrabotki-okkama-first\">Formalismo 3. Metodo di sviluppo \"Occam-first\".<\/h4>\n<p><\/p>\n<p>All'inizio della progettazione, l'homo sapiens non conosce e non percepisce tutte le sfumature del problema da risolvere e pu\u00f2 commettere errori. Gli errori possono avvenire in vari modi:<\/p>\n<p><\/p>\n<ul>\n<li>Creare oggetti troppo grandi, unendo diverse responsabilit\u00e0<\/li>\n<li>Frantumare, separando una responsabilit\u00e0 unica in molti tipi diversi<\/li>\n<li>Definire erroneamente i confini della 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 sei sicuro, non frazionare\u00bb. Se, ad esempio, la tua classe raccoglie due responsabilit\u00e0, rimarr\u00e0 comprensibile e potr\u00e0 essere suddivisa in due con un cambiamento minimo del codice client. Creare un bicchiere da frammenti di vetro, di regola, \u00e8 pi\u00f9 difficile a causa del contesto sparso su pi\u00f9 file e della mancanza delle dipendenze necessarie nel codice client. <\/p>\n<p><\/p>\n<h2 id=\"pora-zakruglyatsya\">\u00c8 ora di concludere<\/h2>\n<p><\/p>\n<p>L'ambito di applicazione del SRP non si limita a OOP e SOLID. Si applica a metodi, funzioni, classi, moduli, microservizi e servizi. \u00c8 adatto sia per lo sviluppo \u201cfigaks-figaks-e-in-prod\u201d che per \u201crocket-science\u201d, rendendo ovunque il mondo un po' migliore. Se ci pensi, questo \u00e8 quasi un principio fondamentale di tutto l'ingegneria. L'ingegneria meccanica, i sistemi di controllo, e in generale tutti i sistemi complessi sono costruiti da componenti, e la \"non-frammentazione\" priva i costruttori di flessibilit\u00e0, l'\"eccessiva frammentazione\" - di efficienza, e i confini errati - di ragione e tranquillit\u00e0. <\/p>\n<p>\n<img decoding=\"async\" alt=\"Principio di Responsabilit\u00e0 Unica. Non 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 inventato dalla natura e non fa parte delle scienze esatte. Nasce dalle nostre limitazioni biologiche e psicologiche. \u00c8 semplicemente un modo per controllare e sviluppare sistemi complessi con l'aiuto del cervello umano-primato. Ci insegna come decomporre un sistema. La formulazione originale richiedeva una notevole abilit\u00e0 telepatica, ma spero che questo articolo abbia un po' dissipato l'illusione.<\/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-novosti-interneta"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"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.\" \/>\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\/novosti-interneta\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\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:description\" content=\"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.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/novosti-interneta\/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 \u00e8 cos\u00ec semplice come sembra | ProHoster","description":"Il principio di responsabilit\u00e0 singola, noto anche come principio di unica responsabilit\u00e0, \u00e8 un concetto difficile da comprendere e un argomento piuttosto delicato durante i colloqui di lavoro per programmatori. La mia prima vera esperienza con questo principio \u00e8 avvenuta all'inizio del primo anno di universit\u00e0, quando noi studenti giovani e inesperti siamo stati portati in un bosco per trasformarci da larve di studenti a studenti veri e propri.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/novosti-interneta\/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:description":"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.","og:url":"https:\/\/prohoster.info\/it\/blog\/novosti-interneta\/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"},"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}]}}