Utilisez-vous l’AOP (Aspect Oriented Programming) dans les logiciels de production ?

StackOverflow https://stackoverflow.com/questions/20663

  •  09-06-2019
  •  | 
  •  

Question

AOP est un paradigme de programmation intéressant à mon avis.Cependant, il n'y a pas encore eu de discussions à ce sujet ici sur stackoverflow (du moins, je ne les ai pas trouvées).Qu'en pensez-vous en général ?Utilisez-vous AOP dans vos projets ?Ou pensez-vous qu'il s'agit plutôt d'une technologie de niche qui n'existera pas avant longtemps ou qui ne sera pas généralisée (comme l'a fait la POO, du moins en théorie ;)) ?

Si vous utilisez AOP, veuillez également nous indiquer les outils que vous utilisez.Merci!

Était-ce utile?

La solution

Oui.

Les problèmes orthogonaux, comme la sécurité, sont mieux traités avec une interception de type AOP.Que cela soit fait automatiquement (via quelque chose comme un conteneur d'injection de dépendances) ou manuellement n'a pas d'importance pour l'objectif final.

Un exemple:les attributs "avant/après" dans xUnit.net (un projet open source que je dirige) sont une forme d'interception de méthode de style AOP.Vous décorez vos méthodes de test avec ces attributs, et juste avant et après l'exécution de cette méthode de test, votre code est appelé.Il peut être utilisé pour des choses comme la configuration d'une base de données et l'annulation des résultats, la modification du contexte de sécurité dans lequel le test s'exécute, etc.

Un autre exemple:les attributs du filtre dans ASP.NET MVC agissent également comme des intercepteurs de méthodes spécialisés de style AOP.L'un d'entre eux, par exemple, vous permet de dire comment les erreurs non gérées doivent être traitées, si elles se produisent dans votre méthode d'action.

De nombreux conteneurs d'injection de dépendances, notamment Castle Windsor et Unity, prennent en charge ce comportement soit « dans la boîte », soit via l'utilisation d'extensions.

Autres conseils

Python prend en charge AOP en vous permettant de modifier dynamiquement ses classes au moment de l'exécution (ce qui en Python est généralement appelé Monkeypatching plutôt qu'AOP).Voici quelques-uns de mes cas d’utilisation AOP :

  1. J'ai un site Web dans lequel chaque page est générée par une fonction Python.J'aimerais suivre un cours et protéger par mot de passe toutes les pages Web générées par ce cours.AOP vient à la rescousse ;avant que chaque fonction ne soit appelée, j'effectue la vérification de session appropriée et je la redirige si nécessaire.

  2. J'aimerais effectuer une journalisation et un profilage sur un certain nombre de fonctions de mon programme pendant son utilisation réelle.AOP me permet de calculer le timing et d'imprimer des données dans des fichiers journaux sans réellement modifier aucune de ces fonctions.

  3. J'ai un module ou une classe rempli de fonctions non thread-safe et je me retrouve à l'utiliser dans du code multithread.Certains AOP ajoutent un verrouillage autour de ces appels de fonction sans avoir à accéder à la bibliothèque et à modifier quoi que ce soit.

Ce genre de chose n'arrive pas très souvent, mais chaque fois que cela se produit, le patch singe est TRÈS utile.Python dispose également de décorateurs qui implémentent le modèle de conception Decorator (http://en.wikipedia.org/wiki/Decorator_pattern) pour accomplir des choses similaires.

Notez que la modification dynamique des classes peut également vous permettre de contourner des bogues ou d'ajouter des fonctionnalités à une bibliothèque tierce sans avoir à modifier cette bibliothèque.Je n’ai presque jamais besoin de faire cela, mais les rares fois où cela s’est produit, cela a été incroyablement utile.

Je ne comprends pas comment on peut gérer proprement des problèmes transversaux tels que la journalisation, la sécurité, la gestion des transactions et la gestion des exceptions sans utiliser AOP.

Toute personne utilisant le framework Spring (probablement environ 50 % des développeurs d'entreprise Java) utilise AOP, qu'elle le sache ou non.

À Terre cuite nous utilisons assez largement l'instrumentation AOP et bytecode pour intégrer et instrumenter des logiciels tiers.Par exemple, notre Intégration printanière est accompli en grande partie en utilisant aspectwerkz.En un mot, nous devons intercepter les appels vers les beans Spring et les usines de haricots à différents moments afin de les regrouper.

AOP peut donc être utile pour intégrer du code tiers qui ne pourrait pas être modifié autrement.Cependant, nous avons constaté qu'il existe un énorme piège : si possible, utilisez uniquement l'API publique tierce dans vos points de jointure, sinon vous risquez de voir votre code brisé par une modification d'une méthode privée dans la prochaine version mineure, et cela devient un cauchemar de maintenance.

L’AOP et la démarcation des transactions sont une combinaison parfaite.Nous utilisons les annotations Spring AOP @Transaction, cela permet une démarcation tx plus facile et plus intuitive que je n'ai jamais vue ailleurs.

Nous avons utilisé aspectJ dans l'un de mes grands projets depuis un certain temps.Le projet était composé de plusieurs services Web, chacun avec plusieurs fonctions, qui constituaient le front-end d'un système complexe de traitement/requête de documents.Quelque part autour de 75 000 lignes de code.Nous avons utilisé des aspects pour deux fonctionnalités relativement mineures.

La première étape consistait à suivre le flux des candidatures.Nous avons créé un aspect qui s'exécutait avant et après chaque appel de fonction pour afficher "fonction entrée" et "fonction sortie".Avec le truc du sélecteur de fonction (pointcut peut-être ?Je ne me souviens plus du bon nom), nous avons pu l'utiliser comme outil de débogage, en sélectionnant uniquement les fonctions que nous voulions tracer à un moment donné.C'était une très bonne utilisation des aspects de notre projet.

La deuxième chose que nous avons faite a été des métriques spécifiques à l'application.Nous mettons des aspects autour de nos méthodes de service Web pour capturer le timing, les informations sur les objets, etc.et videz les résultats dans une base de données.C'était bien car nous pouvions capturer ces informations, tout en gardant tout ce code de capture séparé du "vrai" code qui faisait le travail.

J'ai lu quelques solutions intéressantes que certains aspects peuvent apporter, mais je ne suis toujours pas convaincu qu'ils puissent vraiment faire quelque chose que vous ne pourriez pas faire (peut-être mieux) avec une technologie "normale".Par exemple, je ne pouvais penser à aucune caractéristique ou fonctionnalité majeure dont aucun de nos projets avait besoin et qui ne pourrait être réalisée aussi facilement sans aspects - là où j'ai trouvé les aspects utiles, ce sont les types de choses mineures que j'ai mentionnées. .

J'utilise beaucoup AOP dans mes applications C#.Je ne suis pas un grand fan de devoir utiliser des attributs, j'ai donc utilisé Castle DynamicProxy et Boo pour appliquer des aspects au moment de l'exécution sans polluer mon code.

Nous utilisons AOP dans notre façade de session pour fournir un cadre cohérent permettant à nos clients de personnaliser notre application.Cela nous permet d'exposer un seul point de personnalisation sans avoir à ajouter une prise en charge manuelle des hooks pour chaque méthode.

De plus, AOP fournit un point de configuration unique pour la configuration et le démontage supplémentaires des transactions, ainsi que pour les opérations de journalisation habituelles.Tout compte fait, c'est beaucoup plus maintenable que de faire tout cela à la main.

L'application principale sur laquelle je travaille inclut un hôte de script.AOP permet à l'hôte d'examiner les propriétés d'un script avant de décider de charger ou non le script dans le domaine d'application.Étant donné que certains scripts sont assez lourds, cela permet un chargement beaucoup plus rapide au moment de l'exécution.

Nous utilisons et prévoyons également d'utiliser un nombre important d'attributs pour des choses telles que le contrôle du compilateur, le contrôle de flux et le débogage dans l'IDE, qui n'ont pas besoin de faire partie de l'application distribuée finale.

Nous utilisons PostSharp pour notre solution AOP.Nous utilisons actuellement des aspects de mise en cache, de gestion des erreurs et de nouvelle tentative de base de données et sommes en train de faire de nos contrôles de sécurité un aspect.

Fonctionne très bien pour nous.Les développeurs aiment vraiment la séparation des préoccupations.Les architectes aiment vraiment que la logique au niveau de la plate-forme soit consolidée en un seul endroit.

La bibliothèque PostSharp est un post-compilateur qui effectue l'injection du code.Il dispose d'une bibliothèque d'interceptions prédéfinies qui sont faciles à mettre en œuvre.Cela ressemble à du câblage dans les gestionnaires d'événements.

Oui, nous utilisons AOP dans la programmation d'applications.J'utilise de préférence AspectJ pour intégrer aop dans mes applications Spring.Jetez un œil à cet article pour obtenir une perspective plus large à ce sujet.

http://codemodeweb.blogspot.in/2018/03/spring-aop-and-aspectj-framework.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top