由于许多动态编程语言都具有鸭型的特性,它们还可以随时打开和修改类或实例方法(如红宝石和Python),然后是…。
问题1)动态语言中的类需要什么?为什么这种语言被设计成使用类作为某种“模板”,而不是用原型的方式来使用对象呢?
JavaScript也是基于原型的,但是CoffeeScript (JavaScript的增强版)选择了基于类的方式。Lua (基于原型的)和MoonScript (基于类的)也是如此。另外,ES 6中还有类,所以…
问题2)这是否意味着如果你试图改进一种基于原型的语言,你应该把它改为基于类的语言吗?如果没有,为什么要这样设计呢?
发布于 2015-02-01 11:43:14
问题1)在动态语言中,对类的需求是什么?为什么这种语言被设计成使用类作为某种“模板”,而不是用原型的方式来使用对象呢?
第一种面向对象语言(虽然不是" OO ") Simula没有继承。继承是在Simula-67中添加的,它是基于类的。
大约在同一时间,艾伦·凯( Alan )开始研究一种新的编程范式,后来他将其命名为“面向对象”。他真的很喜欢继承,想用他的语言来继承,但他也真的不喜欢上课。然而,他无法想出一种没有类的继承方法,所以他决定不喜欢类而不喜欢继承,于是设计了Smalltalk的第一个版本,Smalltalk-72没有类,因此没有继承。
几个月后,design提出了一个类的设计,其中类本身就是对象,即元类的实例。艾伦·凯( Alan )发现,这种设计比以前的设计稍微逊色一些,因此Smalltalk-74是用类和基于类的继承设计的。
在Smalltalk-74之后,Alan觉得Smalltalk正朝着错误的方向发展,实际上并不代表OO的意义,他建议球队放弃Smalltalk,重新开始,但他被否决了。接着是Smalltalk-76,Smalltalk-80 (将向研究人员发布Smalltalk的第一个版本),最后是Smalltalk-80 V2.0 (第一个版本将在商业上发布,并成为ANSI Smalltalk的基础版本)。
由于Simula-67和Smalltalk-80被认为是所有面向对象语言(几乎所有后续语言)的祖父母,盲目地复制类的设计和基于类的继承。几年后,当基于混合而不是类的继承和基于对象的委托而不是基于类的继承等其他想法浮出水面时,基于类的继承已经变得过于根深蒂固。
有趣的是,Alan目前的语言是基于原型委托的。
发布于 2015-02-01 03:37:19
许多程序员更喜欢使用类。这是一个非常容易理解的概念,它是人类对世界的思维过程的一个很好的模型(也就是说,我们本能地将真实的对象与我们认为它们属于的抽象项目组联系起来,这就是类)。此外,类使关于对象类型的推理变得更容易:在基于类的语言中,应用像Liskov代换这样的原则比在一种语言中应用更简单,在这种语言中,对象可能有不同的方法,或者其类型在运行时甚至可能发生变化,就像JavaScript中的情况一样。
请注意,即使在JavaScript中,也有很多代码只是使用prototype工具来模拟类。这主要是因为很多程序员更喜欢这样的想法。
还有一个更喜欢基于类的语言的原因:更容易将它们编译成高效的代码。最有效的JavaScript VM有效地动态创建类来表示JavaScript对象的类型,因为它们的方法和原型发生了变化。有关为什么这样做的理由,请参见对V8's实现的描述。
发布于 2015-02-01 06:38:51
我听说过,在大型项目中,团队成员在使用相同的代码,灵活的语言(可以在运行时修改对象的属性和方法)是其他团队成员不希望您拥有的自由。
他们想知道,当他们处理一个对象时,这个对象的作用就像蓝图所说的那样,而不是其他一些雄心勃勃的开发人员为了完成自己的任务而决定改变的某种变形的方式。
所以,我能想到的唯一原因是,有些人不想要这些令人敬畏的动态语言提供的灵活性,因为他们想简化团队开发、调试和自动文档。
就我个人而言,我已经在这两种方法中开发了应用程序,而且我用动态语言完成任务的速度更快。我没有使用这些框架中的任何一个来将我的动态语言再次转化为类基语言。这样的事情是我品味的倒退。
https://softwareengineering.stackexchange.com/questions/271776
复制相似问题