族谱网 头条 人物百科

基于原型的编程

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:325
转发:0
评论:0
与基于类的编程的比较在基于类的编程当中,对象总共有两种类型。类定义了对象的基本布局和函数特性,而接口是“可以使用的”对象,它基于特定类的样式。在此模型中,类表现为行为和结构的集合,就接口持有对象的数据而言,对所有接口来说是相同的。区分规则因而首先是基于结构和行为,而后是状态。原型编程的主张者经常争论说基于类的语言提倡使用一个关注分类和类之间关系开发模型。与此相对,原型编程看起来提倡程序员关注一系列对象实例的行为,而之后才关心如何将这些对象划分到最近的使用方式相似的原型对象,而不是分成类。因为如此,很多基于原型的系统提倡运行时原型的修改,而只有极少数基于类的面向对象系统(比如第一个动态面向对象的系统Smalltalk)允许类在程序运行时被修改。原型编程通常穿插在教授cognitivepsychology的课程中,他强调prototypes和exemplars作为学习中的关键词。考虑到绝大多数...

与基于类的编程的比较

在基于类的编程当中,对象总共有两种类型。类定义了对象的基本布局和函数特性,而接口是“可以使用的”对象,它基于特定类的样式。在此模型中,类表现为行为和结构的集合,就接口持有对象的数据而言,对所有接口来说是相同的。区分规则因而首先是基于结构和行为,而后是状态。

原型编程的主张者经常争论说基于类的语言提倡使用一个关注分类和类之间关系开发模型。与此相对,原型编程看起来提倡程序员关注一系列对象实例的行为,而之后才关心如何将这些对象划分到最近的使用方式相似的原型对象,而不是分成类。因为如此,很多基于原型的系统提倡运行时原型的修改,而只有极少数基于类的面向对象系统(比如第一个动态面向对象的系统Smalltalk)允许类在程序运行时被修改。

原型编程通常穿插在教授 cognitive psychology 的课程中,他强调 prototypes 和 exemplars 作为学习中的关键词。

考虑到绝大多数基于原型的系统是基于解释性的和动态类型程序语言,这里要重点指出的是静态类型语言实现基于原型从技术上是可行的。用基于原型编程描述的Omega语言就是这样系统的一个例子。尽管根据 Omega 网站所述,Omega 也不是完全的静态,但是可能的时候,它的编译器有时会使用静态绑定来改进程序的效率。

对象构造

在基于类的语言中,一个新的实例通过类构造器和构造器可选的参数来构造,结果实例由类选定的行为和布局创建模型。在基于原型的系统中构造对象有两种方法,通过复制已有的对象 或者通过扩展 nihilo(空的)对象创建,因为大多数系统提供了不同的复制方法,扩展 nihilo 对象的方式鲜为人知。

提供扩展 nihilo 对象创建的系统允许对象从空白中创建而无需从已有的原型中复制。这样的系统提供特殊的文法用以指定新对象的行为和属性,无须参考已存在的对象。在很多原型语言中,通常有一个 Object 原型,其中有普遍需要的方法。它被用作所有其它对象的最终原型。扩展 nihilo 对象创建可以保证新对象不会被顶级对象的命名空间污染。(在JavaScript中,可以利用null原型来做到, i.e. Object.create(null))。

Cloning 指一个新对象通过复制一个已经存在的对象(就是他的原型)来构造自己的过程。于是新的对象拥有原来对象的所有属性,从这一点出发新对象的属性可以被修改。在某些系统中,子对象持有一个到它原型的直接链接(经由授权或类似方式)。并且原型的改变同样会导致它的副本的变化。其他系统中,如类Forth的程序语言,Kevo 在此情况下不传播原型的改变,而遵循一个更加连续的模型,其中被复制的对象改变不会通过他的副本传播。

// Example of true prototypal inheritance style // in JavaScript.// "ex nihilo" object creation using the literal // object notation {}.varfoo={name:"foo",one:1,two:2};// Another "ex nihilo" object.varbar={three:3};// Gecko and Webkit JavaScript engines can directly // manipulate the internal prototype link.// For the sake of simplicity, let us pretend // that the following line works regardless of the // engine used:bar.__proto__=foo;// foo is now the prototype of bar.// If we try to access foo"s properties from bar // from now on, we"ll succeed. bar.one// Resolves to 1.// The child object"s properties are also accessible.bar.three// Resolves to 3.// Own properties shadow prototype propertiesbar.name="bar";foo.name;// unaffected, resolves to "foo"bar.name;// Resolves to "bar"

下面是个在 JavaScript 1.8.5 以上版本的例子

varfoo={one:1,two:2};// bar.[[ prototype ]] = foovarbar=Object.create(foo);bar.three=3;bar.one;// 1bar.two;// 2bar.three;// 3

委托

在使用委托的基于原型的语言中,运行时语言可以仅仅通过循着一个序列的指针直到找到匹配这样的方式来定位属性或者寻找寻找正确的数据。所有这些创建行为共享的行为 需要的是委托指针。不像是基于类的面向对象语言中类和接口的关系,原型和他的分支之间的关系并不要求子对象有相似的内存结构,因为如此,子对象可以继续修改和...而无须像基于类的系统那样整理结构。还有一个要提到的地方是,不仅仅是数据,方法也能被修改。因为这个原因,大多数基于类型的语言把数据和方法提作“slots”。

关联

在纯粹的原型,又被称作 concatenative 原型(以 Kevo 语言为例)中没有到被复制的原型对象的指针或链接。原型对象以重新给定名字(或引用)的方式被确实的复制了。这个过程类似于生物学上的分裂,属性和方法被原样复制。

这样做的好处包括对象的作者可以修改这份副本而无须担心对此父类的其他子类产生副作用。进一步的优点是查找属性运算的消耗同授权相比大大降低了,授权查找必须遍历整个委托链才能判定不存在。

Concatenative 的坏处包括传播变化到整个系统的难度;如果一个变化作用到某个原型,它不会立即或者自动的对它的所有副本生效。然而Kevo提供了额外的在对象系统中传播变化的方式。这种方式是基于他们的相似性(所谓的 family 相似)而非像委托模型具有代表性的那样源自分类学。

另外一个坏处是在这个模型的大多数自然的实现下,每一个副本上都有额外的内存被浪费掉了(相对委托模型而言),因为副本和原型之间有相同的部分存在。然而,在共享的实现和后台数据中提供 concatenative 行为的编程编程是可行的。这种做法为 Kevo 所遵从。

批评

那些经常批评基于原型系统而支持基于类的对象模型的人通常有类似静态类型系统相对于动态类型系统的担心。通常这些担心是:正确性、安全性、可预测性以及效率。

在前三点上,类可以看作和类型等效(多数静态语言遵守此规则)而且提供保证他们实例的契约,而对这些实例的用户保证特定场景中的行为。

在最后一点上,效率,类的声明简化了编译器的组织,允许开发高效的方法以及实例变量查找。对Self语言来说,大多开发时间都消耗在开发、编译以及解释技术用以改进基于原型的系统相对于基于类的系统。举例来说 Lisaac 产生的代码速度几乎跟C一样快。测试是由 MPEG-2 编码器的 Lisaac 版本得出的,它由一个C语言版本复制而来。测试显示,Lisaac 版本比 C 版本慢1.9%,但代码行数少了37%。然而C语言并非面向对象语言,而是一个过程式语言。Lisaac 跟 C++ 版本相比可能更说明问题。

最普遍的对基于原型的语言的批评来自不喜欢它的软件开发者社区,仅管有 JavaScript 的人气和市场。对基于原型系统的了解程度似乎因为JavaScript 框架的广泛应用以及 JavaScript 针对 Web 2.0的复杂应用而改变。很可能由于这些原因,在 ECMAScript 标准的第四版开始寻求使 JavaScript 提供基于类的构造,且ECMAScript 第六版有提供"class"(类)作为原有的原型架构之上的语法糖,提供建构对象与处理继承时的另一种语法。

相关语言

ABCL: ABCL/1, ABCL/R, ABCL/R2, ABCL/c+

Agora

Cecil

Cel

ColdC

ECMAScript

Falcon

Io

Ioke

Lisaac

Logtalk

LPC

Lua

MOO

Neko

NewtonScript

Obliq

Object Lisp

Omega

OpenLaszlo

Perl, with the Class::Prototyped module

R, with the proto package

REBOL

Self

Seph

SmartFrog

TADS

Tclwith snit extension

参考来源

James Noble (ed.), Antero Taivalsaari (ed.), Ivan Moore (ed.) (编). Prototype-Based Programming: Concepts, Languages and Applications. Springer-Verlag. 1999. ISBN 981-4021-25-3. 

Abadi, Martin; Luca Cardelli. A Theory of Objects. Springer-Verlag. ISBN 0-387-94775-2. 

Class Warfare: Classes vs. Prototypes, by Brian Foote

Essential Object Oriented JavaScript, by Brian O"Dell


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· 极限编程
历史极限编程的创始者是肯特·贝克、沃德·坎宁安和罗恩·杰弗里斯(英语:RonJeffries),他们在为克莱斯勒综合报酬系统(英语:ChryslerComprehensiveCompensationSystem)的薪水册项目工作时提出了极限编程方法。肯特·贝克在1996年3月成为克莱斯勒系统的项目负责人,开始对项目的开发方法学进行改善。他写了一本关于这个改善后的方法学的书,并且于1999年10月将之发行,这就是《极限编程解析》(2005第二版出版)。克莱斯勒在2000年2月取消了实质上并未成功的克莱斯勒系统,但是这个方法学却一直流行在软件工程领域中。至今2006年,很多软件开发项目都一直以极限编程做为他们的指导方法学。该书阐述了如下的极限编程的哲学思想:一种社会性的变化机制一种开发模式一种改进的方法一种协调生产率和人性的尝试一种软件开发方法把极限编程一般化并用于其它类型的专案称为极限专案管...
· 基于原则设计
概览Policy的意思是方针,或策略,也就是将原本复杂的系统,拆解成多个独立运作的“策略类别”(policyclass),每一组policyclass都只负责单纯如行为(behavior,method)或结构(structure)的某一方面。Templetes与多重继承(MultipleInheritance)两项技术互补。多重继承由于继承自多组BaseClass,故缺乏型别消息(typeinformation),而Templetes基于型别,拥有丰富的型别消息。多重继承容易扩张,而Templetes的特化(Specialization)不容易扩张。Policy-BasedClassDesign同时使用了Template以及MultipleInheritance两项技术,结合两者的优点。PolicyBasedClass则称为宿主类别(hostclass),只需要切换不同PolicyClas...
· 编程范型
例子结构化编程对比非结构化编程命令式编程对比宣告式编程消息传递编程对比命令式编程程序编程对比函数式编程Value-levelprogramming对比Function-levelprogramming流程驱动编程对比事件驱动编程纯量编程对比阵列编程基于类编程对比基于原型编程(在面向对象编程的上下文中)Rule-basedprogramming对比Constraintprogramming(在逻辑编程的上下文中)基于组件编程(如OLE)面向方面编程(如AspectJ)符号式编程(如Mathematica)面向表格编程(如MicrosoftFoxPro)管道编程(如Unix命令中的管道)Post-objectprogramming面向主题编程自省编程或称反射编程参见ArsbasedprogrammingMemetics
· 编程语言
概论编程语言原本是被设计成专门使用在计算机上的,但它们也可以用来定义算法或者数据结构。正是因为如此,程序员才会试图使程序代码更容易阅读。编程语言往往使程序员能够比使用机器语言更准确地表达他们所想表达的目的。对那些从事计算机科学的人来说,懂得程序设计语言是十分重要的,因为在当今所有的计算都需要程序设计语言才能完成。目前发明了许多的编程语言,编程语言本身可能修改以匹配新需求,或是和其他的编程语言结合使用,尽管人们多次试图创造可以匹配所有需求的通用编程语言,但以“匹配所有需求”的标准来看,这些尝试都失败了。之所以有那么多种不同的编程语言存在的原因是,编写程序的初衷其实也各不相同;新手与老手之间技术的差距非常大,而且有许多语言对新手来说太难学;还有,不同程序之间的运行成本(runtimecost)各不相同。有许多用于特殊用途的语言,只在特殊情况下使用。例如,PHP专门用来显示网页;Perl更适合文...
· 逻辑编程
历史早在二十世纪七十年代,罗伯特·科瓦尔斯基(英语:RobertKowalski)等人提出了逻辑可以作为程序设计语言的基本思想,把逻辑和程序这两个截然不同的概念协调统一为一个概念,于是诞生了逻辑程序设计。这也是早期自动定理证明和人工智能发展的自然结果。随后,逻辑程序设计得到了迅速发展,特别是基于一阶谓词的逻辑程序设计语言,将逻辑推理对应于计算,具有丰富的表达能力、非确定性等特点,在定理机器证明、关系数据库系统、程序验证、模块化程序设计和非单调推理等都有了广泛的应用。

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信