272 votes

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

Je comprends la programmation orientée objet, et j'écris des programmes OO depuis longtemps. Les gens semblent parler de la programmation orientée aspect, mais je n'ai jamais vraiment appris ce que c'est 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 et programmation orientée objet

10 votes

IMAO, le lien fourni dans la question a une réponse plus claire et plus complète que celle acceptée ici. Les personnes qui lisent cette question devraient le lire en premier.

235voto

Mark Cidade Points 53945

La POA aborde le problème de questions transversales Il s'agit de tout type de code qui est répété dans différentes méthodes et qui ne peut normalement pas être entièrement refacturé dans son propre module, comme dans le cas de la journalisation ou de la vérification. Ainsi, avec la POA, vous pouvez laisser ce genre de choses en dehors du code principal et le définir verticalement comme ceci :

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 tisseur d'aspect est utilisé pour compiler le code en 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;
}

18 votes

Avez-vous besoin d'un support linguistique pour cela ? Dans quelle langue est votre exemple ?

11 votes

Il s'agit d'un pseudocode, mais l'exemple le plus connu est AspectJ, qui est une modification AOP de Java, qui utilise une technique similaire appelée "cutpoints".

0 votes

Un peu comme une classe Autre ou ETC alors ? Ou est-ce parce que vous utilisez un exemple très simplifié ?

13voto

Hugo Points 2156

Malheureusement, il semble être étonnamment difficile de rendre la POA réellement utile dans une organisation normale de taille moyenne ou grande. (Soutien de l'éditeur, sentiment de contrôle, le fait de commencer par les choses les moins importantes conduit à la rotation du code, les gens rentrent chez eux pour retrouver leur famille, etc.)

J'ai mis mes espoirs dans 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 ici une mise en œuvre à venir : qi4j.org/

PS. En fait, je pense que l'une des beautés du POA est aussi son talon d'Achille : Il n'est pas intrusif, laissant les gens l'ignorer s'ils le peuvent, il sera donc traité comme une préoccupation secondaire dans la plupart des organisations.

9voto

paxdiablo Points 341644

Copié à partir d'un duplicata pour des raisons d'exhaustivité (Einstein) :

Les exemples classiques sont la sécurité et la journalisation. Au lieu d'écrire du code dans votre application pour enregistrer l'occurrence de x ou vérifier l'objet z pour le contrôle d'accès de sécurité, il y a une contraction de langage "hors de la bande" du code normal qui peut systématiquement injecter la sécurité ou la journalisation dans les routines qui ne les ont pas nativement d'une telle manière que même si votre code ne les fournit pas - ils sont pris en charge.

Un exemple plus concret est celui du système d'exploitation qui fournit 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 fait ce travail pour lui.

Si vous pensez avoir besoin de la POA, d'après mon expérience, vous devez en fait investir plus de temps et d'efforts dans la gestion appropriée des méta-données au sein de votre système, en vous concentrant sur une conception structurelle/systémique bien pensée.

3voto

paxdiablo Points 341644

Copié d'un duplicata pour des raisons d'exhaustivité (Nrj) :

La POA consiste à gérer les fonctionnalités communes (qui s'étendent sur toute l'application, d'où le terme "cross-cutting") au sein de l'application, de sorte qu'elles ne soient pas intégrées à la logique métier.

Des exemples de ces préoccupations transversales sont la journalisation, la gestion de la sécurité, la gestion des transactions, etc.

Les frameworks permettent de gérer cela automatiquement à l'aide de quelques fichiers de configuration.

1voto

jfar Points 19380

Jetez un coup d'œil à cette vidéo du créateur de PostSharp (un ensemble de bibliothèques AOP pour .NET) : http://www.postsharp.org/about/video/

Ça m'a vraiment aidé à le comprendre de le voir en action.

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