it-swarm-fr.com

Quelles alternatives sont là pour les préoccupations transversales autres que la programmation orientée forme?

La programmation axée sur l'aspect promet de faire face aux préoccupations transversales, mais je ne suis pas encore complètement vendu dessus dessus. Y a-t-il eu d'autres tentatives pour faire face à ce problème?

20
Casebash

Dans la mesure du possible, vous pouvez encapsuler des préoccupations transversales dans des modules distincts qui sont ensuite utilisés dans l'application via une injection de dépendance. Cela vous permet de découpler un peu la mise en œuvre de l'inquiétude transversale de son utilisation dans tout le code.

Cela ne fonctionne pas toujours élégamment, cependant. C'est la raison pour laquelle les gens essaient de résoudre le problème avec des choses comme AOP.

8
Fishtoaster

Deux autres options que je n'ai pas encore vues explorées:

Programmation fonctionnelle avec des monades et des flèches

In FP Vous représentez une préoccupation transversale, comme une autre chose: comme quelque chose que vous passez sur un appel de fonction. Puisque cela devient explicitement fastidieux, vous pouvez utiliser des monades (ou peut-être des flèches) pour cacher loin des informations supplémentaires passées.

L'exemple de AOP le plus courant est la journalisation. Avec Monads, vous créeriez un "enregistreur" monad qui conserve une liste de messages. Toutes les fonctions que vous effectuez via LognerMonad ont la possibilité de poster un message de journal. Avec des flèches, vous manqueriez l'intégralité du flux de données de l'application et travaillerait une routine de journalisation dans le modèle, le cas échéant. Je pense. Les flèches sont assez complexes.

Programmation entité/composante

Quelque chose que j'ai cherché et expérimenter avec un moteur de jeu. Au lieu d'"objets" comme dans OOP, vous décomposez tout en paquets de données (composants) et de services qui fonctionnent sur un type de composant. Les composants sont regroupés par des ID communs, comme dans une base de données relationnelle et des groupes de composants liés sont les entités. Pour ajouter de la journalisation dans un tel système, vous ajouteriez un nouveau service de journalisation des déclencheurs sur la base de laquelle les composants sont passés à travers celle-ci.

Les deux méthodes permettent de travailler facilement un changement transversal de coupe très facilement, mais les deux sont des modèles architecturaux de haut niveau. Donc, vous auriez probablement besoin de les utiliser depuis le début. Le modèle de composant peut, théoriquement, être travaillé dans un système existant OOP System. Je suppose que Monads pourrait être aussi si votre langue est suffisamment puissante.

6
CodexArcanum

Il existe plusieurs façons de faire face aux problèmes des préoccupations transversales:

  • Utilisez de meilleurs motifs de conception, idiomes ou mécanismes d'abstraction : le code peut être une coupe transversale même si elle peut être modulée. Afin de maintenir le code, vous devrez refroidir pour utiliser la technique de conception pouvant le modéliser. Ce refactoring peut introduire une coupe transversale d'un type différent, mais j'espère quelles crosscastes sont stables et peu susceptibles de changer.

  • Développer des caractéristiques de langue plus riches : De nombreuses manifestations de coupe transversale peuvent être résolues à travers de meilleurs mécanismes d'abstraction et parfois de nouvelles fonctionnalités linguistiques sont nécessaires. Par exemple, des langues plus avancées comprennent des caractéristiques fonctionnelles et orientées objet, souvent n'emploitant pas de modèles de conception, car ils ne sont pas nécessaires. Notez que Les motifs de conception eux-mêmes peuvent être transversaux dans la nature, car ils décrivent les rôles de plusieurs objets et classes différents. En Java, la réflexion peut souvent être utilisée à la place d'un aspect, bien que à un coût d'exécution plus élevé. Par exemple, en utilisant la réflexion, vous pouvez soutenir le motif de visiteur sur des centaines de classes avec juste quelques lignes de code. la bibliothèque DJ du nord-est est une solution réfléchissante qui fait exactement cela. Mélangements est une technique puissante disponible en C++ (mais pas Java) et peut vous donner certains des cas d'utilisations identiques en tant que aspect.

  • Fournissez une meilleure prise en charge de l'outil : les techniques telles que l'utilisation grep et effectuer des opérations de refactoring peuvent traiter des problèmes liés au code de coupe transversale. Par exemple, le nom d'une méthode déclarée dans une interface peut couper dans le programme. (Notez la différence technique ici: c'est le nom de la méthode, pas la mise en œuvre de la méthode, cette coupe transversale.) Ce n'est généralement pas un problème dans un IDE comme Eclipse, où vous pouvez utiliser "Renommer refactoring" pour changer tous les lieux de votre code qui utilisent le nom. De cette manière, il est possible de ne pas avoir besoin de fonctionnalités de langue lorsque l'environnement de programmation est suffisamment expressif pour vous.

  • Utilisez des langages spécifiques au domaine : Les premières langues d'aspect, qui sont venues avant que Aspectj, étaient spécifiques à un domaine et appliquées à certains problèmes, tels que la synchronisation de thread ou Analyse des flux de données pour combiner efficacement des compositions de fonction. Ces langues étaient expérimentales, mais semblaient avoir beaucoup de succès à des préoccupations modulatrices selon lesquelles autrement était une coupe transversale.

  • Utilisez des techniques de programmation génératives : une augmentation du niveau de la méta peut être considérée comme une technique de mise en œuvre pour la programmation orientée forme, mais c'est un domaine assez important qu'il transcende aspects simples. Les techniques génératives (lorsqu'un programme génère un code source pour un autre programme) sont également liés aux langues spécifiques à un domaine.

Pour tous ceux-ci, je pense que l'étude de l'AOP est appropriée. AOP peut vous aider à développer vos conceptions du code, même si vous n'utilisez pas de langue AOOP.

3
Macneil

En général Éléments de code de marquage avec une fonctionnalité déclarative, mais spécifiquement le système d'attributs dans le monde C # /. Net/Mono.

2
mumtaz

Je ne suis pas un expert sur l'AOP, mais de lire à ce sujet au fil des ans, il a toujours semblé être une forme plus faible de la métaprogrammation offerte par LISP , en particulier des parties comme son protocole MetaObject.

Cela ne devrait pas ne pas surprendre, je suppose: Gregor Kiczales était l'un des auteurs d'AMOP et a plus tard écrit asphapj pour Java!

2
Ken