Chiedo questo perché sembra che la gente di solito consideri il codice che va in un'implementazione DAO o Repository come "codice di accesso ai dati", mentre il codice che utilizza direttamente questi DAO / repository come "codice logico aziendale".
Tuttavia, questo non sembra logico.
Considera un metodo di servizio aziendale con codice simile al seguente (utilizzando Java, ma sarebbe simile in C #, ecc.):
public BigDecimal computeCustomerTotal(Customer customer) {
List<Order> orders = orderRepository.findByCustomer(customer);
BigDecimal total = orders.stream()
.filter(Order::isActive).map(Order::getTotal).reduce(ZERO, BigDecimal::add);
return total;
}
Certo, l'implementazione di cui sopra non rende "appropriato" l'uso delle funzionalità di un database, ma mi tiene con me. Il punto qui è che, presumo, tutti sono d'accordo che contiene solo codice di logica aziendale, con Customer
e Order
che sono entità dominio (cioè non sono oggetti "dati").
Quindi, cosa succede se voglio farlo nel modo giusto, spostando l'intero calcolo nel database, invece di eseguirlo nel programma client? Se seguo la "saggezza convenzionale", creerei un nuovo metodo nel repository:
public BigDecimal getCustomerTotal(Customer customer) {
BigDecimal total = performQuery(
"select sum(o.total) from Order o where o.customer = ?1 and o.active",
customer);
return total;
}
(Supponiamo che performQuery
sia un metodo di utilità basato su JPA che accetta un JPA-QL
frase con argomenti opzionali.)
La seconda implementazione è ovviamente migliore della prima, poiché probabilmente ha prestazioni migliori e fa un uso corretto delle tecnologie sottostanti (JPA / Hibernate e un database relazionale).
Il problema, tuttavia, è che la logica aziendale (la regola secondo cui solo gli ordini attivi dovrebbero essere considerati) è stata spostata da un metodo di servizio aziendale a un (presunto) metodo di accesso ai dati, attraverso una semplice implementazione cambia. Inoltre, questo codice che è ora nel DAO / Repository fa in modo che non sappia dei problemi di accesso ai dati, come il mapping da tipi di entità e attributi a tabelle e colonne o il codice SQL effettivo che ottiene generato e inviato al motore DB.
Non sarebbe più logico considerare i metodi entrambi come contenenti solo codice business logic , e semplicemente eliminare completamente DAO / Repository / DAL?
Personalmente, non vedo alcun codice di accesso ai dati lì, e per me cose come DAO, Archivi o "livelli di accesso ai dati" (DAL) sono in realtà anti-schemi. Si noti che anche quando si utilizza JDBC + SQL in un'implementazione DAO / Repository, sarà inevitabilmente contenuta la logica aziendale, in genere sotto forma di clausole "where".