2016-02-19 4 views
2

В clojure.org documentation on multimethods она гласит:Является ли входная проверка разумной способностью использования нескольких методов в Clojure?

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 чистой проверки ввода или обработки ошибок. Есть ли более идиоматический способ получения валидации, обработки ошибок и чистого синтаксиса?

ответ

5

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

(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)) 

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

+0

Спасибо, будет ли это все еще действительным использованием мультиимходов? Или было бы просто, если бы в начале функции было более идиоматично? –