选择你需要的战斗
本文来自织梦
BillVenners:为了能让Java程序员接受Scala,您都做了哪些努力?例如,像Java使用大括号而不是其它符号来分块程序,这使得C和C++程序员感到使用Java就如同使用C和C++一样。 织梦好,好织梦
MartinOdersky:我们并没有为了推销产品而设计什么特殊功能,但是为了避免产生使用障碍,我们做了一些努力。举例来说,我认为大括号起了很好的分割作用,所以我选择使用它。我们本可以坚持使用begin/end或是其它符号,但我不认为这些符号能起到更好的效果。 织梦内容管理系统
其中有一个我们做了改动的地方。最初我们曾使用冒号-等号表示变量赋值,就像是Pascal、Modular和Ada那样,使用单个等号表示相等。很多编程理论会认为这是最恰当的方式。赋值并不表示相等,因此,你必须使用不同的符号。但后来我与一些使用Java的人进行交流。我得到的反应是,“哦,这看起来像是一个很有趣的语言。但是,为什么你要写冒号-等号?它是什么意思?”我解释说,意思就像Pascal中使用的那样。他们说,“那我明白了,但我不明白为什么你坚持要使用这个。”然后我意识到,这并不是我们想要坚持的东西。我们并不想说,“我们有了一个更好的语言,因为我们用冒号-等号代替了等号。”这完全是不值一提的小事,人们完全可以适应任何方式。因此,我们决定不再计较这些小事,而是有其他更重要的地方我们想要与众不同。 织梦内容管理系统
BillVenners:这次您没有说那句您曾经说过的“选择你需要的战斗”。基本上,您认为,等号并不那么重要,还有其他您更在意的东西。那么那些重要的事情是什么?您有什么方法能够说服人们去改变他们的想法或程序?
织梦内容管理系统
MartinOdersky:我们首要关心的一件事是,拥有一个尽可能整洁的集成了函数式和面向对象的程序设计。我们希望拥有一流的功能,还希望拥有其他函数式程序设计的特征,如类型,泛型,模式匹配。我们希望能够以一个更加整洁的方式整合函数式和面向对象。这是我们从一开始就深感关心的事情。
织梦好,好织梦
后来,我们发现这实际上是很容易实现的,因为函数式语言有一套固定的特点。这些特点已经被深入研究和充分证明过了,因此,我们所面临的问题只是如何以最佳方式整合这些特点到面向对象程序设计。在做Pizza时,我们已经进行了尝试,在Scala,我认为我们得到了两者之间更顺畅的集成。但后来我们发现,在面向对象方面仍有很多事情有待开发。面向对象程序设计,至少摆在一个静态类型系统上,是一个非常未知领域。目前我们可以看到和使用一些已有的工作,但我们发现几乎所有的语言都做出了很大的妥协。 内容来自dedecms
因此,随着开发Scala,我们开始发现如何能够混合对象,如何能够抽象自我类型,如何能够使用抽象类型成员,以及如何能够让这一切集成到一起。已有一些研究语言以特殊方法关注了以上几个方面,但几乎还没有任何主流语言,能够涵盖以上所有方面。最终结果表明,Scala的主要创新在于面向对象方面,这也是我们真正关心的事情。 内容来自dedecms
面向对象的创新 dedecms.com
51CTO推荐阅读:面向对象的思维过程
Bill Venners:您能不能给出一个具体的列表,列出一些您认为是Scala面向对象的创新?
MartinOdersky:首先,我们想要创造一个纯粹的面向对象的语言,其中的每个值都是一个对象,每个操作都是一个方法调用,每个变量都是一些类的成员。因此,我们不想要静态变量,但我们需要一些其他的东西来替代它们,所以我们提出了Singleton对象。但是,即使是Singleton对象仍然是全局结构。因此,我们所面临的挑战是如何尽可能少地使用它们,因为当你使用一个全局结构时,你就不能再改变它了。你不能实例化它。它很难测试。很难对它以任何方式进行修改。 copyright dedecms
因此,我们所面临的挑战是,如何能够不使用静态或全局思想来建立复杂的组件。尤其是,我们不得不处理组件间的递归依赖。例如我有两个组件A和B。A使用B,同时B使用A。我要如何才能让他们发现对方,并协同工作?我们所做的第一件事是基于mixin(混合式)合成的概念,然而,Java只有单一类和一串含有虚定义而没有代码的接口概念,Scala有类和Traits概念,其中Traits可以包含带有定义和函数域的方法,例如可以带有函数体。然后,我们就拥有了mixin合成,而不只是具有类实现接口,在mixin合成中,我们定义类和所有Traits。有关这项工作是如何工作的细节在此就不详述,我们称之为线性化。
copyright dedecms
因此,我们定义一个线性化Scala。但随之而来的问题是,怎么样能让一个mixin发现其他mixin?如果他们需要一些来自其他mixin的服务,他们如何指定目标?标准的面向对象方式是通过抽象成员,只要你处理方法,这种方式就会运作良好,但是,我们还必须要处理变量。如何才能让mixin找到对方的域?更重要的是,我们不得不处理类型。因为我们从一开始就有类型嵌套,就像内部类,这是另一个我认为非常重要的事情。如果你选择了mixin合成,一个Trait如何能够找到有关所有其他Trait的内部类,然后访问那些类?我们发现(不仅是发现,更是设计),我们可以通过在自我类型上定义一个抽象来做到这一点。
copyright dedecms
内容来自dedecms
复制地址和好友共享







