214 votes

Programmation orientée aspect vs programmation orientée objet

Comme la plupart des développeurs ici et dans le monde entier, j'ai développé des logiciels de systèmes à l'aide de la programmation orientée objet (POO) techniques depuis de nombreuses années. Donc quand j'ai lu que la programmation orientée aspects (AOP) traite de nombreux problèmes traditionnels de la programmation orientée objet n'est pas de résoudre complètement ou directement, je fais une pause et de penser, est-elle réelle?

J'ai lu beaucoup d'informations à essayer d'apprendre les clés de cette AOP paradigme et Im dans le même endroit, donc, j'ai voulu mieux comprendre ses avantages dans le monde réel de développement d'applications.

Est-ce que qqn a la réponse?

347voto

Mecki Points 35351

Pourquoi "vs"? Il n'est pas "contre". Vous pouvez utiliser la programmation Orientée Aspects en combinaison avec la programmation fonctionnelle, mais aussi en combinaison avec de l'Orienté Objet. Il n'est pas "contre", c'est "la Programmation Orientée Aspects avec la Programmation Orientée Objet".

Pour moi, l'AOP est une sorte de "méta-programmation". Tout ce que l'AOP ne peut être effectuée sans qu'il en ajoutant simplement plus de code. AOP seulement vous permet d'économiser de l'écriture de ce code.

Wikipedia est l'un des meilleurs exemples de cette méta-programmation. Supposons que vous disposez d'un graphique de classe avec de nombreux "ensemble... ()". Après chaque série, la méthode, les données de la carte graphique a changé, donc les graphismes changé et donc les graphismes doivent être mis à jour sur l'écran. Supposons pour redessiner la carte graphique, vous devez appeler d'Affichage".mise à jour()". L'approche classique est de résoudre ce problème en ajoutant plus de code. À la fin de chaque méthode de jeu que vous écrivez

void set...(...) {
    :
    :
    Display.update();
}

Si vous avez 3 set-méthodes, qui n'est pas un problème. Si vous avez 200 (hypothétique), c'est vraiment douloureux pour ajouter ce partout. Aussi chaque fois que vous ajoutez une nouvelle méthode, vous devez être sûr de ne pas oublier d'ajouter ce point à la fin, sinon vous venez de créer un bug.

AOP résout ce sans ajouter des tonnes de code, au lieu de cela, vous ajoutez un aspect:

after() : set() {
   Display.update();
}

Et c'est tout! Au lieu d'écrire le code de mise à jour vous-même, vous venez de dire le système qui après un set() coupe transverse (pointcut) a été atteint, il doit exécuter ce code et il va exécuter ce code. Pas de mise à jour de 200 méthodes, pas besoin de vous assurer que vous n'oubliez pas d'ajouter ce code sur une nouvelle méthode. En outre, vous avez juste besoin d'une coupe transverse (pointcut):

pointcut set() : execution(* set*(*) ) && this(MyGraphicsClass) && within(com.company.*);

Qu'est-ce que cela signifie? Cela signifie que si une méthode est nommée "*" (* signifie n'importe quel nom pourrait suivre après), quelle que soit la méthode retourne (premier astérisque) ou quels paramètres il faut (troisième astérisque) et c'est une méthode de MyGraphicsClass et cette classe fait partie du package "com.de l'entreprise.*", alors c'est un set() coupe transverse (pointcut). Et notre premier code dit "après l' exécution d'une méthode est un ensemble coupe transverse (pointcut), exécutez le code suivant".

Voir comment AOP élégamment résout le problème ici? En fait tout ce qui est décrit ici peut être fait au moment de la compilation. Un AOP préprocesseur peut simplement modifier votre source (par exemple l'ajout de l'Affichage.mise à jour() à la fin de chaque set-coupe transverse (pointcut) méthode) avant même la compilation de la classe elle-même.

Cependant, cet exemple montre également l'un des grands inconvénients de l'AOP. L'AOP est en train de faire quelque chose que de nombreux programmeurs envisager un "Anti-Modèle". Le modèle exact est appelée "Action à distance".

L'Action à distance est un anti-modèle (reconnue de la commune d'erreur) dans laquelle le comportement dans une partie d'un programme varie énormément basé sur difficile, voire impossible, d'identifier les opérations dans une autre partie de la programme.

Comme un débutant à un projet, peut que je viens de lire le code de n'importe quel jeu-méthode et considérons qu'il est cassé, car il me semble pas de mise à jour de l'affichage. Je ne vois simplement en regardant le code d'une méthode, qu'après qu'il est exécuté, un autre code "comme par magie" être exécuté afin de mettre à jour l'affichage. Je considère cela comme un grave inconvénient! En apportant des modifications à une méthode, des bugs étranges pourrait être mis en place. Mieux comprendre le flux de code de code où certaines choses semblent fonctionner correctement, mais ne sont pas évidentes (comme je l'ai dit, ils ont juste la magie de travail... d'une certaine façon), c'est très dur.

Mise à jour

Juste pour préciser que: Certaines personnes pourraient avoir l'impression que j'ai dis l'AOP est quelque chose de mauvais et ne doit pas être utilisé. Ce n'est pas ce que je dis! L'AOP est en fait une grande fonctionnalité. Je dis juste "de l'Utiliser avec précaution". L'AOP ne fera que causer des problèmes si vous mélangez du code et de l'AOP pour le même Aspect. Dans l'exemple ci-dessus, nous avons l'Aspect de la mise à jour de la valeur d'un objet graphique et de la peinture de l'objet mis à jour. C'est en fait un aspect unique. Le codage de la moitié de cela comme normal de code et l'autre moitié en tant qu'aspect est ce qui ajoute au problème.

Si vous utilisez l'AOP pour un aspect entièrement différent, par exemple pour l'enregistrement, vous n'aurez pas de l'anti-modèle de problème. Dans ce cas, un débutant pour le projet pourrait se demander "Où vont tous ces messages de journal viennent de? Je ne vois pas la sortie du journal dans le code", mais ce n'est pas un énorme problème. Les modifications qu'il apporte à la logique du programme de la peine de briser le journal d'installation et les modifications apportées à la fonction de journalisation sera à peine briser son programme à la logique de ces aspects sont totalement séparées. À l'aide de l'AOP pour l'exploitation forestière, l'avantage est que le code de votre programme peut entièrement se concentrer sur faire tout ce qu'il doit faire et vous pouvez avoir sophistiquées de journalisation, sans avoir votre code d'être encombré par des centaines de messages de journal de partout. Aussi, quand un nouveau code est introduit, comme par magie, journal des messages apparaissent au bon moment avec le bon contenu. Le débutant programmeur peut pas comprendre pourquoi ils sont là, ni d'où ils viennent, mais depuis ils vont se connecter "la bonne chose" au "bon moment", il peut tout simplement heureux d'accepter le fait qu'ils sont là et passer à autre chose.

Donc, une bonne utilisation de l'AOP dans mon exemple serait de toujours vous connecter si une valeur a été mis à jour via une méthode de jeu. Cela ne va pas créer un anti-modèle et presque jamais en être la cause du problème.

On pourrait dire, si vous pouvez facilement abuser de l'AOP pour créer beaucoup de problèmes, c'est une mauvaise idée de l'utiliser. Cependant, la technologie ne peut pas être abusé? Vous pouvez l'abus de l'encapsulation de données, vous pouvez l'abus de l'héritage. Presque tous utiles de la technologie de programmation peuvent être victimes de violence. Considérons un langage de programmation si limité qu'il ne contient que des fonctionnalités qui ne peuvent pas être victimes de violence; une langue où les fonctions ne peuvent être utilisées, car elles étaient à l'origine destinés à être utilisés. Un tel langage serait être limité de telle sorte qu'on peut se demander si il peut même être utilisé pour de vrai monde de la programmation.

35voto

nkr1pt Points 2644

orientée aspects pogramming offre une belle façon de mettre en œuvre les sujets transversaux comme l'exploitation forestière, de la sécurité. Ces transversales concers sont des morceaux de la logique qui doivent être appliquées à de nombreux endroits, mais en fait n'ont rien à voir avec la logique d'entreprise.

Vous ne devriez pas voir de l'AOP comme un remplacement de la programmation orientée objet, de plus en plus comme un complément agréable, que rend votre code plus propre, faiblement couplées et axée sur la logique métier. Donc en appliquant AOP vous gt 2 avantages majeurs:

  1. La logique pour chaque sujet de préoccupation est maintenant dans un seul endroit, plutôt que d'être dispersées au-dessus de la base de code.

  2. les classes sont plus propre, car ils contiennent uniquement code pour leur souci premier (ou la fonctionnalité de base) et secondaire des préoccupations ont été déplacés vers les aspects.

29voto

norbertB Points 2689

La POO et l'AOP ne s'excluent pas mutuellement. AOP peut être un bon ajout à la POO. AOP est particulièrement pratique pour ajouter du code standard tel que la journalisation, le suivi des performances, etc. aux méthodes sans obstruer le code de méthode avec ce code standard.

11voto

fhe Points 3969

Je pense qu'il n'y a pas de réponse générale à cette question, mais une chose à noter est que l'AOP n'est pas de remplacer la POO, mais ajoute de la décomposition de certaines caractéristiques que l'adresse de la prétendue tyrannie de la dominante de la composition (1) (ou transversales).

Il aide certainement, dans certains cas, aussi longtemps que vous êtes dans le contrôle des outils et des langues à utiliser pour un projet spécifique, mais ajoute également un nouveau niveau de complexité en ce qui concerne l'interaction des aspects et le besoin d'outils supplémentaires comme la AJDT encore comprendre votre programme.

Gregor Kiczales a donné une fois une intéressante introduction sur les AOP à Google Tech Talks qui je recommande de regarder: la Programmation Orientée Aspects: Radical de la Recherche de la Modularité.

8voto

Mendelt Points 21583

Tout d'abord AOP ne remplacera pas la POO. L'AOP s'étend de la programmation orientée objet. Les idées et les pratiques de la programmation orientée objet à rester pertinent. Avoir un bon modèle objet qui fera qu'il sera probablement plus facile de l'étendre avec des aspects.

Je pense que les idées que l'AOP apporte sont importantes. Nous avons besoin de travailler sur des façons de mettre en œuvre transversaux-les inquiétudes sur les différentes classes dans votre programme sans avoir à modifier les classes elles-mêmes. Mais je pense que l'AOP finira par devenir une partie de d'autres outils que nous utilisons et pas un autre outil ou d'une technique. Nous voyons déjà ce qui se passe.

Un couple de langages dynamiques comme Ruby et Python, le langage est construit comme mixin qui permettent de résoudre les mêmes problèmes. Cela ressemble beaucoup à de l'AOP, mais pour mieux l'intégrer dans la langue.

Le printemps et le Château et un couple de d'autres de l'injection de dépendances cadre des options pour ajouter un comportement à l'classes, ils injectent. C'est une façon de faire de l'exécution, le tissage et je pense que cela a beaucoup de potentiel.

Je ne pense pas que vous aurez à apprendre un tout nouveau paradigme pour l'utilisation de l'AOP. Les idées sont intéressantes, mais sont en train d'être absorbé par les outils existants et les langues. Juste de rester informé et d'essayer ces outils.

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