Domanda

Come ho detto nel titolo, mi interessa sapere quello che (come gli sviluppatori con esperienza) pensa circa l'uso del pattern DAO, in particolare all'interno di un'applicazione web. Quali vantaggi avete trovato e quali conseguenze del suo uso avete antipatia?

È stato utile?

Soluzione

I problemi con DAO che ho visto è che in genere gestiscono oggetti pieno tutto il tempo. Questo crea in testa completamente inutili, che non esisterebbe con le query semplici. Ad esempio, se un menu a discesa deve essere creato fuori dei dati di riferimento del database, un utente DAO può semplicemente dire: "Dammi la collezione di oggetti di questo tavolo dove y ordinate per z". Poi, che i dati viene utilizzato nel menu a discesa, ma in genere solo per una combinazione chiave / valore, ignorando tutto il resto negli oggetti (dati creati, ultimo utente che ha aggiornato di esso, anche se non è attivo, ecc) che è stato recuperato e mappato . Anche se questo massaggio effettuato vicino alla chiamata DAO e gli oggetti non vengono memorizzati come vengono recuperati (che non è tipicamente il caso, purtroppo, gli oggetti sono spesso avvolti in ac: forEach (JSP) e iterate su per produrre un menu a discesa ), crea ancora di database non necessari e l'overhead di rete, per non parlare del temporaneo aumento memoria per contenere questi oggetti.

Ora, questo non vuol dire che un DAO non può essere progettato per recuperare una mappa di dati di riferimento - certamente può. Ma di solito sono utilizzati per la mappatura oggetto pieno, che non è ciò che è necessario per tutto il tempo. Si tratta di un punto di forza durante il salvataggio, ma una debolezza, IMO, quando il recupero dei dati - certo, si ottiene tutto questo - ma spesso non hai bisogno di tutto questo, e semplicemente spreca la memoria, larghezza di banda e il tempo

.

Altri suggerimenti

Nota: si potrebbe trovare altri difetti, ma ecco un rapido elenco dalla mia esperienza

Pro:

  • Comune chiama a recuperare gli oggetti.
  • Una volta che avete il generale creare / lettura / aggiornamento / cancellare set di flusso, il layout generale può essere ripetuto per altri DAO.
  • Si consolida anche il luogo dove la porzione specifica di persistenza del codice può andare. Separa la logica di business da altri componenti del codice.

CONS:

  • Non è la cosa più flessibile mai.
  • Se si vuole pigro carico alcuni oggetti figlio, allora si sta andando ad avere per uno a confluire il DAO con altri strati o prendere precauzioni quando si tenta di recuperare gli oggetti pigri.
  • Se scrivere a mano i DAO, quindi il codice può diventare noioso e ripetitivo.

I vantaggi dell'utilizzo di design pattern DAO

DAO o design pattern Data Access Object è un buon esempio di astrazione e incapsulamento object oriented principi. Si separa la logica di persistenza è uno strato separato chiamato strato di accesso ai dati che consente l'applicazione di reagire in modo sicuro per cambiare meccanismo di persistenza. Ad esempio, se si sposta dal meccanismo di persistenza basata su file al database, la modifica sarà limitata a livello di accesso ai dati e non avrà un impatto livello di servizio o di oggetti di dominio. Data Object Access o modello DAO è piuttosto standard in applicazioni Java esserlo nucleo Java, applicazioni web o applicazione enterprise. Di seguito sono altro paio di vantaggi di utilizzare modello DAO in un'applicazione Java:

 entrare descrizione dell'immagine qui

  1. DAO modello di progettazione mantiene anche accoppiando basso tra le diverse parti di un'applicazione. Utilizzando il modello di progettazione DAO tua Visualizza strato è completamente indipendente dello strato DAO e solo livello di servizio ha la dipendenza su di esso che viene estratta anche tramite l'interfaccia DAO.

  2. design pattern DAO consente di test JUnit per correre più veloce in quanto consente di creare Mock ed evitare la connessione al database per eseguire i test. Migliora il test, perché è facile scrivere di prova con gli oggetti Mock, piuttosto che un test di integrazione con il database. Nel caso di qualsiasi problema, durante l'esecuzione di test di unità, è sufficiente controllare il codice e non del database. scudi Anche con i problemi di connettività di database e ambiente.

  3. Dal modello DAO è basato sull'interfaccia, promuove anche object oriented principio motivo "programmazione per l'interfaccia di attuazione" che si traduce in codice flessibile e qualità.

Le forze del pattern DAO sono che consentono di creare un bel livello di astrazione del sistema di storage vero e proprio. Essi forniscono una visione più orientata agli oggetti dello strato di persistenza e una netta separazione tra il dominio e il codice che effettivamente eseguire l'accesso ai dati (JDBC dritto, quadri persistenza, ORM o anche JPA).

Se dovessi citare un punto debole, beh, direi che è un altro strato ... Ma credo che questo è il prezzo da pagare per non legare il codice per l'API di persistenza sottostante.

Abbiamo visto un po 'di reale beneficio per l'introduzione di un modello di DAO nella nostra implementazione. Ciò dovuto principalmente alla netta separazione tra interfaccia e implementazione del database. Abbiamo osservato i seguenti vantaggi:

  • di astrazione per l'attuazione effettiva di accesso al database separa la strategia di accesso ai dati dalla logica di business dell'utente. Questo ci ha permesso di scegliere una a breve termine (primavera JDBC Template) strategia di attuazione per la fase di progetto iniziale con la possibilità di passare a iBatis o Sospensione in un secondo momento. (Una scelta non siamo in grado di fare in questo momento.)
  • La separazione presenta notevoli vantaggi in testability che l'intera implementazione accesso ai dati può essere deriso in unit test. (Questo è probabilmente il più grande vantaggio)
  • La combinazione di questo con la primavera ci permette di iniettare qualsiasi implementazione DB nel sistema che abbiamo scelto (anche se questo forse spiega più DI rispetto al modello DAO).

Un problema che abbiamo incontrato, e questo può essere dovuto ad una mancanza di chiarezza del design da parte nostra è la "tendenza" di riutilizzare gli oggetti di valore I dati pubblicati dal database come oggetti di trasferimento tra i successivi livelli di astrazione nel architettura. La nostra soluzione dopo un po 'di dolore era quello di avere un oggetto di valore per strato (vale a dire di non riutilizzare gli oggetti di valore di database in successive stratificazioni architettoniche).

PRO

  • singolo punto di definizione per la tabella DB - Oggetto mappatura degli attributi
  • possibilità trasparente per implementazioni DAO ad altri tipi di archiviazione
  • sviluppare un modello di interfaccia tutti seguono di DAO
  • lo sviluppo di una classe più o meno standard di test JUnit per i risultati di DAO in una migliore copertura di test
  • il pieno controllo specifiche
  • nessuna perdita di prestazioni a causa di una soluzione eccessivamente generica

CON

  • meno "sexy" che usare l'ultimo quadro
  • sviluppatori di non arrivare a inventare le proprie ruote (potrebbe essere un PRO: -))

Come la maggior parte modelli di sviluppo, utilizzando DAO di vuole del tempo per abituarsi. Con l'esperienza arriva i benefici di codice più robusto e gli sviluppatori che sanno il motivo per cui funzionano le cose, non solo che sembra. Questo ultimo punto è il più grande vantaggio per me.

Caveat, a seconda della situazione utilizzando un framework di persistenza potrebbe essere una buona alternativa per la codifica il proprio DAO di.

Che alternativa stai pensando?

Sembra abbastanza evidente che l'immissione responsabilità per la persistenza in un posto diverso livello di presentazione di solito è buono, solo dagli argomenti di chiarezza di responsabilità e il riutilizzo. Io istintivamente vado per un approccio a tre strati: Presentazione, servizio, persistenza. Confessa di essere stato facendo in questo modo per così tanto tempo che non riesco a aduce evidenza di dolore sofferto da non fare in questo modo. A me sembra "ovvio" che avente un singolo strato che comprende il meccanismo di persistenza deve semplificare test, facilità di manutenzione e dare una buona separazione degli interessi.

Quindi, che lascia la questione di esattamente come fare strato di persistenza. La mia ipotesi di default sarebbe quella di utilizzare JPA (o quadri analoghi). Lo faccio vedere questo come un esempio di sofisticata di DAO.

Così vedo due costi di DAO. In primo luogo è necessario investire nella vostra struttura del programma, il suo design. Per i casi banali questo può sentire come eccessivo. In secondo luogo, se si utilizza un framework che implementa DAO per voi c'è una curva di apprendimento. Rispetto basta scrivere il codice JDBC direttamente questo è un altro investimento.

Pro: la separazione astratta
. Contro: codice standard (grazie a dio per il codice generatori / templates e di ORM)

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top