31 votes

Que peut-AOP faire de la programmation orientée objet ne peut pas le faire?

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.

  1. 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.

  2. 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.

12voto

duffymo Points 188155

L'AOP est OO; les Aspects sont des objets.

Je ne comprends pas pourquoi l'/ou l'autre mentalité.

L'AOP est le choix parfait pour les chaînes, les sujets transversaux (exploitation forestière, par exemple, la sécurité, les transactions, à distance de serveur proxy, etc.)

Mise à JOUR:

Je pense que les critiques offerts par les OP sont subjectives et ne pas universellement répandue comme indiqué. Les Assertions affirmé sans preuve peut être rejeté sans preuve.

Je ne crois pas à l'aide de la magie, mais l'AOP est pas de la magie si vous le comprenez. Je la comprends. Peut-être que l'OP n'a pas. Si c'est le cas, et l'OP est plus à l'aise avec un OO solution, je dirais d'aller pour elle.

"Me semble inutile" est un simple avis, sans preuve. Il n'y a pas de réponse à cette exception "je suis en désaccord."

Je pense que l'AOP est parfaite pour ces cas, parce que je peux l'appliquer dans un déclarative façon. Je peux écrire un aspect classe et de l'appliquer dans de nombreux endroits, avec un contrôle précis de la, de le changer dans la configuration plutôt que de code. Je peux choisir les méthodes, classes, et les colis ont un aspect appliqué dans la configuration.

Essayez ça avec de l'écrit à la main OO approche.

En outre, l'AOP est orienté objet. Vous pouvez regarder comme une personne intelligente, vous donnant un domaine spécifique de la langue ou de cadre pour ce que vous voulez faire à la main. Les caractéristiques communes ont été captées dans quelque chose de plus général. Pourquoi serait-on opposer à cela?

10voto

mezmo Points 1678

La réponse courte est ... rien. AOP mais ajoute une pincée de ce que nous appelons de retour dans mes jours dans les Marines US FM, qui, lorsque les nettoyer pour un auditoire civil signifie "Flipper de la Magie". Vous avez raison, il n'y a absolument rien obtenu dans le premier cas que vous citez n'est pas atteint dans la seconde. Je pense que la principale raison derrière le mouvement est une question de clarté, et de la croissance de la mantra de "Moins de cérémonie" dans le code. Donc, vous pouvez écrire du code pour gérer les transactions, ou de renoncer à la cérémonie avec des AOP, qui étant fournis par le fournisseur, ou le conteneur est sans doute mieux testé que le code que vous écrivez à la main. Un autre point de l'AOP faveur, c'est qu'il PEUT être modifié dans les descripteurs de déploiement, le Printemps des fichiers de configuration, etc, et peut ensuite être modifié si vos besoins changent sans aucune modification de votre code. Si vous avez écrite à la main coûteux code continue d'exprimer la logique métier que vous vouliez sont payés pour le faire, et le "FM" couche gère des choses comme des transactions, de l'exploitation forestière, etc avec une bonne pincée de AOP poussière de lutin.

YMMV de cours.

8voto

Adeel Ansari Points 24434

Pour moi, l'AOP est une abréviation de l'Intercepteur Modèle. Et Intercepteur Modèle lui-même est dérivé (ou ont eu ou qui a eu l'idée) à partir de Modèle de Méthode, AFAICS.

Un exemple populaire d' Interceptor est Servlet Filter. Et nous savons que ceux-ci sont très utiles dans de nombreux cas.

Depuis, tous ces modèles sont utiles, d'où l'AOP, qui est dérivée à partir de ces est également utile. Et comme vous l'avez vous-même indiqué quelques-uns de ses usages.

6voto

Itay Maman Points 15470

En général, toute la question de la forme "Ce qui peut faire que cant?" sont vides de sens. Tous les langages sont tout aussi puissant (Voir: l'Église de la Thèse).

La différence entre les langues n'est donc pas dans ce qu' ils peuvent faire, mais plutôt dans la façon dont ils le font. En d'autres termes, combien de temps avez-vous pour obtenir un comportement dans une langue, par rapport à la quantité de travail pour obtenir le même comportement dans une autre langue.

2voto

Erhan Bagdemir Points 2838

La Programmation Orientée aspects vs la Programmation Orientée Objet

La réponse de Mecki sur l'AOP est exclusif ;-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X