Comment réaliser une programmation orientée aspect dans Clojure? Avons-nous besoin d'AOP à Clojure? Disons que nous voulons une solution de Clojure à la vanille pure (sans AspectJ).Programmation orientée aspect dans Clojure
Répondre
AOP IMHO est juste un artefact de certains types de langages de programmation statiques. AFAIKS c'est habituellement juste un tas d'extensions de compilateur non standard. Je n'ai pas encore vu une application de AOP qui ne peut pas être mieux résolue & nativement dans des langages plus dynamiques. Clojure est certainement assez dynamique, et cela sans même prendre en compte les macros. Je peux me tromper, mais si c'est le cas, j'ai besoin de voir un cas d'utilisation AOP réel qui ne peut pas être implémenté aussi bien en clojure pure. Edit: juste pour être clair: je refuse de voir des choses comme les conseils d'elisp orientés vers l'aspect. Dans les langages dynamiques, ce ne sont que des techniques à utiliser quand vous en avez besoin, sans avoir besoin d'un support de langage autre que la reliaison des définitions de fonctions - que tous les lisps supportent quand même.
Inutile de les traiter comme spéciales - vous pouvez facilement définir votre propre fonction defadvice dans clojure. Voir par exemple compojure's wrap! macro, qui est en fait obsolète puisque vous n'en avez généralement pas besoin.
La programmation orientée aspect est un excellent moyen d'atteindre séparation des préoccupations en Java. Les abstractions composables de Clojure le réalisent très bien. Voir this question aussi. Le sujet est très bien couvert dans le Joy Of Clojure.
comme un exemple d'Aspect Oriented Clojure par un autre nom consultez le framework web Anneau
Programmation Orientée Aspect est généralement utilisé pour ajouter des fonctionnalités transversales au code qui autrement se désespérément étroitement liée à la logique métier. Un bon exemple est la journalisation - vous ne voulez pas vraiment que le code de journalisation soit dispersé partout dans votre base de code.
Vous n'avez pas vraiment besoin d'AOP dans Clojure car il est facile de réaliser cela avec d'autres techniques dans Clojure.
Par exemple, vous pouvez utiliser des fonctions plus poussées pour « envelopper » d'autres fonctions avec la transversalité de coupe:
; a simple function - the "business logic"
(defn my-calculation [a b]
(+ a b))
; higher order function that adds logging to any other function
(defn wrap-with-logging [func]
(fn [& args]
(let [result (apply func args)]
(println "Log result: " result)
result)))
; create a wrapped version of the original function with logging added
(def my-logged-calculation (wrap-with-logging my-calculation))
(my-logged-calculation 7 9)
=> Log result: 16
=> 16
Le problème avec cet exemple, en comparaison avec AOP, est que maintenant le développeur doit invoquer la nouvelle méthode wrapper au lieu de l'original. Idéalement, il serait possible d'obtenir le comportement de journalisation en invoquant la méthode originale. Ce serait plus proche de ce que l'AOP fournit, n'est-ce pas? – jcrossley3
@ jcrossley3 - vous pourriez toujours redéfinir la fonction d'origine avec (def my-calcul (wrap-with-logging mon-calcul)) si vous vouliez .... – mikera
excellent point! :) – jcrossley3
- 1. Programmation orientée aspect dans android
- 2. Programmation orientée aspect avec LLVM
- 3. Programmation Orientée Aspect au printemps
- 4. Programmation Orientée Aspect en Qt
- 5. Programmation orientée aspect en C#
- 6. ActionScript 3 Programmation orientée aspect
- 7. Programmation orientée aspect dans ASP.NET MVC
- 8. Où est la programmation orientée aspect?
- 9. Qu'est-ce que la programmation orientée aspect?
- 10. Qu'est-ce que la programmation orientée aspect?
- 11. Programmation orientée aspect dans r: Toute bibliothèque disponible?
- 12. Utilisation de motifs en quadrichromie dans la programmation orientée aspect?
- 13. Quelles sont les différences entre la programmation orientée aspect et la programmation orientée objet?
- 14. Aspect question orientée - Pointcut
- 15. Où puis-je commencer avec la programmation orientée aspect?
- 16. Programmation orientée aspect pour Google App Engine (Java)
- 17. Bibliothèque de programmation orientée aspect pour C# (structure compacte 3.5)
- 18. DBC (Conception par contrat) et AOP (programmation orientée aspect)
- 19. La programmation orientée aspect est-elle utile pour fournir des implémentations pour la programmation par interface?
- 20. Comment puis-je utiliser une classe singleton dans AOP (programmation orientée aspect)?
- 21. Programmation orientée objet Android
- 22. Programmation JavaScript orientée objet
- 23. Programmation orientée objet Python
- 24. Comment la conception pilotée par domaine peut-elle être combinée à une programmation orientée aspect?
- 25. SPRING.Net est-il le meilleur cadre pour la programmation orientée aspect (AOP)?
- 26. Gestion des exceptions Rails à l'aide de la programmation orientée aspect
- 27. Programmation orientée objet vs programmation procédurale
- 28. Programmation orientée objet vs vectorielle
- 29. Programmation orientée objet Nième enfant
- 30. Programmation orientée objet dans un contexte de programmation purement fonctionnel?
Il est un peu bizarre de dire macros sont dynamiques car ils fonctionnent à la compilation (ils sont des crochets dans le compilateur). Lorsque vous modifiez une macro, vous devez recompiler tout le code qui l'appelle. Pas très dynamique dans mon livre ... – Marek
De plus, AOP est intimement lié à MOP, le protocole metaobject du Common Lisp (aussi Pascal Constanza est célèbre pour avoir préconisé AOP for CL). Pensez-vous que le Common Lisp est également statique? Cette réponse semble être une collection aléatoire de suppositions (non) instruites ... – Marek
Je pense que cette réponse semble impliquer (pour quelqu'un qui ne connaît pas bien Clojure) que Clojure élimine en quelque sorte les préoccupations transversales sans effort supplémentaire. La réponse de mikera est beaucoup plus claire à ce sujet et comprend également des exemples, je pense que cela devrait être la réponse acceptée. Le fait que cette réponse et son exemple mettent également en évidence certaines difficultés ne fait que confirmer la conclusion selon laquelle les préoccupations AOP/Cross-cutting (par tout autre nom) ne sont pas résolues automatiquement dans Clojure. – Sprague