2012-01-01 9 views
8

Semplicemente sull'implementazione TDG (Table Data Gateway): si crea una classe TDG separata che contiene SQL per le operazioni CRUD con la tabella concreta. Pertanto, i tuoi modelli comunicano non direttamente con un'origine dati (ad esempio database) ma tramite quelli astratti - classi TDG. Quindi, è solo un approccio per creare un altro livello di astrazione ed è solo un wrapper per comunicare con il database - ottenere e modificare i dati. Le classi IMHO TDG non dovrebbero contenere membri, solo metodi. Ecco un buon schema che visualizza l'uso TDG pattern. Quando si utilizza l'approccio TDG, SQL deve essere spostato dalle classi del modello alle classi TDG. E tutti i dati che recupero dal DB attraverso le classi TDG sono memorizzati nei membri del mio modello.In che modo l'implementazione di Table Data Gateway differisce da Active Record?

Ora, per quanto riguarda l'implementazione del record attivo? Se dovessi unire l'accesso ai dati e la mia classe del modello in una classe del modello, implementerei la registrazione attiva? Non sono riuscito a trovare una chiara distinzione o il modo in cui questi modelli appaiono in PHP e differiscono l'uno dall'altro.

Spesso, sto avendo una classe di database singleton e quindi separata la classe del modello per ogni tabella di database. Ogni classe di modello ha CRUD + diverse operazioni personalizzate (count, avg e così via). Alcune classi hanno membri per i risultati persistenti da CRUD o operazioni personalizzate - questo è fatto sulla necessità. Questo approccio può essere identificato come record attivo? Inoltre, se spostassi SQL dalle mie classi modello alle classi TDG, questo sarebbe Table Data Gateway?

risposta

14

Da http://martinfowler.com/eaaCatalog/index.html

Tabella dati Gateway: Un oggetto che agisce come un gateway (466) per una tabella di database. Un'istanza gestisce tutte le righe nella tabella.

enter image description here

attivo Record: Un oggetto che avvolge una riga in una tabella di database o vista, incapsula l'accesso al database, e aggiunge logica di dominio su tali dati.

enter image description here

La principale differenza evidente è che TDGS avvolgono l'accesso a una tavolo e restituisce solo i dati delle righe, mentre RA avvolgono l'accesso a un fila nella tabella e aggiunge la logica di business per esso.

A meno che non si sia verificato un disadattamento di impedenza molto bassa, è preferibile disporre di un TDG perché con AR gli oggetti business/dominio seguono la struttura nel database, che solitamente non è il modo in cui gli oggetti del dominio devono essere modellati. Una fila può sapere come persistere, ma una persona non dovrebbe saperlo. Nel lungo periodo è più gestibile separare la logica di persistenza e la logica di dominio.

Per quanto riguarda l'oggetto Singleton DB, dare un'occhiata a Is there a use-case for singletons with database access in PHP?.

+0

Grazie. Quali tipi di metodi (e query SQL) potrei avere quando si implementa TDG? Non dovrei mettere la logica del business ma cosa potrebbe essere considerato una questione di business logic? Ad esempio, posso avere tali metodi (e query SQL) nelle classi TDG come selectAllRows, aggiornamento batch (passare una matrice di dati), selezionare AllPersonsByLastName, countAll, SelectAvg ed ecc.? IMHO tutti dovrebbero risiedere nella classe TDG. Per elementi di logica aziendale si intende qualsiasi calcolo aggiuntivo derivato dal set di risultati SQL derivato dalla classe TDG? – Centurion

+0

@Centurion un TDG può contenere tutte le query SQL relative alla tabella: inserimenti, aggiornamenti, selezioni (logica di persistenza).Non dovrebbe contenere codice che elabora i risultati della query (business logic). Mettilo in un [modello di dominio] (http://martinfowler.com/eaaCatalog/domainModel.html) o in un [modulo tabella] (http://martinfowler.com/eaaCatalog/tableModule.html) – Gordon

+0

Hai l'idea:) ma ho ancora una domanda. Una classe del modulo della tabella si associa ad una tabella, quindi IMHO tale classe di moduli tabella potrebbe essere considerata come un modello (quando si parla in contesto MVC)? Che dire del modello di dominio, che cosa dovrebbe essere considerato un modello allora? Un gruppo di classi che vengono utilizzate per il controller concreto? – Centurion

Problemi correlati