C#中的静态(编译时/严格类型)多分派支持

时间:2012-03-02 23:02:22

标签: c# design-patterns programming-languages visitor-pattern multimethod

我最近发现自己在我的代码中反复使用相同的模式。基本上它是访问者模式的变体,我用它来解析对派生类的基类实例的引用。这种方法需要大量的样板代码。

问题:

  • 如何在不写入大量访问者代码的情况下,以静态/严格类型的方式在C#中多方式分派方法?
  • 是否有生成此代码的工具/扩展程序?
  • 为什么C#语言中没有任何内容可以解决多方调度问题?我不相信我是唯一发现这令人讨厌的人。我可能非常错误,问题不存在,所以我想知道你是怎么回事。

1 个答案:

答案 0 :(得分:11)

  

如何在不写入大量访问者代码的情况下,以静态/严格类型的方式在C#中多方式分派方法?

我不知道有任何技巧。

在用C#编写的C#编译器的Roslyn版本中,我们在所有地方使用访问者模式,在具有数十或数百个成员的类型层次结构上。我们编写了一个实用程序,它将类型的XML描述转换为类型的声明以及访问者的基类。这对我们来说似乎很有效。

  

是否有生成此代码的工具/扩展程序?

有;我们自己写的。这并不难。你也可以这样做。

  

为什么C#作为一种语言没有解决多调度问题?

我们有一个可能的语言功能列表比你的手臂更长。任何给定的版本我们都有预算可以做两到三个顶部,因此我们专注于获得最大的收益。

通过自动生成访问者模式,更容易实现双(或多个)虚拟调度,从未使其接近该列表的顶部。我们可以将几十种其他可能的模式嵌入到语言中,这些模式更具“爆炸性”。如果您对流行语言进行调查,您会发现很少有语言支持通过静态分析进行双重或多次虚拟调度 ,并且这些语言并不是非常受欢迎。这是有原因的:首先,因为它实际上并不是一个非常有用的功能,其次,因为当你需要它时,你可以通过自己实现模式或使用动态调度来实现它。

如您所知,基于模式的方法和动态调度方法都存在重大缺陷。但是,虽然存在缺点,但对于普通的业务线开发人员来说,如果需要,他们都可以实现可行。在评估嵌入语言的模式时,我们倾向于那些普通开发人员使用基于模式的方法实现自己非常困难的模式。访客模式并不难;它只是冗长。

例如:在C#2中,我们选择在语言中嵌入“序列生成器”模式。在C#3中,我们选择在语言中嵌入“查询理解与序列monads”模式。在C#4中,我们选择在语言中嵌入“动态调度”模式。在C#5中,我们选择将“将当前连续作为委托”模式嵌入到语言中。所有这些都是大肆宣传的例子 - 它们是实现的昂贵功能,但它们从根本上使用核心语言提供新的编程风格

任何版本中只有有限的努力量;在发行版中将一种模式嵌入到语言中会阻止我们在该发行版中的语言中嵌入任何其他模式,因为根本没有预算来执行此操作。

当将“双(或多个)虚拟调度”模式嵌入到语言中成为最好的方式来花费我们的预算时,我们会这样做,而不是之前。因此,您应该期待漫长的等待。