Riepilogo
Voglio analizzare la preoccupazione di "creare un oggetto popolato dal database", da usare all'interno della mia applicazione. Il pattern DataMapper sembra fare proprio questo per me.
Definizione del pattern DataMapper: link
Tuttavia, all'interno dello stesso modello DataMapper
ci sono dubbi su
- gestione oggetti - creazione, popolazione, convalida (forse), ritorno al chiamante, distruzione, salvataggio, aggiornamento ecc.
- caricamento dei dati acquisiti dal database (ovvero costruzione di SQL, invio di SQL a funzioni di DB nativo, ricezione di risorse di dati DB, o nel caso di PHP un array associativo di dati)
- mappatura dei dati caricati dal database nelle variabili dell'oggetto (traduzione schema-oggetto, idratazione, ecc.)
Il mio obiettivo per quanto riguarda la mia applicazione è iniziare con "Voglio dati, dati dati" e DataMapper
"qui è tutto pronto per te. E non solo i dati che volevi, ma un l'intero oggetto, già popolato con i dati, e mappato correttamente anche dallo schema DB! ". ("Wow, grazie a DataMapper!")
Domanda:
Il pattern DataMapper può contenere tutti i problemi sopra riportati in una singola classe , oppure deve suddividere ogni preoccupazione nelle proprie classi separate ?
Dettagli e amp; Qualche codice
Qui di seguito mi concentrerò sulle preoccupazioni relative a "dati" e "creazione e popolazione di oggetti". Considerando concetti come la separazione di preoccupazioni, l'iniezione di dipendenza e le best practice di programmazione orientata agli oggetti, è appropriato che un modello DataMapper
contenga preoccupazione per la gestione dei dati? Possono interessare i dati (ad esempio SQL) e la preoccupazione di creare-n-populare-un-oggetto coesistono all'interno di una classe?
Nell'esempio seguente, ho SQL (noto anche come dato sui dati) nella mia classe DataMapper
class MyProductMapper
{
function getProduct()
{
$sql = "SELECT name FROM product limit 1";
$result = db_query($sql);
$data = db_fetch_array($result);
$product = new MyProduct($data);
return $product;
}
}
Il problema dei dati dovrebbe essere separato?
Considera il codice di seguito come alternativa al codice sopra (SQL estratto da DataMapper e spostato nella propria classe di dati):
//class that concerns itself with receiving some data
//creating an object, and populating that object with the data
//returning that object
class MyProductMapper
{
function getProduct()
{
$data = (new ProductData())->getNameData();
$product = new MyProduct($data);
// return product to the caller
return $product;
}
}
//class concerns itself with data retrieval functionality
class ProductData
{
function getNameData()
{
$sql = "SELECT name FROM product limit 1";
$result = db_query($sql);
$dataFromDB = db_fetch_array($result);//array('name'=>"ABC-1234");
return $dataFromDB;
}
}
Ho separato il recupero dei dati dalla creazione dell'oggetto / dalla popolazione di oggetti. La preoccupazione dei dati dovrebbe essere separata dalla preoccupazione della classe DataMapper, o può coesistere con altri all'interno della stessa classe, o è importante, e un modo è altrettanto buono di un altro?