首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Clojure:多方法与协议

Clojure:多方法与协议
EN

Stack Overflow用户
提问于 2012-05-22 22:17:45
回答 3查看 452关注 0票数 8

上下文

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

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

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

问题

在可以用协议代替multimethod的情况下,是否有理由使用multimethod而不是协议?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-23 06:38:45

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

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

multimethods

  • Write --一段简短的自定义代码(通常是(cond .....)) --用于处理调度。有时,这比多方法要好,因为多方法不能很好地处理值的范围。

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

例如,它可能类似于:

代码语言:javascript
运行
复制
(defn my-api-function [a b]
  "Do interesting things with a and b"
  (multimethod-function
    (protocol-function a)
    (protocol-function b)))

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

票数 2
EN

Stack Overflow用户

发布于 2012-05-22 23:40:52

如果您的需求可能会发生变化,并且将来需要利用多个分派,您可以选择使用multimethod。

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

票数 2
EN

Stack Overflow用户

发布于 2012-05-23 07:07:04

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10710975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档