在clojure.org documentation on multimethods中指出: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
的最终实现保持输入检查或错误处理的清洁度。是否有更多惯用的方法来进行验证,错误处理和简洁的语法? 最佳答案
这不是“路由到错误处理方法”的意思。建议的技术更像这样:
(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))
错误并非来自分派函数本身:而是,分派函数查找错误的输入值,并将其发送给专用的错误处理程序,以便其他方法知道它们将始终获得有效的输入。
关于clojure - 输入验证是Clojure中多方法的合理用例吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35514942/