Puoi in "semplice inglese" spiegare perché abbiamo bisogno del principio di singola responsabilità ?
Soprattutto che sposta quello che io chiamo "gonfio" in altri posti. Vedi sotto per maggiori informazioni. Con bloat intendo nel mio caso specifico, ho più responsabilità in un controller che si presentano come funzioni / metodi. Applicando SRP nel modo che ho capito, suddivide il controller in diversi controller, ciascuno con un metodo. Il "bloat" viene quindi spostato da "numero di metodi" a "numero di file".
L'articolo nel link wiki sopra spiega cos'è l'SRP, ma non sembra dirmi "perché" lo usiamo. Mi piacerebbe una ragione / spiegazione / senso non tecnico (o forse anche tecnico) per quanto riguarda perché abbiamo bisogno di questo principio.
Perché nella mia attuale esperienza, l'implementazione di SRP porta a un codice più piccolo e allineato in modo più ristretto, ma crea più file.
Esempio
Ho un file controller che può avere molte varie azioni / metodi al suo interno. Per mantenere tutte quelle azioni nel controller, devo gonfiare il numero di dipendenze che devo passare al controller, perché le dipendenze devono coprire tutte le azioni possibili, anche se qualsiasi azione particolare non ha bisogno di tutte delle dipendenze.
quindi posso suddividere il controller in 2 o più pezzi dove ho un'azione per controller. Questo soddisfa l'SRP, ma aumenta di massa il numero di file che devo creare.
Esempio
/*
* Repository initialized with $quoteId
*/
class Repository
{
private $quoteId;
function __construct($quoteId)
{
$this->quoteId = $quoteId;
}
}
/*
* Controller initialized with $repository
*/
class Controller
{
private $repository;
function __construct($repository)
{
$this->repository = $repository;
}
function addForm()
{
//repository is initialized elsewhere with $quoteId
$this->repository->getFormDataFromQuote();
};
function viewForm()
{
$id = int_val($_GET['id']);
//does *not* use $quoteID
$this->repository->getViewDataFromId($id);
};
}
SRP
Per rispettare SRP possiamo suddividere il controller in due, uno per addForm, uno per viewForm. Quindi possiamo suddividere il repository in due, uno per ciascun metodo in Controller. Quindi, abbiamo iniziato con 2 file, per finire con 4 file.
Inconvenienti
Interpreto SRP qui come "Spezza il controller" (e, presumo anche altri file di supporto, come Repository qui) in due in questo caso. Quindi nell'esempio sopra ci saranno ControllerAddForm
e ControllerViewForm
, e se sto usando un repository per quei metodi, che sono, devo creare RepositoryViewForm
e RepositoryAddForm
per soddisfare anche SRP, perché sono richiesti metodi di repository diversi per le diverse azioni del Controller. Quindi, ottengo 2x file gonfiati. Perché ancora una volta è raccomandato SRP, nonostante lo spostamento del numero di file anziché del numero di metodi per file.