Ciao a tutti,
@Federico ("Anche voi siete abituati a fare così quando dovete passare dati
da una DTO a un altro? Se no, come fate?")
Dipende :-)
Nel codice di produzione sì, lo uso spesso, anche perché negli ultimi
progetti che ho realizzato avevo la necessità di creare classi
serializzabili per chiamate RPC con GWT; perciò ho utilizzato la libreria
FreeBuilder (https://github.com/google/FreeBuilder), che permette la
generazione automatica di un builder attraverso annotation e dichiarazione
di metodi abstract; questo riduce notevolmente il boilerplate code ed evita
errori.
Nel codice di test invece generalmente no: uso le API di Mockito per
definire i collaboratori della classe in test o i parametri dei vari
metodi; quindi, il tuo esempio lo scriverei così:
Expense expense = mock(Expense.class);
when(expense.getId()).thenReturn(id);
.....
Ma è più una questione di abitudine... alla fine il risultato è lo stesso,
sempre considerando che il builder arriva praticamente a costo zero.
@Tatiana ("In quali occasioni ricorrete al mapping dei bean (trasformazione
di un bean in un altro bean di struttura molto simile se non uguale)?
Quando secondo voi è giustificata la creazione di questi bean differenti e
quando invece è insensato? Preferite mapper automatici tipo dozer o fate a
mano (al di là di come e dove, comunque a mano)?")
Questa domanda e le risposte che ho letto nel thread sono molto
interessanti: ci sono diversi punti di vista, chi è più pragmatico e
minimizza la creazione di strutture nuove e chi invece è più pedissequo
nell'applicare le best practice.
Io appartengo più all'ultima categoria: generalmente creo una nuova classe
quando uno di questi criteri è soddisfatto:
1. c'è un cambio di layer e la classe originale non è immutabile (es. dal
modello del dominio a quello relazionale, sempre se non si utilizza JPA o
un ORM; oppure dal modello del dominio a quello di presentazione)
2. la classe originale è immutabile ma non è serializzabile (caso raro)
3. la classe originale o quella di destinazione appartengono a sistemi
diversi (cfr. port e adapter citato da qualcun altro nel thread)
Per la trasformazione da una classe a un'altra non utilizzo alcun mapper o
framework, solo TDD. È un lavoro un po' tedioso, l'ho fatto proprio in
questi giorni :-/
Ultima cosa: in molti commenti ho visto che il punto è "scrivere troppo";
non credo che questo sia un problema: gli IDE che usiamo sono molto
avanzati, ci sono molte agevolazioni per noi sviluppatori che ci aiutano a
scrivere il nostro codice; è vero che linguaggi creati successivamente a
Java hanno un approccio meno verbose, ma dal mio punto di vista è molto più
importante l'organizzazione dei metodi nelle classi e delle classi nei
package, ovviamente con tutti gli unit test del caso.
Ciao,
Ramon