Clojure:多方法vs协议 上下文

Clojure:多方法vs协议 上下文,clojure,Clojure,最近我写了很多涉及多方法和协议的代码 我发现我的大多数多方法都是单分派的——它们只依赖于其中一个参数的类型 在这些情况下,实际上可以通过向协议添加额外字段来替换多方法 问题: 在可以用协议代替多方法的情况下,是否有理由使用多方法代替协议 谢谢 如果您的需求有合理的机会发生变化,并且您将来需要利用多重分派,那么您可以选择使用多重分派 否则,当协议足以满足您的目的时,您应该偏爱它们。我通常更喜欢协议:它们提供更好的性能,并且能够很好地处理常见情况(类型上的单个分派) 有时您确实需要更复杂的调度,在这

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

我发现我的大多数多方法都是单分派的——它们只依赖于其中一个参数的类型

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

问题: 在可以用协议代替多方法的情况下,是否有理由使用多方法代替协议


谢谢

如果您的需求有合理的机会发生变化,并且您将来需要利用多重分派,那么您可以选择使用多重分派


否则,当协议足以满足您的目的时,您应该偏爱它们。

我通常更喜欢协议:它们提供更好的性能,并且能够很好地处理常见情况(类型上的单个分派)

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

  • 全力以赴,使用多种方法
  • 编写一小段自定义代码(通常是
    (cond…)
    )来处理分派。有时这比多重方法要好,因为多重方法不能很好地处理值的范围
另外一条有用的建议是,以委托给适当的协议函数的方式编写主(公开)函数

e、 g.可能是这样的:

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

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

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