Perché SRP utilizza il costrutto di classe per contenere una responsabilità contraria all'utilizzo di qualsiasi altra entità OOP?

2

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à?

    
posta Dennis 01.07.2015 - 21:23
fonte

1 risposta

3

Why create a whole other classes to handle those responsibilities?

Perché quando si esegue la programmazione orientata agli oggetti, l'attenzione dovrebbe essere sugli oggetti. Sono la vostra unità di lavoro per fare il disegno e fornire l'astrazione. E, soprattutto, sono la vostra unità di riutilizzo. Lasciandoli cambiare per diversi motivi, stai costringendo le persone che li utilizzano per un motivo a subire l'impatto di una modifica apportata a un altro motivo a cui non interessa.

Sono registrato dicendo che SRP funziona altrettanto bene attraverso l'obiettivo della programmazione funzionale / imperativa. La differenza è che in quei paradigmi, la tua unità di riutilizzo non è una classe, ma una funzione o un modulo.

    
risposta data 01.07.2015 - 21:43
fonte