web-dev-qa-db-fra.com

Qu'est-ce que la programmation orientée aspect?

Je comprends la programmation orientée objet et écris depuis longtemps des programmes OO). Les gens semblent parler de programmation orientée aspect, mais je n’ai jamais vraiment appris en quoi il consiste ni comment l’utiliser. Quel est le paradigme de base?

Cette question est liée, mais ne la pose pas tout à fait:

programmation orientée aspect vs programmation orientée objet

212
Sophie

AOP aborde le problème de préoccupations transversales, qui correspond à tout type de code répété dans différentes méthodes et qui ne peut normalement pas être complètement reformaté dans son propre module, comme avec la journalisation ou la vérification. Donc, avec AOP, vous pouvez laisser ce contenu en dehors du code principal et le définir verticalement comme suit:

function mainProgram()
{ 
   var x =  foo();
   doSomethingWith(x);
   return x;
}

aspect logging
{ 
    before (mainProgram is called):
    { 
       log.Write("entering mainProgram");
    }

    after (mainProgram is called):
    { 
       log.Write(  "exiting mainProgram with return value of "
                  + mainProgram.returnValue);
    }
 } 

aspect verification
{ 
    before (doSomethingWith is called):
    { 
       if (doSomethingWith.arguments[0] == null) 
       { 
          throw NullArgumentException();
       }

       if (!doSomethingWith.caller.isAuthenticated)
       { 
          throw Securityexception();
       }
    }
 }

Et puis un aspect-weaver est utilisé pour compiler le code dans ceci:

function mainProgram()
{ 
   log.Write("entering mainProgram");

   var x = foo();   

   if (x == null) throw NullArgumentException();
   if (!mainProgramIsAuthenticated()) throw Securityexception();
   doSomethingWith(x);   

   log.Write("exiting mainProgram with return value of "+ x);
   return x;
} 
183
Mark Cidade

Malheureusement, il semble étonnamment difficile de rendre l'AOP vraiment utile dans une organisation normale de taille moyenne. (Soutien de l'éditeur, sens du contrôle, le fait que vous commenciez par des choses peu importantes conduisant à la pourriture du code, les gens retournant chez eux avec leur famille, etc.)

Je mets mes espoirs dans la programmation orientée composite , ce qui est de plus en plus réaliste. Il se connecte à de nombreuses idées populaires et vous donne quelque chose de vraiment cool.

Regardez une implémentation imminente ici: qi4j.org/

PS En fait, je pense que l’une des beautés de l’AOP est aussi son talon d’Achille: il est non intrusif, ce qui permet aux gens de l’ignorer s’ils le peuvent, ce qui le traitera comme une préoccupation secondaire dans la plupart des organisations.

13
Hugo

Copié d'un duplicata pour être complet (Einstein):

Les exemples classiques sont la sécurité et la journalisation. Au lieu d'écrire du code dans votre application pour consigner l'occurrence de x ou vérifier l'objet z pour le contrôle d'accès sécurisé, il existe un problème de langage "hors bande" du code normal qui peut systématiquement injecter de la sécurité ou se connecter à des routines qui ne les ont pas nativement. de telle sorte que même si votre code ne le fournit pas - il est pris en charge.

Un exemple plus concret est le système d'exploitation fournissant des contrôles d'accès à un fichier. Un logiciel n'a pas besoin de vérifier les restrictions d'accès car le système sous-jacent fonctionne pour cela.

D'après mon expérience, si vous pensez avoir besoin d'AOP, vous devez réellement investir davantage de temps et d'efforts dans la gestion appropriée des métadonnées de votre système, en mettant l'accent sur une conception structurelle/système bien pensée.

8
paxdiablo

Copié de Spring in Action

L'AOP est souvent définie comme une technique qui favorise la séparation des problèmes dans un système logiciel. Les systèmes sont composés de plusieurs composants, chacun étant responsable d'une fonctionnalité spécifique. Mais souvent, ces composants comportent également des responsabilités supplémentaires allant au-delà de leurs fonctionnalités principales. Les services système tels que la journalisation, la gestion des transactions et la sécurité se retrouvent souvent dans des composants dont les responsabilités principales sont autre chose. Ces services système sont généralement qualifiés de problèmes transversaux car ils ont tendance à toucher plusieurs composants d’un système.

6
user2493028

Copié d'un duplicata pour l'intégralité (Buzzer):

Les attributs de classe et de méthode dans .NET sont une forme de programmation orientée aspect. Vous décorez vos classes/méthodes avec des attributs. En coulisse, cela ajoute du code à votre classe/méthode qui remplit les fonctions particulières de l'attribut. Par exemple, le marquage d’une classe sérialisable lui permet de l’être automatiquement pour le stockage ou la transmission à un autre système. D'autres attributs peuvent marquer certaines propriétés comme non sérialisables et celles-ci seraient automatiquement omises de l'objet sérialisé. La sérialisation est un aspect, implémenté par un autre code du système et appliqué à votre classe par l'application d'un attribut "configuration" (décoration).

5
paxdiablo

Il y a un exemple de AOP, il a utilisé printemps AOP comme exemple. L'exemple est assez facile à comprendre.

Le cadre Spring AOP (Programmation orientée aspect) est utilisé pour modulariser les préoccupations transversales dans les aspects. En termes simples, il s’agit simplement d’un intercepteur pour intercepter certains processus, par exemple, lorsqu’une méthode est exécutée, Spring AOP peut détourner la méthode en cours d’exécution et ajouter des fonctionnalités supplémentaires avant ou après son exécution.

Référence: http://www.mkyong.com/spring/spring-aop-examples-advice/

4
R.F

AOP peut être utilisé pour effectuer des actions qui ne sont pas liées à la logique métier de votre application, telles que la journalisation, la mise en cache, etc. Ces actions peuvent être placées dans une partie distincte de votre application, puis réutilisées dans l'application. Il y a généralement deux façons d'accomplir cela. Injecter le code automatiquement par un préprocesseur avant/après une méthode ou attacher des classes proxy qui interceptent un appel de méthode et peuvent ensuite exécuter des opérations avant/après un appel de méthode.

Voici un exemple en .Net. Il utilise des classes proxy pour intercepter les appels de méthode et exécuter du code avant ou après les appels de méthode saif.

Programmation orientée aspect (AOP) dans .NET Core et C # avec AutoFac et DynamicProxy

4
Carlos Blanco

L'AOP est un moyen de mieux modulariser votre application pour des fonctionnalités couvrant plusieurs frontières. L'AOP est un autre moyen d'encapsuler ces fonctionnalités et de suivre Single Responsiblity en déplaçant ces problèmes transversaux (journalisation, gestion des erreurs, etc.) hors des composants principaux de votre application. Lorsqu'il est utilisé correctement, l'AOP peut entraîner des niveaux de maintenabilité et d'extensibilité plus élevés dans votre application au fil du temps.

2
SaaS Developer