Re: [Jug-Torino] Quale approccio usare per mappare un bean in un altro?

2018-01-21 Thread Ramon Flamia ramon.fla...@gmail.com [it-torino-java-jug]
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


Re: [Jug-Torino] Quale approccio usare per mappare un bean in un altro?

2018-01-22 Thread Ramon Flamia ramon.fla...@gmail.com [it-torino-java-jug]
Ciao Federico,
l'organizzazione del codice e gli unit test aiutano a fare emergere quella
che tu chiami "informazione utile":

*"*quando generi 1.000 getter al giorno, poi non vedi nel tuo codice quel
getter che fa una cosa un po' diversa. Se generi i tuoi equals e poi devi
trattare un campo diversamente e' una cosa che non vedi ad occhio*" *=> p
erché mai un DTO dovrebbe avere un getter che fa una cosa diversa dagli
altri? La responsabilità di di un DTO è trasportare dati, senza
comportamenti aggiuntivi. Hai bisogno di applicare una funzione su uno o
più di essi? Allora crea le componenti che hanno questa responsabilità al
di fuori del DTO, così è tutto più chiaro.



*"Poi si, per fortuna l'IDE genera quell'informazione, ma gia' il fatto che
ci sia dell'informazione da generare mi farebbe pensare che stiamo
lavorando a un livello d'astrazione troppo basso." *=> più che altro l'IDE
ti aiuta nella creazione di strutture tutte uguali che, se scritte da un
umano, sono soggette ad errori (per non parlare poi della perdita di tempo
e della poca voglia che si ha di farlo). Non vedo differenza tra "definire
n campi private e fare genere getter e setter dall'IDE" e "una data class
in Kotlin": la generazione del codice c'è sempre, anche se nel secondo caso
è implicita. Forse il fatto che non siamo distratti da get e set nel
sorgente ma vediamo subito gli altri metodi? Allora ricadiamo nel punto
precedente.

Spero di avere colto quello che intendevi dire, ciao ;-)
Ramon


Re: [Jug-Torino] Quale approccio usare per mappare un bean in un altro?

2018-01-23 Thread Ramon Flamia ramon.fla...@gmail.com [it-torino-java-jug]
*"Il fatto e' che non vedo informazione ridondante per cui noto tutti i
casi "particolari"...*

>

*Si, capisco l'intento, ma i casi particolari non li voglio in un oggetto
"da trasporto". Per quello preferisco una bella classe con tutti campi
public-static-final + costruttore, o l'approccio di Federico (niente del
tutto)."*

È quello che avevo detto qualche messaggio fa: un DTO non ha comportamenti.
Pero, Bruno, se mi consenti una considerazione... public static final nei
campi va bene fino ad un certo punto, con oggetti mutabili credo che si
lasci la porta aperta a disastri.

Ciao,
Ramon


Re: [Jug-Torino] Quale approccio usare per mappare un bean in un altro?

2018-01-23 Thread Ramon Flamia ramon.fla...@gmail.com [it-torino-java-jug]
*"*
>
> *[...] se mi consenti una considerazione public final nei campi va
> bene fino ad un certo punto,*


> *con oggetti mutabili credo che si lasci la porta aperta a disastri*
*Scusa, c'e' uno "static" di troppo. Sono public final e, pertanto, non
mutabili. L'unico modo per "caricarli" e' con il costruttore*


*Ciao,*

*Bruno"*


La sostanza non cambia: se uno dei field esposto come public final è
mutabile (es. java.util.Date o una qualsiasi Collection) allora la classe
che crei non è immutabile ed è possibile che un client che la usa possa
invalidare gli invarianti che sono stati definiti; molto meglio proteggere
l'informazione a mio avviso (se vuoi ti faccio un esempio).

Siamo andati un po' OT comunque... :-)

Ho visto le mappe che ha indicato Federico e non fanno al caso mio:
dall'esempio che ho visto su GitHub mi sembra che si perdano tutti i
benefici di avere un compilatore e un linguaggio tipizzato solo per evitare
di scrivere setter e getter; ci sono altri modi IMHO.

Ciao,
Ramon


Re: [Jug-Torino] Quale approccio usare per mappare un bean in un altro?

2018-01-24 Thread Ramon Flamia ramon.fla...@gmail.com [it-torino-java-jug]
*"eh eh non ho bisogno di un esempio, grazie :), la tua osservazione e'
corretta ovviamente, e va tenuta in conto anche usando lombok o i getter, e
come sicuramente sai, in tutti i casi di logica concorrente. Pero',
appunto, i miei oggetti da "trasporto" sono molto stupidi e, nel caso sia
richiesto, mi proteggo nel costruttore creando versioni immutabili. Se ti
trovi a fare cose complicate, lo stai facendo sbagliato :)*


*In generale, comunque, devo ammettere che che raramente la mutabilita di
questo tipo di oggetti è per me rilevante: appena uno di essi mi entra
nella zona "OO" viene immediatamente assimilato e dimenticato.*


*A riguardo della tua osservazione sui tipi ricorda che questi oggetti
"tristi" (o quelli "ignoranti" di Fede) si usano solo quando hai un
paradigm shift, raramente i tipi hanno rilevanza. Caso classico un API REST
che riceve una chiamata in formato misto json/xml/whatever: il massimo
dell'astrazione sono mappe/array/stringhe.*

*Direi che siamo pienamente in topic comunque :)*

*Ciao,*

*Bruno"*


Ok, con queste ipotesi allora tutto torna, anche la parte sull'uso delle
mappe di Federico se utilizzata solo nel caso che hai citato, probabilmente
mi ero perso qualche info nei vari messaggi del thread ;-)

Ciao,
Ramon