Ci è stato insegnato che gli oggetti sono cose autonome con dati e comportamenti e quindi dovrebbero avere metodi che agiscano sui loro attributi. Ma ci sono diverse situazioni in cui questo accoppiamento tra entità e il loro comportamento non è osservato:
- I framework di entità (come .NET con POCO e Enterprise Java con entità POJO) stabiliscono che le operazioni di CRUD / persistenza / ricerca devono essere eseguite da gestori di entità esterne (e repository) e non dalle entità stesse, ovvero abbiamo codice
entityManager.save(entity)
e nonentity.save()
; - I motori di regole aziendali sono gli esempi più visibili di separazione della logica di business dalle entità: le regole aziendali formano un codice completamente diverso (anche in lingue diverse) dalle entità. Per esempio. JBoss Drools o IBM ILOG o altri motori di regole. Il paradigma della regola aziendale può essere utilizzato per estrapolare la programmazione OO - in OO consideriamo dati e metodi, ma nel web semantico possiamo considerare ontologie e regole logiche / commerciali che agiscono su ABox o TBox di ontologie - due lingue completamente diverse e sistemi di ragionamento.
- Il calcolo distribuito prevede l'uso della serializzazione e della deserializzazione di oggetti e la comunicazione di tali oggetti attraverso la rete - per questo abbiamo XML, formati binari nativi o JSON. Solitamente, solo i dati vengono comunicati tramite la rete e la logica aziendale viene mantenuta su un unico livello e non esiste una tecnologia per spostare la logica di business su reti e piattaforme, ad es. non vi è alcuna traduzione automatica e comunicazione della logica aziendale quando le entità Java sono tradotte in oggetti JSON ed esposte tramite API REST al frontend Angular 2. La logica aziendale di solito è tenuta da un lato (ad es. In Java).
- Si dice che il modello di dominio OO dovrebbe riflettere / modellare il mondo reale. E a volte gli oggetti del mondo reale non hanno una logica aziendale al loro interno. Per esempio. ci sono concetti sui calcolatori, ad es. calcolatori delle imposte, calcolatori salariali ecc. Pertanto scriviamo
calculator.recalcTaxes(invoice)
e noninvoice.recalcTaxes
. Il primo approccio ci consente di applicare diversi calcolatori in diversi casi = per es. attraverso le legislazioni. Non siamo costretti a costruire una gerarchia di eredità complessa semplicemente perché ci sono diversi metodi di business, semplicemente applichiamo servizi / calcolatori aziendali diversi agli stessi dati.
Considerando questi argomenti che separano la logica di business da dati / entità - quanto è accettabile rendere questa separazione come la regola generale di progettazione per il mio progetto di software aziendale? Quali sono gli argomenti contro la separazione della logica aziendale dai dati?