Sfondo
Sto leggendo il "Clean Code book" e, in parallelo, sto lavorando su oggetti calisthenic come Kata come il conto bancario, e sono bloccato su quella regola:
La nona regola degli oggetti calisthenic è 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 il nostro oggetto, ma dobbiamo dire al nostro oggetto.
Questo ha perfettamente senso nella mia mente e sono pienamente d'accordo con questo principio. Il problema viene 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 operazioni extra su quel particolare campo ) per visualizzare il valore di Firstname in un supporto di output (casuale) semplice?
Ciò che mi viene in mente
Una soluzione è:
user.getName().getFirstName().getStringValue()
Che è terribilmente terribile, infrange molte regole degli oggetti calisthenic e infrange la legge Demeter.
Un altro sarebbe qualcosa di simile:
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 solo essere una "accessoria di ordine superiore" come bypassare getter / setter standard con un metodo che mira solo a far corrispondere la legge Demeter ...
Qualche idea?