Non c'è una risposta chiara a questo. Sebbene la domanda sia ristretta, le spiegazioni non lo sono.
Per me, è qualcosa come Rasoio di Occam se vuoi. È un ideale in cui cerco di misurare il mio codice attuale. È difficile inchiodarlo in parole semplici e semplici. Un'altra metafora sarebbe "un argomento" che è astratto, cioè difficile da cogliere, come "singola responsabilità". Una terza descrizione sarebbe »che riguarda un livello di astrazione«.
Che cosa significa praticamente?
Ultimamente uso uno stile di codifica che consiste principalmente di due fasi:
La fase I è descritta al meglio come caos creativo. In questa fase scrivo il codice mentre i pensieri fluiscono - cioè crudo e brutto.
La fase II è l'esatto contrario. È come pulire dopo un uragano. Questo richiede più lavoro e disciplina. E poi guardo il codice dal punto di vista di un designer.
Ora sto lavorando principalmente su Python, il che mi consente di pensare a oggetti e classi in seguito. Prima Fase I - Scrivo solo funzioni e le divulgo quasi in modo casuale in diversi moduli. In Fase II , dopo che ho iniziato a funzionare, ho esaminato più da vicino quale modulo si occupa di quale parte della soluzione. E mentre sfogliamo i moduli, mi vengono in mente argomenti . Alcune funzioni sono correlate tematicamente. Questi sono buoni candidati per classi . E dopo aver trasformato le funzioni in classi - che è quasi finito con indentazione e aggiungendo self
alla lista dei parametri in python;) - Io uso SRP
come Rasoio di Occam per togliere funzionalità ad altri moduli e classi.
Un esempio corrente potrebbe essere scrivere una piccola funzionalità di esportazione l'altro giorno.
C'era bisogno di csv , excel e combinato excel sheets in un file zip.
La semplice funzionalità è stata eseguita in tre visualizzazioni (= funzioni).
Ogni funzione utilizzava un metodo comune per determinare i filtri e un secondo metodo per recuperare i dati. Quindi in ciascuna funzione è stata effettuata la preparazione dell'esportazione ed è stata fornita come risposta dal server.
Ci sono stati troppi livelli di astrazione mescolati:
I) che si occupa di richiesta / risposta in entrata / uscita
II) determinazione dei filtri
III) recupero dei dati
IV) trasformazione dei dati
Il semplice passo era usare un'astrazione ( exporter
) per gestire i livelli II-IV in un primo passaggio.
L'unico rimedio era l'argomento che trattava le richieste / risposte .
Allo stesso livello di astrazione è estraendo i parametri di richiesta che va bene. Così ho avuto per questa vista una "responsabilità".
In secondo luogo, ho dovuto interrompere l'esportatore, che come abbiamo visto era costituito da almeno altri tre livelli di astrazione.
La determinazione dei criteri di filtro e il effettivo sono quasi allo stesso livello di astrazione (i filtri sono necessari per ottenere il sottoinsieme giusto dei dati). Questi livelli sono stati inseriti in qualcosa di simile a un livello di accesso ai dati .
Nel prossimo passo ho diviso i meccanismi di esportazione effettivi: dove era necessario scrivere su un file temporale, l'ho suddiviso in due "responsabilità": una per la scrittura effettiva dei dati su disco e un'altra parte che trattava del formato attuale.
Lungo la formazione delle classi e dei moduli, le cose divennero più chiare, ciò che apparteneva a dove. E sempre la domanda latente, se la classe fa troppo .
How do you determine which responsibilities each class should have, and how do you define a responsibility in the context of SRP?
È difficile dare una ricetta da seguire. Ovviamente potrei ripetere il criptico »livello di astrazione« - regola se questo aiuta.
Principalmente per me è una sorta di "intuizione artistica" che porta all'attuale design; Il codice del modello come un artista può scolpire l'argilla o dipingere.
Immaginami come Coding Bob Ross ;)