Clojure:多方法与协议

8 clojure

上下文

我最近写了很多涉及多方法和协议的代码.

我发现我的大多数方法都是单一调度 - 它们只取决于其中一个参数的类型.

这些情况下,实际上可以通过向协议添加额外字段来替换多方法.

在可以用协议替换多方法的情况下,有没有理由使用多方法而不是协议?

谢谢!

mik*_*era 2

我通常更喜欢协议:它们提供更好的性能并很好地处理常见情况(类型上的单一调度)。

有时您确实需要更复杂的调度,在这种情况下您可以:

  • 全力以赴并使用多种方法
  • 编写一小段自定义代码(通常是(cond .....))来处理调度。有时这比多重方法更好,因为例如多重方法不能很好地处理值的范围。

一个有用的额外建议是以委托给适当协议函数的方式编写主要(公开暴露)函数。

例如,它可能是这样的:

(defn my-api-function [a b]
  "Do interesting things with a and b"
  (multimethod-function
    (protocol-function a)
    (protocol-function b)))
Run Code Online (Sandbox Code Playgroud)

这为您提供了足够的灵活性,可以稍后更改内部实现,而不需要大量重构或影响调用代码。