Qual è lo scopo di utilizzare DTO (Data Transfer Objects)?


132

Qual è lo scopo di utilizzare DTO ed è un concetto obsoleto? Uso POJO nel livello di visualizzazione per trasferire e conservare i dati. Questi POJO possono essere considerati un'alternativa ai DTO?


10
Ma POJO può essere DTO e DTO può essere implementato con POJO. Stai confrontando mele e arance.
Euforico,

3
Perché le buone idee dovrebbero diventare obsolete? Guarda Lisp. A parte gli scherzi, sono d'accordo con Euphoric: di solito implemento DTO usando POJO. Trovo ancora che i DTO siano un concetto molto semplice (KISS) e utile.
Giorgio,

Non ha senso, è un anti-pattern, vedi: L'oggetto di trasferimento dati è un peccato
yegor256,

Risposte:


115

DTO è un modello ed è indipendente dall'implementazione (POJO / POCO). DTO afferma che, poiché ogni chiamata a qualsiasi interfaccia remota è costosa, la risposta a ciascuna chiamata dovrebbe portare quanti più dati possibile. Pertanto, se sono richieste più richieste per portare dati per una determinata attività, i dati da portare possono essere combinati in un DTO in modo che solo una richiesta possa portare tutti i dati richiesti. Il catalogo dei modelli di Enterprise Application Architecture ha maggiori dettagli.

I DTO sono un concetto fondamentale, non obsoleto.


9
potresti trovarli con nomi diversi, dato che tutti sembrano reinventare la ruota in questi giorni
linkerro,

3
Come "Oggetto valore".
thed

2
@linkerro: Vero: penso che molte persone dovrebbero passare più tempo a leggere su cose che sono già state inventate invece di reinventarle da sole. Le cose reinventate saranno sempre meno mature.
Giorgio,

10
@Giorgio Ci sono molti sviluppatori che corrono ancora con idee che non avrebbero mai dovuto decollare. Vorrei che più sviluppatori mettessero in discussione ogni idea di cui leggessero.
Erik Reppen,

59

DTO come concetto (oggetti il ​​cui scopo è quello di raccogliere dati da restituire al client dal server) non è certamente obsoleto.

Ciò che è in qualche modo obsoleto è l'idea di avere DTO che non contengono alcuna logica, sono usati solo per trasmettere dati e "mappati" da oggetti di dominio prima della trasmissione al client, e lì mappati per visualizzare i modelli prima di passarli al livello di visualizzazione. Nelle applicazioni semplici, gli oggetti di dominio possono spesso essere riutilizzati direttamente come DTO e passati direttamente al livello di visualizzazione, in modo che esista un solo modello di dati unificato. Per applicazioni più complesse non si desidera esporre l'intero modello di dominio al client, quindi è necessario un mapping dai modelli di dominio ai DTO. Avere un modello di vista separato che duplica i dati dai DTO non ha quasi mai senso.

Tuttavia, la ragione per cui questa nozione è obsoleta piuttosto che semplicemente sbagliata è che alcuni framework / tecnologie (principalmente più vecchi) lo richiedono, poiché i loro modelli di dominio e visualizzazione non sono POJOS e sono invece direttamente collegati al framework.

In particolare, Entity Beans in J2EE prima dello standard EJB 3 non erano POJO e invece erano oggetti proxy costruiti dal server delle app - semplicemente non era possibile inviarli al client, quindi non avevi scelta di avere un livello DTO separato - era obbligatorio.


2
Come sviluppatore dell'interfaccia utente costretto a un ruolo più generalista ho sicuramente trovato stupefacente il fenomeno Mapper.Map nella nostra base di codice. Perché il DTO non può semplicemente mapparsi?
Erik Reppen,

1
@ErikReppen Il vantaggio principale è il disaccoppiamento tra modelli di dominio e DTO. Se il DTO esegue la stessa mappatura, ha bisogno di un riferimento ai tuoi modelli di dominio.
Alexander Derck,

17

Sebbene DTO non sia un modello obsoleto, viene spesso applicato inutilmente, il che potrebbe far sembrare obsoleto.

Il modello più abusato nella comunità Java Enterprise è il DTO. DTO è stato chiaramente definito come una soluzione per un problema di distribuzione. DTO doveva essere un contenitore di dati a grana grossa che trasportava in modo efficiente i dati tra processi (livelli). ~ Adam Bien

Ad esempio, supponiamo che tu abbia un JSF ManagedBean. Una domanda comune è se il bean deve contenere direttamente un riferimento a un'entità JPA o se deve mantenere un riferimento a un oggetto intermedio che viene successivamente convertito in un'entità. Ho sentito questo oggetto intermedio indicato come DTO, ma se i tuoi ManagedBeans ed Entity operano all'interno della stessa JVM, allora ci sono pochi vantaggi nell'utilizzare il modello DTO.

Prendi in considerazione le annotazioni di convalida del bean. Le tue entità JPA sono probabilmente annotate con convalide @NotNull e @Size. Se stai utilizzando un DTO, ti consigliamo di ripetere queste convalide nel tuo DTO in modo che i client che utilizzano la tua interfaccia remota non debbano inviare un messaggio per scoprire che hanno fallito la convalida di base. Immagina tutto quel lavoro extra di copia delle annotazioni di convalida del fagiolo tra il tuo DTO ed Entità, ma se la tua vista e le entità operano all'interno della stessa JVM, non è necessario intraprendere questo lavoro extra: basta usare le entità.

Il link di IAmTheDude al Catalog of Patterns of Enterprise Application Architecture fornisce una concisa spiegazione dei DTO, e qui ci sono altri riferimenti che ho trovato illuminanti:


3
C'è la frase: "..., ma se i tuoi ManagedBeans ed Entity operano all'interno della stessa JVM, allora c'è poco beneficio nell'uso del modello DTO" . Esistono molte app di medie dimensioni nelle aziende che implementano stupidamente il modello DTO senza alcun vantaggio. Aggiunge semplicemente un "livello di copia" inutile. Le persone che hanno creato questi sistemi non si sono rese conto che il gestore entità Java EE 5+ scollegava le entità quando termina la transazione e le rende effettive DTO. Quindi, per le webapp a JVM singola, il tipo di pattern è obsoleto . Sembra essere la reliquia degli sviluppatori di backend J2EE ...
Kawu,

Ma cos'è un "JSF ManagedBean" e un "JPA Entity"? Se non sono obsoleti, allora dovresti essere in grado di spiegarli usando termini agnostici di framework e linguaggio.
U Avalos,

8

Assolutamente no! Di recente ho imparato lezioni su come utilizzare meglio i DTO piuttosto che l'oggetto di business che usi (possibilmente associato al tuo mappatore ORM).

Tuttavia, basta usarli quando sono appropriati da usare e non solo per il gusto di usarli perché sono menzionati in un buon libro di schemi.
Un tipico esempio che mi viene in mente è quando esponi una sorta di interfaccia a terze parti. In tale scenario ti piacerebbe mantenere gli oggetti scambiati abbastanza stabili che di solito puoi ottenere bene con i DTO.


1

Un posto che ho trovato particolarmente utili nei DTO è il contenimento della logica per le risposte API. Con questo modello è facile gestire diversi tipi di risposte dagli oggetti ai vari formati in modo testabile. Usando questo modello nel mio ruolo attuale, siamo stati in grado di iniziare a testare i formati di risposta per le nostre API, il che è stato prezioso poiché il nostro stack sta diventando più isomorfo con vari client (http / mobile). Sicuramente non obsoleto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.