Je suis principalement un développeur Java. J'ai rencontré tout à fait un peu de Java devs qui l'amour de l'AOP. J'ai aussi été voir de plus en plus de l'AOP "design patterns" émergents récemment qui semblent être assez largement adopté. De même, je ne suis toujours pas convaincu que l'AOP dans OO code est une bonne idée en général, pour un couple de raisons.
Il ajoute "magique" pour le code de la la forme de l'opaque de la complexité qui peut être extrêmement difficile à déboguer, et peut il est extrêmement difficile à déboguer le code orienté objet qu'il affecte.
Il me semble être la plupart du temps inutile, et (pire) souvent utilisé pour éviter d'avoir à la conception de bien, ou pour compenser précédente pauvres de la conception.
Voici un exemple que j'ai vu beaucoup de cours des deux dernières années, comme fond de ma question.
Avant AOP (à partir de la veille prolongée docs)
public void saveMyEntityToTheDatabase(MyEntity entity) {
EntityTransaction tx = null;
try {
tx = entityManager.getTransaction();
tx.begin();
entityManager.persist(entity);
tx.commit();
} catch (RuntimeException e) {
if(tx != null && tx.isActive()) {
tx.rollback();
}
throw e;
}
}
Après AOP
@Transactional
public void saveMyEntityToTheDatabase(MyEntity entity) {
entityManager.persist(entity);
}
Il semble évident de gagner de l'AOP pour beaucoup de gens. Pour moi le problème d'origine est symptomatique des niveaux incompatibles de l'API d'abstraction. Qui est, l' EntityManager
est beaucoup plus bas que le niveau du travail au niveau de l'API du message de l'utiliser. Ce problème peut être résolu avec un niveau plus approprié de l'abstraction, et une meilleure (OO) de la conception.
Une Solution OO
public void saveMyEntityToTheDatabase(MyEntity entity) {
database.performInTransaction(new Save(entity));
}
Cette solution suppose que l' database
objet contient le même type de logique transactionnelle que l'aspect responsable qui gère @Transactional
méthodes. Cela répond à mes préoccupations ci-dessus, en le rendant plus évident qu'il y a quelque chose de la gestion de l'interaction avec l' EntityManager
, et de ne pas introduire d'un autre paradigme de programmation.
Donc, finalement, ma question: que peut-AOP faire de la programmation orientée objet ne peut pas? Je suis un peu convaincus de son utilité dans l'enregistrement des traces, et peut-être par défaut toString()
des implémentations ou quelque chose de similaire, mais j'aimerais savoir si quelqu'un la trouvé bien meilleur que OO pour certains types de problèmes.