8 clojure
我最近写了很多涉及多方法和协议的代码.
我发现我的大多数方法都是单一调度 - 它们只取决于其中一个参数的类型.
这些情况下,实际上可以通过向协议添加额外字段来替换多方法.
在可以用协议替换多方法的情况下,有没有理由使用多方法而不是协议?
谢谢!
我通常更喜欢协议:它们提供更好的性能并很好地处理常见情况(类型上的单一调度)。
有时您确实需要更复杂的调度,在这种情况下您可以:
(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)
这为您提供了足够的灵活性,可以稍后更改内部实现,而不需要大量重构或影响调用代码。