Alcune cose sono meglio espresse come OOP e altre sono migliori come AOP, e possono funzionare piuttosto bene insieme. (Attenti a chiunque cerchi di dirvi che una cosa è universalmente migliore di un'altra, la vita non è mai così chiara. Lasciate che forniscano prove della loro richiesta, e quindi valutate se ha senso per voi stessi. )
OOP funziona particolarmente bene se si dispone di funzionalità espresse come "applica un'operazione a questo pacco di stato", specialmente quando al chiamante non è richiesto di conoscere troppo i dettagli di ciò che accade all'interno dell'operazione. Ad esempio, dicendo un Dog
a wag tail
.
AOP funziona meglio se si dispone di funzionalità racchiuse in un'altra operazione. Le transazioni sono il classico esempio di questo; è molto più facile prenderli bene quando puoi legarli alla vita naturale di qualche altro pezzo di codice come una chiamata al metodo. Anche la registrazione e il monitoraggio delle prestazioni funzionano bene.
Uso entrambi insieme nelle mie applicazioni. Sostengo che la combinazione è altamente utile (e Spring è un modo ragionevole di gestire tutti gli oggetti nell'app combinata). Il design generale è sicuramente OOP prima però; con AOP lo si appende ad un altro framework che fornisce la logica di business principale.