Аспектно-ориентированное программирование в Clojure - PullRequest
16 голосов
/ 07 апреля 2011

Как достичь Аспектно-ориентированного программирования в Clojure?Нужен ли нам AOP в Clojure?
Допустим, нам нужно простое ванильное решение Clojure (без AspectJ).

Ответы [ 3 ]

22 голосов
/ 07 апреля 2011

Аспектно-ориентированное программирование обычно используется для добавления сквозных функций в код, которые в противном случае безнадежно переплетаются с бизнес-логикой.Отличный пример - ведение журналов - вам не нужно, чтобы код журналирования разбрасывался повсюду в вашей кодовой базе.

Вам не нужен AOP в Clojure, потому что этого легко достичь с помощью других методов в Clojure.

Например, вы можете использовать функции высшего порядка, чтобы «обернуть» другие функции с помощью функции сквозной резки:

; 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
13 голосов
/ 07 апреля 2011

AOP IMHO - это просто артефакт некоторых видов статических языков программирования.AFAIKS - это обычно просто набор нестандартных расширений компилятора.Я еще не видел ни одного приложения AOP, которое не может быть лучше и лучше решено в более динамичных языках.Clojure, безусловно, достаточно динамичен, и это даже без учета макросов.

Я могу ошибаться, но если это так, мне нужно увидеть фактический вариант использования AOP, который не может быть реализован так же хорошо в чистом видеclojure.

Редактировать: просто для ясности: я отказываюсь рассматривать такие вещи, как советы Элиспа, как аспектно-ориентированные.В динамических языках это просто методы, которые нужно использовать всякий раз, когда они вам нужны, без необходимости поддержки языка, кроме перепривязки определений функций, которые все равно поддерживаются всеми лиспами.

Нет необходимости рассматривать их как особые - вы можете легко определить свою собственную функцию, подобную defadvice, в clojure.Смотрите, например, compojure's wrap!макрос , который на самом деле устарел, так как он вам вообще не нужен.

10 голосов
/ 07 апреля 2011

Аспектно-ориентированное программирование - отличный способ достичь разделения концертов в Java. Композиционные абстракции Clojure достигают этого очень хорошо. См. Также этот вопрос . Тема очень хорошо освещена в Joy Of Clojure .

как пример Aspect Oriented Clojure под другим именем, ознакомьтесь с веб-фреймворком Ring

...