clojure - 输入验证是 Clojure 中多方法的合理用例吗?

标签 clojure multimethod

clojure.org documentation on multimethods它指出:

Clojure 多方法...可以验证参数并路由到错误处理方法等。

但是,我没有看到很多人为此目的使用多种方法的例子。在我只需要实现单个方法定义的情况下,使用多方法进行输入验证仍然有意义吗?例如:

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

相关文章:

clojure - 在 Clojure 中使用二维数组并初始化每个单元格的正确形式

clojure - Clojure 中的 reader monad 和偏函数有什么区别?

clojure - 了解多方法调度

emacs - 通过 Slime 重新加载多方法

clojure - 定义 Clojure 多方法

clojure - 为什么reduce函数会以相反的顺序产生结果?

java - 尝试加载资源时 clojure.lang.Compiler 中的 NPE

macros - 另一个宏中的 Clojure 宏 : how to generate string from symbol

haskell - Clojure - 按返回类型分派(dispatch)? (与 Haskell 类型类一样富有表现力)

clojure - 我可以在 Clojure 的类型和属性上分派(dispatch)一个多方法吗?