挖坟鞭尸:当年Sun公司的白皮书《About Microsoft “Delegates”》

挖坟鞭尸:当年Sun公司的白皮书《About Microsoft “Delegates”》_第1张图片

这是一桩当年的Sun公司与Java的旧事,还要追溯到C#还没出现,微软还在搞J++的时代。这篇著名的白皮书便是《About Microsoft “Delegates”》,其中列出了Sun眼中的Delegate,或者说Bound Method Reference这一更广泛概念的多个缺点:

  • 它为语言带来了复杂度。但实际上,这里更多的是“编译器”或是语言“实现者”需要应付的复杂度。对语言的“使用者”来说,尽管C#或Scala比Java语言要复杂不少,但是用起来却更为省事,大大减少了代码编写和理解的复杂度。
  • 它让语言变得不够“面向对象”。在我看来这种为了“面向对象”而“面向对象”可谓本末倒置,“面向对象”是“手段”而不是“目标”。事实上Java近年来的发展,例如静态引入,MethodHandle,乃至社区不断诉求却一再延后的Lambda表达式,其实都在为了易用性而做出的妥协。
  • 它的表达能力不够。这点我始终不能理解,因为Bound Method Reference是运行时的概念,表达能力确是语言设计本身所影响的,一个运行时的概念为什么就没法用优美的语法形式表达出来?C# 2.0至3.0的飞跃,让它的表达能力早已远胜Java语言,而且这也与Delegate概念直接相关。
  • 它这不如适配器对象好用。Java语言的设计者们认为,用内部类/匿名类的语法来实现适配器对象虽然麻烦了一些,但也并没有带来什么问题。但是在使用者眼中,Java的语法噪音是出了名的多,直接影响Java语言的表达能力。如图,在C#中早就可以使用“文艺”的Scala方式来写程序,但如果想用相同的理念就只能变成十足的“二逼”了。

当然,白皮书还包含了更详细的讨论。最后,它信誓旦旦地写到:“Bound Method Reference并不是语言发展的正确道路”——至于现状如何就不多说了。我的感觉是:不谈Java语言设计者的水平如何,至少这篇白皮书的作者,在语言设计的能力或品味上几乎落后了Anders Hejlsberg十年。从我之前翻译过的一篇文章来看,Anders一直扮演着指引语言发展方向的作用,这也是为什么C#在这十年的发展能比Java要健康得多的主要原因之一。

这篇文章的信息量并不大。原本我是在写另一篇文章,这些文字只是顺便提起的话题,但是一说却又感觉刹不住车。为了避免偏离话题,于是就把它单独成篇了——您可且看且过,倒是下一篇文章会更有趣一些。

你可能感兴趣的:(语言编程)