Stati SRP ...
There should never be more than one reason for a class to change.
Ma perché una classe? Perché non utilizzare la granularità di una funzione / metodo? Che cosa invece di separare la mia funzionalità in classi separate , la separo in funzioni separate ?
Non sostengo che funzioni o sia consigliabile in tutti i casi, ma in alcuni casi con alcune modifiche è abbastanza simile. Quando qualcosa deve cambiare, posso andare a quella funzione e cambiarla. Anche se potrebbe non essere applicabile a tutte le situazioni, spesso mi imbatto in situazioni in cui creo una nuova classe per individuare una responsabilità quando posso semplicemente creare una nuova funzione all'interno di una classe e funzionerà altrettanto bene.
Esempio - Prima della separazione
class ProductDataMapper
{
function findById($id)
{
// data retrieval concern i.e. read info from DB
$data = array('name' => 'Mike');
// data-to-object mapping concern
$productParams = array();
$productParams['name'] = $data['name_column'];
$product = new Product($productParams);
return $product;
}
}
Esempio - Dopo la separazione
class ProductDataMapper
{
function findById($id)
{
$data = $this->dataConcern($id);
$productParams = $this->mappingConcern($data);
$product = new Product($productParams);
return $product;
}
function dataConcern($id)
{
$data = $db->get("SELECT...$id");
return $data;
}
function mappingConcern($data)
{
$productParams = array();
$productParams['name'] = $data['name_column'];
return $productParams;
}
}
Quindi se la mia tabella SQL cambia ma i dati rimangono gli stessi, ho solo bisogno di modificare un metodo ::dataConcern()
. Se il mio legame cambia tra lo schema ei parametri dell'oggetto, tutto ciò che devo cambiare è ::mappingConcern()
.
Perché creare un'intera altra classe per gestire tali responsabilità?