Usa DTO Pattern o Serialize Domain Objects

4

Un mio collega è contrario all'uso di DTO e ritiene piuttosto che dovremmo restituire gli oggetti Entity / Domain serializzati per un api REST. Sente che DTO è un modello anti e si trova in questo articolo Data Transfer Object è una vergogna . Sebbene l'articolo abbia un approccio diverso per risolvere il "problema DTO" come propone il mio collega. Personalmente ho sempre preferito utilizzare DTO per tre motivi.

  1. La mia API non è legata al mio livello di dominio, quindi ho flessibilità. Il livello del dominio può cambiare senza impatto sull'API e viceversa.
  2. Quando si usano ORM come JPA / Hibernate, non accidentalmente inviano tonnellate di query per costruire il grafico degli oggetti per la serializzazione, o devo mettere logiche / annotazioni nel mio livello di entità per controllare la serializzazione, che è davvero una preoccupazione di vista non un preoccupazione del dominio.
  3. Posso facilmente controllare cosa e quante informazioni passano sul filo, IE invia la manciata di campi che il cliente desidera anziché 30 campi.

Il punto 2 non è un grosso problema se un ORM non viene utilizzato. Riesco ancora a vedere se il problema si presenta anche se hai qualcosa di simile al seguente

class Order {

    private Long orderId;

    // additional fields go here

    private List<LineItem> lineItems;
}

class LineItem {

    private Long id;
    private BigDecimal amount;
    private int qty;
}

Diciamo che il cliente desiderava solo un elenco di ordini e non si preoccupava degli elementi pubblicitari. Se non fosse coinvolto un DTO, è possibile popolare l'oggetto Order e lasciare i lineItems come una lista vuota, ma ciò sarebbe scomodo e confuso per popolarlo in alcuni casi, e non in altri. O tutti i dati potrebbero essere caricati e trasferiti, ma ciò sembra uno spreco e un potenziale impatto sulle prestazioni.

C'è un momento appropriato per saltare le DTO e restituire semplicemente l'oggetto dominio? O sto pensando male e DTO non è un modello che dovrebbe essere usato. C'è un altro approccio?

    
posta greyfox 22.04.2018 - 22:48
fonte

1 risposta

7

Prima di tutto, limitarsi a citare l'articolo di qualcuno su Internet non costituisce una giustificazione sufficiente per cambiare una pratica. Devi valutare i pro e i contro e decidere.

Nota che l'autore dell'articolo citato odia gli ORM . Segue un rigido principio di incapsulare il codice con i suoi dati, che è una specie del principio fondamentale dell'orientamento agli oggetti. Non ama molto l'ORM perché toglie le classi della loro intelligenza, e non ha torto in proposito.

Nel suo articolo di odio ORM, scrive (più o meno) che le classi dovrebbero essere responsabili di salvarsi nel database, una pratica che viola un principio chiamato "persistenza ignoranza". L'ignoranza di persistenza significa semplicemente che le classi non dovrebbero sapere nulla del loro overlord del database, ed è difficile da raggiungere in modo realistico con ORM . Fa il giro del problema dell'ignoranza della persistenza usando le interfacce, rendendo i suoi dati ignoranti della sua implementazione sottostante.

Per essere onesti, scrivo codice che assomiglia molto al suo sotto il cofano, anche se un po 'più snello del suo (Java ha una reputazione per essere molto prolisso, e non mi preoccupo delle interfacce DTO). Dopo aver lavorato per un po 'con Entity Framework, ho iniziato a utilizzare Dapper e scrivere invece query SQL. Ottengo prestazioni migliori, meno complessità e un targeting più preciso del database.

La classe che implementa il tuo cosiddetto "oggetto di trasferimento dati" è un bel posto in cui inserire questo codice; tutto ciò che devi fare è consegnare un oggetto IdbConnection , e la classe ha tutto ciò di cui ha bisogno per leggere e persistere nel database.

Credo che la mia domanda sia, perché questa deve essere una scelta o una o? Se hai bisogno di qualcosa dal database che richiede un DTO, usa un DTO. Se vuoi quello che chiami un "oggetto dominio", allora usa quello.

    
risposta data 23.04.2018 - 06:20
fonte

Leggi altre domande sui tag