为什么Clojure的多方法比'if'或'case'语句更好

时间:2012-03-11 18:33:19

标签: clojure polymorphism switch-statement case multimethod

我花了一些时间,试图了解Clojure多方法。据我所知,主要的“亲”多方法论证是他们的灵活性,然而,我对为什么多方法比简单的if或case语句更好的论证感到困惑。请有人解释一下,多态性与过度的案例陈述之间的界限在哪里?

编辑:我应该更清楚这个问题,我对'if'语句比较感兴趣。非常感谢你的答案!

3 个答案:

答案 0 :(得分:23)

假设我们有类型A,B,C,D和E,并且方法m1,m2,m3采用先前类型的单个参数。你可以把它们放在这样的表中:

   | A | B | C | D | E |
m1 |   |   |   |   |   |
m2 |   |   |   |   |   |
m3 |   |   |   |   |   |

“switch”语句策略一次实现此表的一行。假设您添加了一个新类型F.您必须修改所有实现以支持它。

基于类的多态(C ++,Java等)允许您实现整列。因此,添加新类型很容易,因为您不必更改已定义的类。但添加新方法很难,因为您必须将其添加到所有其他类型。

Multimethods允许您彼此独立地实现表格的单个单元格。

如果您必须分派多个参数,这种灵活性会更大。每个新参数都为此表添加了另一个维度,基于swich和基于类的调度都非常快速地变得非常复杂(参见访问者模式)。

请注意,多方法实际上甚至比描述的更通用,因为你可以派遣几乎任何东西,而不仅仅是在参数的类型上。

答案 1 :(得分:16)

multimethods和一个大的if语句之间的区别在于你需要修改包含case语句的函数来将case添加到if语句中。您可以添加新方法,而无需触及以前存在的方法。

因此,如果您在库中定义了一个多方法,并且希望用户能够为自己的数据类型扩展它,那就没问题了。如果您使用了if语句,那将是一个很大的问题。

答案 2 :(得分:1)

上面的回答可以通过查看 this article 来扩展。它很好地解释了协议的强大功能。将多方法视为具有多个维度的协议。