AOP risolve alcuni problemi, ma non è utile in tutti i casi.
Tipicamente, AOP fornisce strumenti per gestire la separazione delle preoccupazioni. In molti progetti, ti troverai a scrivere lo stesso codice ripetutamente. Un tipico esempio è il controllo dell'accesso:
if(!user.hasAccess(functionality)) throw new SecurityException();
// Functionality implementation.
Questo non è un codice pulito, perché il problema di controllare l'accesso è distribuito su tutto il codice base. È soggetto a errori, che non è quello che vuoi in generale, ma anche peggio qui, perché un errore è un difetto di sicurezza.
AOP è definitivamente utile qui, perché ti permetterà di definire la sicurezza in un punto e la funzionalità in un altro.
Troverai altri schemi, come la connessione a un database, l'esecuzione di alcune operazioni e la disconnessione. Dovrai gestire tutti i casi speciali (errore SQL, errore di rete, ecc.) E assicurarti di eseguire il rollback in modo pulito se succede qualcosa e disconnetti correttamente. AOP potrebbe anche aiutarti in questo modo, evitando la necessità di disporre di tutte le regole di gestione degli errori distribuite su più funzionalità.
Un altro problema è la sincronizzazione. Poiché il sistema diventa sempre più distribuito (multicore, rete, cloud, GPGPU, ecc.) È sempre più importante.
In definitiva, AOP è utile in alcuni casi.