Domanda

So che questa è probabilmente una questione annosa, ma che cosa è la pratica migliore? Utilizzando un oggetto modello di dominio in tutti gli strati della vostra applicazione, e anche i valori di legame direttamente a loro sul JSP (sto usando JSF). O convertire un oggetto del modello di dominio in un DTO nello strato DAO o il servizio e inviare un DTO leggero per il livello di presentazione.

mi è stato detto che non ha senso per uso DTOS perché le modifiche al database potranno comportare modifiche a tutte le vostre DTOs mentre l'uso del modello di oggetti in tutto il mondo sarà solo richiedere modifiche al modello a oggetti interessata. Tuttavia, la facilità d'uso e la leggerezza di DTOs sembra a superare questo.

Vorrei sottolineare che usi la mia app Hibernate Modello oggetti e utilizza i propri oggetti del modello su misura creato (non significato legati a qualsiasi sessione di DB, sempre staccato). E 'uno degli scenari sopra più vantaggioso per un rigoroso modello Object Model? Utilizzando Hibernate è stato un enorme valle di lacrime per quanto riguarda le cose come eccezioni Pigro inizializzazione.

Io sono l'editing questa domanda nella speranza di promuovere la discussione (non so se sto facendo questo diritto):

Il problema che ho con oggetti del modello è che non sono flessibili a tutti. Un commento qui sotto dice che l'applicazione deve essere progettato in modo che gli oggetti del modello può essere utilizzato in tutti i livelli. Perché? Se un utente vuole un pezzo di funzionalità ridicolo, dovrei dire loro, 'bene che non funziona con gli oggetti del modello'?

Chiaro e semplice, ci sono solo momenti in cui gli oggetti del modello non funziona. Si può avere:

public class Teacher {
    List<Student> students;
    [tons of other Teacher-related fields]
}
public class Student {
    double gpa;
   [tons of other Student-related fields]
}

, ma forse non avete bisogno di tutte queste informazioni. Hai solo bisogno il cognome del docente, il numero di studenti è insegnano quest'anno, e GPA media per tutti gli studenti combinati. Cosa faresti in quel caso? Recupera le informazioni complete insegnante e studente relazioni e quindi il codice ottiene un conteggio sulla lista degli studenti, poi calcola una media totale di tutti i GPA all'interno? Che sembra troppo sopravvalutato uno sforzo maggiore che semplicemente creare un DTO con 'String lastName', 'int numStudents', e 'doppio combinedGpa;

Può suonare come la mia mente è stata fatta su questi, ma devo ancora lavorare in un'applicazione in cui oggetti del modello possono essere completamente utilizzati in modo pulito in ogni caso. applicazioni reali regolari con out-of-the-ordinario utente richieste semplicemente non funziona in questo modo.

È stato utile?

Soluzione

In realtà dipende dalla complessità della vostra applicazione. Mescolando gli oggetti di dominio nello strato di vista ha due possibili implicazioni:

  1. sarete tentati di modificare l'oggetto del dominio per ospitare cose che avete bisogno nello strato di visualizzazione
  2. Il tuo View strato conterrà complessità aggiuntivo causato da una mancata corrispondenza tra ciò che i vostri oggetti di dominio offrono e che cosa il vostro vista davvero bisogno. Potrebbe non essere in grado di aggirare questa complessità ma probabilmente non appartiene al livello della Vista.

Se gli oggetti del dominio sono semplici e le vostre opinioni sono pochi, saltando i DTOs potrebbe essere la cosa più semplice.

D'altra parte, se il modello di dominio rischia di evolvere e diventare complessa e se le vostre opinioni sono suscettibili di essere numerosi e vari, avendo oggetti vista specifici potrebbe essere una buona idea. Nel mondo MVC, utilizzando ViewModels è comune e fa un sacco di senso per me.

Altri suggerimenti

Un altro voto per il dominio degli oggetti. Per quanto riguarda il Domain Driven Design concerne il modello di dominio è il re e deve essere utilizzato laddove possibile. L'applicazione deve essere progettato in modo dove più strati (bar strato Infrastructure) possono utilizzare oggetti di dominio.

Credo di DTOs come utile solo in cui è necessario essere serializzato oggetti. Se non v'è alcun trasferimento di sopra del filo o in un'architettura incompatibile non li uso. modello DTO è utile per mantenere la serializzazione fuori dell'oggetto dominio. Considerando che l'interazione UI / Domain non ha bisogno di serializzazione, fare cose semplici e utilizzare gli oggetti reali.

Credo che avere DTO non è in genere un modello anti. Ci sono un sacco di persone e sistemi che li utilizzano e il beneficio che si ottiene è lo strato vista disaccoppiato che può essere progettato e modularizzato indipendentemente dal modello di dominio. Anche se sono d'accordo che si dovrebbe usare oggetti di dominio, se possibile, ci sono scenari in cui è possibile ottenere i problemi quando si legano lo strato di vista direttamente al modello di dominio.

ho fatto buone esperienze con un modello di vista che solo avvolge gli oggetti di dominio e dei delegati la maggior parte delle operazioni da them.This vedono disaccoppia e strato del dominio, permette per la composizione flessibile degli oggetti di dominio e ancora non è molto lavoro da implementare poiché IDE supportano modello delegazione.

Scenari quando oggetto di dominio sono problematici da inviare:

  1. potrebbe essere necessario informazioni aggregate o altri tipi di 'campi calcolati' inviati al livello di interfaccia utente (nell'esempio Flex / GWT) e non si vuole rovinare l'oggetto di dominio
  2. è possibile riscontrare la necessità di serializzazione oggetto grafico ciclico (nel tuo esempio, se studente aveva List relazione), alcuni protocolli hanno problemi con che
  3. Sospensione LazyInitializationException quando si tratta con i serializzatori quadro (BlazeDS per Flex / GWT serializzatore)

Non sono sicuro che sia una chiara risposta tagliata in quei cirumcstances

A mio parere, non c'è nessun problema a tutti con l'utilizzo di oggetti del modello di dominio in ogni livello. Lei ha detto che non hai bisogno di tutte le informazioni. Quando sei in JSP, utilizzare solo i dati di cui avete bisogno. Nessuno ti costringe a prendere ogni proprietà. Hai anche detto che è necessario fare calcoli relativi alla proprietà dell'oggetto al fine di ottenere GPA, # degli studenti, ecc Ci sono 3 possibilità: creare le proprietà di sintesi nel modello a oggetti del dominio che restituiscono i dati corretti per voi, avvolto bello e ordinato; fare i calcoli in uno strato controller o servizio, e li esporre attraverso i getter appropriati; o gestire il tutto all'interno del vostro JSP. È necessario recuperare / compilazione / disputa il COMUNQUE dei dati, quindi perché aggiungere maggiore complessità con un DTO.

Inoltre, con ogni DTO, si sta creando un.) Di una classe in più ora avete da mantenere, e b.) Almeno 1 metodo in più da qualche parte in qualche classe che costruisce e popola il metodo DTO (DAO, fabbrica, eccetera.). Più manutenzione = sviluppatore infelice 6 mesi più tardi.

Quindi, ci sono i miei argomenti contro DTOs. Io li uso, ma solo in alcuni scenari, come quando ho davvero bisogno di ottimizzare per velocità e / o l'utilizzo di memoria, e il costo di un oggetto di idratazione completa modello di dominio è troppo. I servizi Web sono un buon esempio di quando io preferisco usare DTOs.

Il comportamento di una classe, o suoi metodi interni non dovrebbero essere esposti a livelli non interessati con il loro comportamento. Il trasferimento dei dati, non il comportamento. Usa dominio oggetti all'interno del dominio. Il web non è un dominio controllato, e gli sviluppatori dell'interfaccia utente non deve essere riguarda il comportamento di dominio, solo dati.

Il dominio deve essere incapsulati e protetti contro eventuali modifiche da personale non interessati con la salute del dominio.

Perdite comportamento non è la migliore abitudine.

Se si tratta di un piccolo progetto, costruito con principes corretta così. In questo modo teniamo sempre a mente perché facciamo quello che facciamo, e non solo come.

Penso che quello che dovremmo considerare qui in primo luogo è il costo di introdurre nuovo livello. Prendere DTO per esempio - che abbiamo bisogno di fare una mappatura. Come qualcuno ha detto, la traduzione è male e deve essere evitato per quanto possibile.

D'altra parte penso che ci sono poche cose che in genere non si dovrebbe fare. Quelli che dicono tutti DTOs sono male sono sbagliato - dipende sempre il caso d'uso! Sono davvero giustificate?

E, infine, credo personalmente gli oggetti di dominio dovrebbe essere lasciato andare alla vista stessa. Immaginate che cosa l'integrazione wicket è quindi simile. Ma prendere Spring MVC per esempio - del dominio sarebbe rimasto poi a livello di applicazione, probabilmente ...

DTO è ampiamente considerato un anti-modello al giorno d'oggi, e il consiglio è di solito "evitarli a tutti i costi".

Uno dei principali vantaggi di un quadro ORM come Hibernate, è che è possibile utilizzare oggetti di dominio a tutti i livelli, e fare DTOs non ha realmente bisogno. L'avvertimento, ovviamente, è che si deve dedicare un momento di pensare in quei rapporti:. Quando usare il recupero pigro, quando usare ansiosi, etc

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