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 è:
-
Posso creare una classe
Product
che crea un'istanza e restituisce i dati del prodotto. Chiamalo cioè$data = new Product($p1, $p2, $p3)
. -
crea una classe
ProductProvider
, che ha la funzioneloadFromDB()
. 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.