为什么 Clojure 中的多方法不应该简单地用 cond 表达式替换?
在看了第 1 章中多种方法的简单示例后,我受到启发而提出了这个问题。拉斯·奥尔森 (Russ Olsen) 的书的 5 篇获取 Clojure.
在回答类似问题时(Clojure 中 multimethod 与 cond 的性能 https://stackoverflow.com/questions/28577115/performance-of-multimethod-vs-cond-in-clojure),用户丹尼尔·康普顿说
多种方法允许开放扩展;其他人可以扩展您对任意表达式的多方法调度。 Cond 表达式不允许其他人甚至您自己的代码进行扩展。
但我根本不清楚“开放扩展”和“封闭扩展”在这种情况下意味着什么,因为在我看来,多方法和条件表达式都可以很容易地编辑或扩展。
那么...为什么 Clojure 中的多方法不应该简单地用 cond 表达式替换呢?
或者,同样地,使用 multimethods 到底如何或何时才能比使用 cond 更好或更优雅?
这里的关键点是“允许开放扩展”。任何人都可以添加新内容
多种方法的分支 - acond
是硬编码的:新调度
必须添加到cond
代码就位。
假设:您有一些小部件并且想要绘制它们。小部件有
A:type
并且您想发送如何draw
就那种类型。
写一篇大cond
对于所有小部件你知道将工作。但现在
对于每个新的小部件,您必须触摸cond
源码并修改。
这can完全没问题,例如实际应用,不需要
扩大。
用多种方法做同样的事情,anyone可以实施一个draw
他们的
小部件。所以you在编写代码时并不知道所有这些。这使得
对于例如,这是一种更好的(甚至是强制性的)方法图书馆。
现在想象一下,您已经决定cond
图书馆方法
你正在写。现在任何拥有新小部件的人都必须编写自己的小部件draw
,先派遣他们的抽奖,然后致电您的draw
。还有他们
必须确保他们的draw
到处都被调用,无论你在哪里draw
被要求让它工作(这通常是不可能的)
一种干净的方式)。
直接在 Clojure 核心中使用多方法的一个流行示例是print-method https://github.com/clojure/clojure/blob/f9b04ae5f7fd9f11ea7a431675f4ec2d23f295f5/src/clj/clojure/core.clj#L3665-L3667。
通过这种方式,任何人都可以为其类型和游戏实现“序列化”
很好。
其他值得一提的例子有Clojure.测试 https://github.com/clojure/clojure/blob/28efe345d5e995dc152a0286fb0be81443a0d9ac/src/clj/clojure/test.clj
and 积分 https://github.com/weavejester/integrant.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)