【问题标题】:Is input validation a reasonable usecase for multimethods in Clojure?输入验证是 Clojure 中多方法的合理用例吗?
【发布时间】:2016-02-19 21:00:49
【问题描述】:

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 的最终实现保持输入检查或错误处理的干净。有没有更惯用的方法来获得验证、错误处理和干净的语法?

【问题讨论】:

    标签: clojure multimethod


    【解决方案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))
    

    错误并非来自调度函数本身:而是调度函数发现错误的输入值,并将它们发送到专用的错误处理程序,以便其他方法知道它们将始终获得有效输入。

    【讨论】:

    • 谢谢,但是这仍然是对 multimtehods 的有效使用吗?或者如果在函数的开头更简单的话会更惯用吗?
    猜你喜欢
    • 2012-03-19
    • 2017-03-11
    • 1970-01-01
    • 2011-12-03
    • 2014-05-20
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多