En programmation orientée aspect , un pointcut est un ensemble de points de jonction . Pointcut spécifie où appliquer exactement les conseils , ce qui permet de séparer les préoccupations et aide à modulariser la logique métier. Les pointcuts sont souvent spécifiés à l'aide de noms de classe ou de noms de méthode, dans certains cas à l'aide d'expressions régulières qui correspondent au nom de la classe ou de la méthode. Différents frameworks prennent en charge différentes expressions Pointcut ; la syntaxe AspectJ est considérée comme la norme de facto. Des frameworks sont disponibles pour divers langages de programmation comme Java , Perl , Ruby et bien d'autres qui prennent en charge Pointcut.
Arrière-plan
En raison des limitations des différents langages de programmation, les préoccupations transversales ne sont pas modularisées. Les préoccupations transversales font référence aux parties du logiciel qui appartiennent logiquement à un module et affectent l'ensemble du système : il peut s'agir de la sécurité ou de la journalisation, par exemple. La programmation orientée aspect tente de résoudre ces préoccupations transversales en permettant aux programmeurs d'écrire des modules appelés aspects, qui contiennent des morceaux de code exécutés à un point particulier. Les expressions requises pour sélectionner un point particulier ont conduit à la création d'expressions de coupure de point.
Exécution
Chaque fois que l'exécution du programme atteint l'un des points de jonction décrits dans le pointcut, un morceau de code associé au pointcut (appelé conseil) est exécuté. Cela permet à un programmeur de décrire où et quand du code supplémentaire doit être exécuté en plus du comportement déjà défini. Pointcut permet l'ajout d'aspects à un logiciel existant, ainsi que la conception d'un logiciel avec une séparation claire des préoccupations , dans laquelle le programmeur tisse (fusionne) différents aspects dans une application complète.
Exemple
Supposons qu'il existe une application dans laquelle nous pouvons modifier des enregistrements dans une base de données . Chaque fois que les utilisateurs modifient la base de données, nous souhaitons disposer d'un journal d'informations concernant la personne qui modifie les enregistrements. La manière traditionnelle de journaliser consiste à appeler une méthode de journalisation juste avant de modifier la base de données. Avec la programmation orientée aspect, nous pouvons appliquer pointcut à la méthode Modify Database et obtenir un conseil qui est appelé pour enregistrer les informations requises.
Expressions
Voici quelques expressions de coupure de point importantes prises en charge par AspectJ . Ces expressions peuvent être combinées à l'aide d'opérateurs logiques.
exécution ( void User . setPassword ( mot de passe ))
Ce point de coupure correspond à l'exécution de la méthode User.setPassword.
appel ( void User . getPassword ())
Lorsque User.getPassword est appelé, ce pointcut est mis en correspondance.
gestionnaire ( ArrayIndexOutOfBounds )
Pointcut correspondra en cas d'exception ArrayIndexOutOfBounds
ceci ( UserType )
Pointcut correspondra lorsque l'objet en cours d'exécution est de type UserType.
cible ( UserType )
Pointcut correspondra lorsque l'objet cible est de type utilisateur.
dans ( UserType )
Pointcut correspondra lorsque le code exécuté appartient à UserType.
Critiques
Les langages à coupures ponctuelles ont un impact négatif sur des propriétés logicielles importantes comme l'évolutivité et la compréhensibilité. Il peut arriver qu'il soit nécessaire d'effectuer une refactorisation pour définir un aspect correct, ce qui en général ne devrait pas se produire puisque la refactorisation vise à rendre le code plus propre. Elle n'est pas non plus évolutive lorsqu'il y a plusieurs aspects à appliquer sur le même code et que chaque aspect nécessite une refactorisation différente. En général, chaque aspect sera étroitement lié à la structure d'une application car les coupures ponctuelles contiennent explicitement la signature d'une méthode, donc lorsqu'une application change, la coupure ponctuelle doit également être modifiée. Cela peut être assez problématique pour un développeur.