上下文
最近我写了很多涉及多种方法和协议的代码。
我发现我的大多数多方法都是单一分派--它们只依赖于其中一个参数的类型。
在这些情况下,实际上可以通过向协议中添加一个额外字段来替换多个方法。
问题
在可以用协议代替multimethod的情况下,是否有理由使用multimethod而不是协议?
谢谢!
发布于 2012-05-23 06:38:45
通常情况下,更喜欢协议:它们提供了更好的性能,并且很好地处理了常见情况(类型上的单一分派)。
有时,您确实需要更复杂的调度,在这种情况下,您可以:
multimethods
(cond .....)
) --用于处理调度。有时,这比多方法要好,因为多方法不能很好地处理值的范围。一个有用的额外建议是以委托给适当的协议函数的方式编写主要(公开公开的)函数。
例如,它可能类似于:
(defn my-api-function [a b]
"Do interesting things with a and b"
(multimethod-function
(protocol-function a)
(protocol-function b)))
这为您以后更改内部实现提供了足够的灵活性,而不需要大量重构或影响调用代码。
发布于 2012-05-22 23:40:52
如果您的需求可能会发生变化,并且将来需要利用多个分派,您可以选择使用multimethod。
否则,当协议满足您的目的时,您应该支持它们。
发布于 2012-05-23 07:07:04
就我个人而言,我更喜欢多方法,因为它们比协议更有效地将表示与行为分离。除了性能之外,我认为没有理由选择使用普通映射来表示数据,根据需要添加多个分派,或者根据“物理”类型以外的属性进行分派(在我看来,这本身并不是一个很好的概念)。
https://stackoverflow.com/questions/10710975
复制相似问题