2011-04-06 2 views

Répondre

13

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.

+2

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

+2

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

+1

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

11

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

20

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 
+5

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

+7

@ jcrossley3 - vous pourriez toujours redéfinir la fonction d'origine avec (def my-calcul (wrap-with-logging mon-calcul)) si vous vouliez .... – mikera

+0

excellent point! :) – jcrossley3

Questions connexes