sfondo
Sto leggendo il "Clean Code book" e, in parallelo, sto lavorando su oggetti calistenici Kata come il conto del banchiere, e sono bloccato su quella regola:
La nona regola degli oggetti calistenici è che non usiamo getter o setter.
Sembra abbastanza divertente e sono d'accordo con questo principio. Inoltre, a pagina 98-99 di Clean Code, l'autore spiega che i getter / setter rompono l'astrazione e che non dobbiamo chiedere al nostro oggetto, ma dobbiamo dirlo al nostro oggetto.
Questo ha perfettamente senso nella mia mente e sono pienamente d'accordo con questo principio. Il problema si presenta in pratica.
Contesto
Ad esempio, sto avendo un'applicazione in cui devo elencare alcuni utenti e visualizzare i dettagli dell'utente.
Il mio utente è composto da:
-> Name
--> Firstname --> String
--> Lastname --> String
-> PostalAddress
--> Street --> String
--> PostalCode --> String
Problema
Come posso fare o cosa posso fare per evitare i getter quando ho solo bisogno di visualizzare una semplice informazione ( e devo confermare che non ho bisogno di ulteriori operazioni su quel particolare campo ) per visualizzare il valore Nome in un semplice ( casuale) supporto output?
Cosa mi viene in mente
Una soluzione è fare:
user.getName().getFirstName().getStringValue()
Il che è totalmente terribile, infrangendo molte regole di oggetti calistenici e infrangendo la Legge Demetra.
Un altro sarebbe qualcosa del tipo:
String firstName = user.provideFirstnameForOutput();
// That would have called in the user object =>
String firstName = name.provideFirstnameForOutput();
// That would have called in the name object =>
String firstName = firstname.provideFirstnameForOutput();
Ma non mi sento a mio agio con questa soluzione, che sembra essere solo un "accessorio di ordine superiore" come bypassare il getter / setter standard con un metodo che mira solo ad abbinare la legge di Demetra ...
Qualche idea ?