Ci scusiamo per le molte abbreviazioni nel titolo ... La mia osservazione è che le applicazioni create con una mappatura relazionale ad oggetti come Hibernate tendono a seguire un'architettura orientata ai servizi invece di una orientata agli oggetti.
Alcune persone (ad es. qui ) dicono il Single Principio di responsabilità suggerisce che occuparsi degli attributi di lettura / scrittura degli oggetti persistenti e della creazione e ricerca di questi oggetti è una responsabilità sufficiente per una classe. Qualsiasi logica di business che utilizza tale oggetto dovrebbe andare a classi separate. Questo ci porta a un progetto con due tipi distinti di classi: a livello statico, ma muti, mantenendo i registri, e logici ma privi di stato.
Ecco perché non mi piace questo tipo di design:
(1) Per me, questa separazione di dati e codice non è un obiettivo orientato agli oggetti, ma è la progettazione di un'architettura orientata ai servizi. OOD dice che le operazioni dovrebbero andare alle classi in cui gli attributi che usa sono definiti in.
(2) Inoltre, è una soluzione fasulla: ogni volta che cambia la struttura di una delle classi full-state, dovrò cambiare anche tutte le classi di servizio che la usano. Se avessi la logica dentro quelle classi, il cambiamento rimarrebbe in una classe.
(3) Sto usando un framework ORM che praticamente genera tutto il codice necessario per accedere ai dati persistenti per me in una classe. Se non aggiungessi la logica aziendale, la classe rimarrebbe piuttosto "vuota", cioè conterrà solo il codice generato.
So che molti programmatori seguono il design orientato al servizio, specialmente quando usano framework che lo suggeriscono, come Spring. Se usassi un simile framework, andrei anche con la separazione di codice e dati.
Non voglio provocare una discussione se la SOA è buona o no. Mi interessa sapere se è un buon OOD (come per SRP) separare la logica di business da classi che rappresentano entità.