Clojure:多方法 vs 协议

8

背景

最近我一直在编写涉及多方法和协议的代码。

我发现我的大部分多方法都是单分派的——它们只取决于一个参数的类型。

在这些情况下,实际上可以通过将额外的字段添加到协议中来替换这些多方法。

问题

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

谢谢!

3个回答

2

我通常更喜欢使用协议(protocol):它们能够提供更好的性能并且很好地处理了常见情况(单一类型分发)。

有时候你确实需要更复杂的分发,这时你可以选择:

  • 全面采用多方法(multimethods)
  • 编写一小段自定义代码(通常是一个(cond.....)),以处理分发。有时这比使用多方法更好,因为多方法不能很好地处理值范围。

一个有用的额外建议是,将你的主要(公开的)函数写成委托到适当的协议函数的方式。

例如,它可能是这样的:

(defn my-api-function [a b]
  "Do interesting things with a and b"
  (multimethod-function
    (protocol-function a)
    (protocol-function b)))

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

2

如果你的需求有可能会改变,未来需要利用多重分派,那么你可以选择使用多方法。

否则,当协议足够满足你的需求时,你应该优先考虑使用协议。


2

个人而言,我更喜欢使用多方法,因为它们比协议更有效地解耦表示与行为。除了性能之外,我认为没有太多理由去牺牲使用普通映射来表示我的数据的选择,以根据需要添加多重分派或根据“物理”类型以外的属性进行分派(在我看来,“物理”类型本身并不是一个很好的概念依赖)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接