Esiste un modello o un metodo di refactoring per estrarre il caricamento dei dati dalla classe esistente

0

Sto effettuando il refactoring del codebase legacy. Parte di essa è una funzione loadProduct() all'interno di una più ampia classe "tutto". loadProduct() carica i dati da un database. Voglio spostare questa parte di dati di caricamento fuori dalla classe più grande, perché non penso che appartenga a questa classe. Non sono sicuro esattamente dove voglio spostarlo, ma penso che spostarlo solo in una classe separata sarà un ottimo inizio.

Come faccio a fare questo?

vale a dire. Immagina questo:

class Big
{
    function x() {}
    function y() {}
    function z() {}
    function w() {}

    ...

    function loadProduct()
    {
        $sql = "select * from X where Y = $this->p1 and w = $this->p2";
        $result = db_call($sql);
        ...
        $this->a = $result->field_a; 
    }
}

Quello che penso fino ad ora è:

  1. Posso creare una classe Product che crea un'istanza e restituisce i dati del prodotto. Chiamalo cioè $data = new Product($p1, $p2, $p3) .

  2. crea una classe ProductProvider , che ha la funzione loadFromDB() . Chiamalo:

$pp = new ProductProvider();
$data = $pp->loadFromDB($p1, $p2, $p3);
...
include 'db.php';
class ProductProvider()
{
    function loadFromDB($p1, $p2, $p3)
    {
         $product = null;
         //code to load Product
         return $product;
    }
}

Penso che il modo 2 sia un po 'più flessibile e mi consente di aggiungere più funzioni in seguito, come il caricamento di insiemi di dati diversi da diversi set di parametri. Questa flessibilità potrebbe rivelarsi utile nel caso in cui il codebase legacy mi dia in futuro sorprese. (Ad esempio, come refactor, potrei rendermi conto che ho bisogno di spostare o raggruppare questo pezzo di caricamento dei dati in o con qualche altro pezzo di codice e l'incapsulamento del codice che il provider mi fornirà dovrebbe essere facile da spostare altrove).

Il mio secondo modello di esempio sarà adatto al mio esempio di refactoring?

  • Per adattamento appropriato intendo best practice accettata dal settore, consigliata per casi simili ai miei.
posta Dennis 31.03.2014 - 19:00
fonte

1 risposta

1

Come richiesto nel titolo, probabilmente stai cercando il pattern Data Access Object , che è anche discusso in < a href="https://stackoverflow.com/questions/11266388/php-data-access-object"> questa domanda StackOverflow .

Il punto è utilizzando i livelli software per separare la logica del programma dalla struttura del database, perché in questo modo è possibile modificare il database schema, i nomi delle tabelle e modifica una parte piccola e isolata del tuo codice. Anche avere tutte le classi DAO nello stesso pacchetto sarebbe di aiuto se il sistema di gestione del database dovesse cambiare. Un esempio di possibile cambiamento si sta spostando da relazionale a NoSQL.

Come indicato nei commenti e spiegato da Mak Seeman , Provider non è un modello. Tutto il codice che viene chiamato almeno una volta, fornisce alcuni servizi. Il nome di una classe dovrebbe riflettere ciò che viene fornito, e non il fatto che fornisce qualcosa.

    
risposta data 31.03.2014 - 23:41
fonte

Leggi altre domande sui tag