Является ли проверка ввода разумным вариантом использования мультиметодов в Clojure?

В документации clojure.org по мультиметодам говорится:

Clojure multimethods ... can do validation of arguments and route to error-handling methods etc.

Однако я не вижу много примеров использования мультиметодов для этой цели. В ситуации, когда мне нужно реализовать только одно определение метода, имеет ли смысл использовать мультиметоды для проверки ввода? Например:

(defmulti divide
          (fn [a b] (if (zero? b)
                      (throw (IllegalArgumentException. "Cannot divide by zero"))
                      :ok)))
(defmethod divide :ok [a b] (quot a b))

Преимущество этого в том, что окончательная реализация divide остается чистой от проверки ввода или обработки ошибок. Есть ли более идиоматический способ получить проверку, обработку ошибок и чистый синтаксис?


person Alex Spurling    schedule 19.02.2016    source источник


Ответы (1)


Это не то, что подразумевается под «маршрутом к методам обработки ошибок». Предлагаемая техника больше похожа на следующую:

(defmulti divide (fn [num denom] denom))
(defmethod divide 0 [num denon]
  (throw (IllegalArgumentException. "Cannot divide by zero")))
(defmethod divide :default [a b] (quot a b))

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

person amalloy    schedule 19.02.2016
comment
Спасибо, будет ли это все еще допустимым использованием мультиметодов? Или простое if в начале функции будет более идиоматичным? - person Alex Spurling; 20.02.2016