Recentemente ho letto di Object Calisthenics e sono bloccato sulla Regola 9.
Il mio tipico approccio al codice (io sono uno sviluppatore C # .NET) è quello di modellare i dati come classi POCO che esistono solo per rappresentare schemi di dati. Inevitabilmente questo significa un insieme di proprietà esposte con getter e setter. Queste classi implementano pochi, o più spesso no, metodi. Sono oggetti stupidi e in genere esistono a un livello basso nella mia architettura di soluzione. Hanno una responsabilità singolare: modellare i dati strutturati, ad es. una riga della tabella del database.
Dove ho bisogno di funzioni logiche, introdurrò queste come classi di servizio dedicate in un livello aziendale (o servizio). Queste classi osservano anche il principio della responsabilità unica, affrontando ciascuna una specifica esigenza aziendale. Ad esempio, potrei avere una classe Customer
e una classe CustomerRepository
caricata con la lettura e la scrittura in un archivio dati persistente. Questo CustomerRepository
implementerà un contratto IRepository per assicurarmi di poterlo iniettare come dipendenza, deriderlo nei test ecc.
Con questo modello, inevitabilmente il mio Customer
deve esporre le sue proprietà tramite getter e setter (" espellere le budella direttamente in faccia "!) in modo che il repository possa mapparlo su una tabella di database o altro.
Quindi la mia domanda è: perché un devoto di oggetti calisthenici vedrebbe questo così sbagliato? In tutti gli esempi che ho visto, gli autori mantengono le proprietà private e introducono funzioni logiche direttamente alla classe che, secondo il mio punto di vista, rompono la singola responsabilità e potrebbero potenzialmente condurre a classi vaste, ingombranti e non testabili.
Quindi, la Regola 9 è davvero praticabile nella vita reale? In una delle poche spiegazioni dettagliate che ho trovato l'autore sembra discutere contro se stesso definendo una classe Account
, rendendo il Balance
privato quindi introducendo metodi come Withdraw
per incapsulare non solo la proprietà ma qualsiasi logica che funzioni con quella proprietà. Bene, ma cosa succede se il requisito aziendale richiede al programmatore di scrivere il saldo del conto in un'interfaccia utente? Come si può osservare la regola 9 in questo caso?