8

语境

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

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

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

问题

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

谢谢!

4

3 回答 3

2

如果您的需求很有可能会发生变化,并且您将来需要利用多重调度,那么您可能会选择使用多重方法。

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

于 2012-05-22T23:40:52.460 回答
2

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

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

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

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

例如,它可能是这样的:

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

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

于 2012-05-23T06:38:45.243 回答
2

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

于 2012-05-23T07:07:04.457 回答