面向对象的编程

面向对象的编程哎呀)是编程范式基于“对象”,可以包含数据代码。数据以字段(通常被称为属性或者特性),并且代码以程序的形式(通常称为方法)。

对象的一个共同特征是将过程(或方法)附加到它们上,并可以访问和修改对象的数据字段。在这个OOP品牌中,通常有一个特殊名称this或者self用于引用当前对象。在OOP中,计算机程序是通过使它们与彼此相互作用的对象进行设计的。[1][2]OOP语言是多种多样的,但最受欢迎的语言是基于课堂,这意味着对像是实例课程,这也决定了他们的类型.

许多使用最广泛的编程语言(例如C ++,Java,Python等)是多范式他们或多或少地支持面向对象的编程,通常结合至关重要的程序编程.

重要的面向对象的语言包括:艾达ActionScriptC ++常见的LISPC#埃菲尔Fortran 2003哈克斯爪哇JavaScript科特林标识MATLABObjective-C对象Pascal珀尔phpPythonr,raku红宝石ScalaSIMSScript模拟短暂聊天迅速瓦拉Visual Basic.net.

历史

课堂符号。此按钮类有变量用于数据,以及功能。通过继承可以创建子类作为按钮类的子集。对像是类的实例。

术语在现代面向对象的编程中调用“对象”和“面向”,首次出现在麻省理工学院在1950年代末和1960年代初。在环境中人工智能小组早在1960年就可以参考确定的项目(Lisp具有属性(属性)的原子);[3][4]艾伦·凯后来,对LISP内部的详细理解是对他在1966年的思想的强烈影响。[5]

我想到对象像网络上的生物单元格和/或单个计算机一样,只能与消息通信(因此,消息传递在一开始就来了 - 花了一段时间才能看到如何有效地使用编程语言进行消息传递,以便有用)。

艾伦·凯(Alan Kay),[5]

MIT的另一个早期例子是草图板由...制作伊万·萨瑟兰(Ivan Sutherland)1960 - 1961年;在1963年的技术报告的词汇表中,萨瑟兰(Sutherland)定义了“对象”和“实例”的概念(由“主”或“定义”所涵盖的类概念),尽管专门针对图形交互。[6]另外,麻省理工学院阿尔戈尔版本,AED-0,在数据结构(该方言中的“ plex”)和过程之间建立了直接链接,并预先建立了后来称为“消息”,“方法”和“成员函数”的内容。[7][8]

模拟引入了今天是面向对象编程的重要组成部分的重要概念,例如班级目的,继承和动态结合.[9]面向对象的模拟编程语言主要是由涉及的研究人员使用物理建模,例如研究和改善通过货物端口的船舶移动及其内容的模型。[9]

在1970年代,第一个版本短暂聊天编程语言是开发的Xerox Parc经过艾伦·凯丹·英格尔斯(Dan Ingalls)阿黛尔·戈德堡(Adele Goldberg)。SmallTalk-72包括一个编程环境,是动态键入,起初是解释, 不是编译。SmallTalk因其在语言级别及其图形开发环境中的对象取向而闻名。SmallTalk经历了各种版本和对语言的兴趣。[10]尽管SmallTalk受Simula 67中引入的想法的影响,但它旨在成为一个完全动态的系统,可以在其中动态创建和修改类。[11]

在1970年代,Smalltalk影响了LISP社区合并基于对象的技术通过LISP机器。对LISP的各种扩展的实验(例如循环和口味介绍多元继承混合物)最终导致了常见的LISP对象系统,它集成了功能编程和面向对象的编程,并允许通过元观察协议。在1980年代,有一些尝试设计处理器体系结构,其中包括对内存中对象的硬件支持,但它们并不成功。示例包括英特尔IAPX 432Linn Smartrekursiv.

1981年,戈德堡编辑了八月号的字节杂志,向更广泛的受众介绍Smalltalk和面向对象的编程。1986年,计算机协会组织第一个关于面向对象的编程,系统,语言和应用程序会议(OOPSLA),有1000人意外参加。在1980年代中期Objective-C是由布拉德·考克斯,谁在ITT Inc., 和Bjarne Stroustrup,他曾使用Simula进行博士学位论文,最终去创建了面向对象的C ++.[10]1985年贝特兰·迈耶(Bertrand Meyer)还制作了第一个设计埃菲尔语。Eiffel专注于软件质量,是一种纯粹是面向对象的编程语言,也是支持整个软件生命周期的符号。迈耶(Meyer)根据软件工程和计算机科学的少数关键思想描述面向对象的软件构建。迈耶的可靠性机制是艾菲尔的质量重点至关重要的通过合同设计,这是方法和语言的组成部分。

Tiobe编程语言普及指数从2002年到2018年。在2000年代,面向对象爪哇(绿色)和程序C(黑色)争夺最高位置。

在1990年代初期和中期,以对象为导向的编程作为主要的编程开发范例当支持这些技术的编程语言被广泛使用时。这些包括视觉Foxpro3.0,[12][13][14]C ++[15]德尔菲。通过上升的普及进一步提高了其主导地位图形用户界面,这很大程度上依赖于面向对象的编程技术。可以在可可框架Mac OS X,写在Objective-C,基于SmallTalk的面向对象的,动态的消息传递扩展。OOP工具包也提高了事件驱动的编程(尽管这个概念不仅限于OOP)。

苏黎世EthNiklaus Wirth他的同事们也一直在调查数据抽象模块化编程(尽管这在1960年代或更早的时候就经常使用)。模量-2(1978年)包括两者,其成功设计,奥伯隆,包括一种独特的方法,用于对象取向,类等。

面向对象的功能已添加到许多以前现有的语言中,包括艾达基本的Fortran帕斯卡, 和COBOL。将这些功能添加到最初不是为其设计的语言中,通常会导致兼容性和可维护性的问题。

最近,出现了许多主要面向对象的语言,但也与程序方法兼容。两种这样的语言是Python红宝石。可能最重要的最近面向对象的语言是爪哇, 由开发太阳微型系统, 也C#Visual Basic.net(vb.net),均为Microsoft的设计。网平台。这两个框架中的每一个都以自己的方式显示了通过从实施中创建抽象来使用OOP的好处。VB.NET和C#支持跨语言的继承,允许以一种语言定义的类以在另一种语言中定义的类别类。

特征

面向对象的编程使用对象,但并非所有相关的技术和结构都直接支持声称支持OOP的语言。它在操作数上执行操作。下面列出的功能在被认为是强烈的类和对象的语言中很常见(或多范式在OOP支持的情况下),有明显的例外。[16][17][18][19]

与非oop语言共享

模块化编程支持提供了为组织目的将程序和模块分组到文件和模块中的能力。模块是名称空间因此,一个模块中的标识符不会与另一个文件或模块中共享同名的过程或变量相冲突。

对象和类

支持面向对象的编程(OOP)的语言通常使用遗产用于代码重复使用和可扩展性的形式课程或者原型。那些使用类的人支持两个主要概念:

  • 课程 - 数据格式的定义和给定类型或对像类的可用过程;也可能包含数据和过程(称为类方法)本身,即类包含数据成员和成员功能
  • 对象 - 课程实例

物体有时与现实世界中发现的事物相对应。例如,图形程序可能具有“圆”,“正方形”,“菜单”之类的对象。在线购物系统可能具有“购物车”,“客户”和“产品”之类的对象。[20]有时对象表示更抽象的实体,例如代表打开文件的对象,或提供将测量结果从美国习惯转换为度量的对象。

据说每个对像都是实例特定类(例如,将其名称字段设置为“玛丽”的对象可能是班级员工的一个实例)。面向对象的编程中的程序被称为方法;变量也称为字段,成员,属性或属性。这导致以下术语:

  • 类变量 - 属于整个课程;每个副本只有一个
  • 实例变量或属性 - 属于个人的数据对象;每个对像都有每个对象的副本
  • 成员变量 - 指由特定类定义的类和实例变量
  • 类方法 - 属于整个课程并且只能从过程调用中访问类变量和输入
  • 实例方法 - 属于单个对象,并且可以访问他们所调用的特定对象,输入和类变量的实例变量

访问对像有点像具有复杂内部结构的变量,并且在许多语言中有效地有效指针,用作对堆或堆栈中内存中所述对象的单个实例的实际引用。他们提供了一层抽象可用于将内部与外部代码分开。外部代码可以通过调用具有一组输入参数的特定实例方法来使用对象,读取实例变量或写入实例变量。对像是通过调用一种特殊类型的方法来创建的,该类别被称为构造函数。一个程序可能会创建与运行同一类的许多实例,该实例独立运行。这是将相同过程用于不同数据集的简便方法。

使用类的面向对象的编程有时被调用基于班级的编程, 尽管基于原型的编程通常不使用类。结果,使用显著不同但类似的术语来定义目的实例.

在某些语言中,可以使用其他概念来组成类和对象特质混合物.

基于班级的原型

基于课堂的语言课程事先定义了对象根据类实例化。如果两个对象苹果从班级实例化水果,它们是天生的水果,可以保证您可以以相同的方式处理它们。例如程序员可以期望存在相同属性,例如颜色或者sugar_content或者is_ -ripe.

基于原型的语言对象是主要实体。不课程甚至存在。这原型一个对像只是链接对象的另一个对象。每个对像都有一个原型链接(只有一个)。可以基于选择作为其原型的已经存在的对象创建新对象。您可以调用两个不同的对象苹果水果,如果物体水果存在,两者都苹果水果作为他们的原型。这个想法水果班级不明确存在,但等效类共享相同原型的对象。的属性和方法原型委派对于本原型定义的等价类别的所有对象。属性和方法拥有同一等价类的其他对像不得共享对象的单独共享;例如属性sugar_content可能意外地不存在苹果。仅有的单个继承可以通过原型实现。

动态调度/消息传递

对象(而不是任何外部代码)选择要响应方法调用的过程代码,通常是通过在与对象关联的表中的表格中查找该方法,这是对对象进行执行的过程代码的责任。此功能称为动态调度。如果呼叫的可变性比其所谓的对象的单一类型(即,方法选择中都涉及至少一个其他参数对象),那么一个人说多次调度.

方法调用也称为消息传递。它被概念化为消息(方法及其输入参数的名称)被传递给对象进行调度。

数据抽象

数据抽像是一种设计模式,其中数据仅在语义相关的功能上可见,以防止滥用。数据抽象的成功导致经常合并数据隐藏作为面向对象和纯粹功能编程的设计原理。

如果类不允许调用代码访问内部对像数据并仅允许通过方法访问,则这是一种信息隐藏的一种形式抽象。某些语言(例如,Java)让类明确执行访问限制,例如用私人的关键字和指定旨在由班级外部代码使用的方法上市关键词。方法还可以设计公共,私人或中级级别,例如受保护(它允许从同一类及其子类访问,但不能从其他类的对象访问)。在其他语言中(例如Python),这仅是由惯例强制执行的(例如,私人的方法可能具有以下划线)。

封装

封装防止外部代码关注对象的内部工作。这有助于代码重构例如,允许班级的作者更改该类的对像在内部表示其数据的方式而无需更改任何外部代码(只要“公共”方法调用以相同的方式工作)。它还鼓励程序员将所有与同一类中的一组数据相关的代码放置,该代码可组织其他程序员的理解。封装是一种鼓励的技术脱钩.

组成,继承和委派

对象可以在其实例变量中包含其他对象;这被称为对象组成。例如,除了其自己的实例变量之外,员工类中的对象可能包含(直接或通过指针)在地址类中的对象。对象组成用于表示“ has-a”关系:每个员工都有一个地址,因此每个员工对像都可以访问一个存储地址对象的地方(要幺直接嵌入在自身内部,要幺在通过指针地址的单独位置中)。

支持课程的语言几乎总是支持遗产。这允许在代表“ is-a-a type”关系的层次结构中安排类。例如,班级员工可能会从班级人那里继承。父母可以使用的所有数据和方法也出现在带有相同名称的子类中。例如,班级人员可能会定义变量“ first_name”和“ last_name with Method” make_full_name()。这些也将在班级员工中提供,这可能会添加变量“职位”和“薪金”。除了可能以直观的方式反映现实世界的关系外,该技术允许轻松地重复使用相同的过程和数据定义。开发人员没有使用数据库表和编程子例程,而是利用用户可能更熟悉的对象:来自其应用程序域中的对象。[21]

子类可以覆盖超类定义的方法。多元继承以某些语言允许,尽管这可能会使解决方案变得复杂。有些语言对混合物,尽管在任何具有多种继承的语言中,Mixin只是一个不代表IS-A型关系的类。混合素通常用于在多个类中添加相同的方法。例如,类Unicodeconversionmixin类可能会提供一种方法Unicode_to_ascii(),当包含在类fileReader和类WebPages Craper中时,这些方法不共享共同的父母。

抽像类不能实例化成对象;它们仅出于可以实例化的其他“具体”类的继承而存在。在Java,最后可以使用关键字来防止课程分类。

学说关于继承的组成提倡使用构图而不是继承实施has-a关系的倡导者。例如,班级员工可以使每个员工对象成为内部人物对象,而不是从班级人员那里继承,即使班级人员有许多公共属性或方法,它也有机会隐藏外部代码。一些语言,喜欢完全不支持继承。

这 ”开/关“倡导课程和功能”应开放以进行扩展,但要修改”。

代表团是可以用作继承的另一种语言功能。

多态性

亚型 - 一种形式多态性 - 当调用代码可以独立于其正在运行的受支持层次结构中的哪个类 - 父类或其后代之一。同时,继承层次结构中对象之间的相同操作名称的行为可能有所不同。

例如,类型圆和平方的对像源自称为Shape的普通类。每种类型的形状的绘制功能都实现了绘制自身所必需的东西,而调用代码可能对所绘制的特定类型的形状无关。

这是另一种抽象,简化了类层次结构外部的代码并实现强大关注点分离.

开放递归

用支持的语言开放递归,对象方法可以在同一对像上调用其他方法(包括自己),通常使用称为的特殊变量或关键字这个或者自己。这个变量是后来;它允许在一个类中定义的方法调用以后定义的另一个方法,其中某个子类在其中定义。

OOP语言

模拟(1967年)通常被认为是具有面向对象语言的主要特征的第一语言。它是为了制作而创建的仿真程序,其中所谓的对像是最重要的信息表示。短暂聊天(1972年至1980年)是另一个早期的例子,并且开发了许多OOP理论。关于对象取向的程度,可以进行以下区别:

动态语言中的oop

近年来,面向对象的编程在动态编程语言.Python电源外壳红宝石groovy是基于OOP原则的动态语言,而珀尔php从Perl 5和PHP 4开始添加面向对象的功能,以及冷灌注由于版本6。

文档对像模型htmlXHTML, 和XML互联网上的文档对受欢迎JavaScript/eCMAScript语言。JavaScript也许是最著名的基于原型的编程语言,它采用了从原型而不是从班级继承的克隆(与基于班级的编程)。采用这种方法的另一种脚本语言是卢阿.

网络协议中的oop

计算机之间流动以在客户端服务器环境中请求服务的消息可以设计为由客户端和服务器已知的类对象定义的对象的线性化。例如,一个简单的线性化对象将由一个长度字段组成,代码点标识了类和数据值。一个更复杂的示例将是一个命令,由命令的长度和代码点组成,由代表命令参数的线性化对象组成。每个这样的命令必须由服务器指向其类(或超类)识别命令并能够提供请求的服务的对象。客户和服务器最好将其建模为复杂的面向对象的结构。分布式数据管理体系结构(DDM)采用了这种方法,并使用类对像在四个正式层次结构的四个层面上定义对象:

  • 定义形成消息的数据值的字段,例如其长度,代码点和数据值。
  • 对象和对象的集合,类似于在短暂聊天消息和参数程序。
  • 经理类似IBM我对象,例如由元数据和记录组成的文件和文件目录。经理在概念上为其包含的对象提供内存和处理资源。
  • 由实施完整处理环境所需的所有经理组成的客户或服务器,支持目录服务,安全性和并发控制等方面。

DDM定义的分布式文件服务的初始版本。后来扩展为分布式关系数据库体系结构(DRDA)。

设计模式

几种方法解决了面向对象设计的挑战。最常见的是设计模式由伽马编纂等。。更广泛地说,术语“设计模式“可用于将任何一般,可重复的解决方案模式转介到软件设计中通常发生的问题。这些常见问题中的一些问题具有针对面向对象的开发的含义和解决方案。

继承和行为亚型

直观地假设继承创造了语义"是一个“关系,从而推断从子类实例化的对象总是可以是安全代替从超级类实例化的那些。不幸的是,这种直觉在大多数OOP语言中都是错误的,尤其是所有允许的人可变对象。亚型多态性就像由类型检查器用OOP语言(具有可变的物体)无法保证行为亚型在任何情况下。行为亚型通常是不确定的,因此程序(编译器)不能实施。考虑到无法句法检测的可能的错误用途,必须仔细设计类或对象层次结构。这个问题被称为Liskov替代原则.

团伙四个设计模式

设计模式:可重复使用的面向对象软件的元素是一本有影响力的书,于1994年出版埃里希·伽玛(Erich Gamma)理查德·赫尔姆(Richard Helm)拉尔夫·约翰逊, 和约翰·弗里西德(John Vlissides),经常被幽默地称为“四个帮派”。除了探索面向对象的编程的功能和陷阱外,它还描述了23个常见的编程问题和解决方案的模式。截至2007年4月,这本书是第36印刷的。

该书描述了以下模式:

对象方向和数据库

两者都是面向对象的编程和关系数据库管理系统(RDBMSS)在当今的软件中非常普遍。自从关系数据库不要直接存储对象(尽管有些RDBMS具有面向对象的功能来近似),但通常需要桥接这两个世界。与关系数据库桥接面向对象的编程访问和数据模式的问题被称为对象相关阻抗不匹配。有多种应对此问题的方法,但是没有弊端就没有一般解决方案。[23]最常见的方法之一是对象相关映射,如在IDE语言,例如Visual Foxpro和图书馆,例如Java数据对象红宝石在轨道上'activerecord。

也有对像数据库可以用来替换RDBMS,但是这些在技术和商业上并不像RDBMS那么成功。

现实世界建模和关系

OOP可用于将现实世界对象和进程与数字对应物相关联。但是,并非所有人都同意OOP促进直接现实世界的映射(请参阅批评部分)或现实世界地图甚至是一个值得的目标;贝特兰·迈耶(Bertrand Meyer)争论面向对象的软件构建[24]一个程序不是世界的典范,而是世界某些地区的模型。“现实是两次堂兄”。同时,已经注意到了OOP的一些主要限制。[25]例如,圆圈问题使用OOP的概念很难处理遗产.

然而,Niklaus Wirth(谁普及了现在被称为的格言沃思定律:“软件的速度比硬件速度慢得多”)关于OOP在他的论文中说:“通过看玻璃的好创意”,“这种范式密切反映了现实世界中系统'的结构',因此它是非常适合模拟具有复杂行为的复杂系统”[26](对比吻原理)。

史蒂夫·耶格(Steve Yegge)其他人指出,自然语言缺乏严格优先级的OOP方法事物(对象/名词) 前动作(方法/动词)。[27]与程序编程相比,此问题可能导致OOP遭受更复杂的解决方案。[28]

OOP和控制流

开发了OOP来增加可重复使用可维护性源代码。[29]透明表示控制流没有优先级,本来可以由编译器处理。随着并行硬件的越来越多的相关性多线程编码,开发透明的控制流变得更加重要,而OOP很难实现。[30][31][32][33]

责任 - 与数据驱动的设计

责任驱动的设计根据合同定义类,也就是说,应围绕责任及其共享的信息定义类。这是由Wirfs-Brock和Wilkerson与数据驱动的设计,围绕必须持有的数据结构定义课程。作者认为,责任驱动的设计是可取的。

固体和掌握指南

坚硬的是迈克尔·菲瑟(Michael Feathers)发明的助记符,阐明了五个软件工程设计原则:

抓牢(一般责任分配软件模式)是另一套指南克雷格·拉曼(Craig Larman).

批评

OOP范式因多种原因而受到批评,包括未达到其可重复使用和模块化的既定目标,[34][35]并以其他重要方面(计算/算法)为代价过度强调软件设计和建模(数据/对象)的一个方面。[36][37]

卢卡·卡德利(Luca Cardelli)声称OOP代码比程序代码“本质上的效率更低”,OOP可能需要更长的编译,并且OOP语言“相对于班级扩展和修改,模块化属性极为差”,并且往往非常复杂。[34]后一点由乔·阿姆斯特朗,主要发明家Erlang,引用的话说:[35]

面向对象的语言的问题在于他们拥有随身携带的所有隐性环境。您想要一个香蕉,但您得到的是一颗拿着香蕉和整个丛林的大猩猩。

Potok等人的研究。OOP和程序方法之间的生产率没有显著差异。[38]

克里斯托弗·J·约会指出,由于缺乏对OOP的约定和严格的定义,因此很难将OOP与其他技术进行批判性比较,尤其是关系。[39]但是,Date和Darwen在OOP上提出了一个理论基础,该基础使用OOP作为一种可自定义的基础类型系统支持RDBMS.[40]

劳伦斯·克鲁伯纳(Lawrence Krubner)在一篇文章中声称,与其他语言(LISP方言,功能性语言等)相比,OOP语言没有独特的优势,并给不需要的复杂性带来了沉重的负担。[41]

亚历山大·史蒂芬诺夫(Alexander Stepanov)将对象取向不利地比较通用编程[36]

我发现从技术上讲OOP。它试图以一种在单一类型上变化的接口来分解世界。为了解决真正的问题,您需要多个代数 - 跨越多种类型的接口家族。我发现OOP从哲学上不健全。它声称一切都是对象。即使是真的,也不是很有趣 - 说一切都是一个对像根本没有说什么。

保罗·格雷厄姆(Paul Graham)OOP在大型公司中的受欢迎程度是由于“大型(且经常变化的)平庸的程序员”所致。根据格雷厄姆(Graham)的说法,OOP施加的纪律阻止了任何一个程序员“造成太多损害”。[42]

狮子座布罗迪(Leo Brodie重复代码[43]违反不要重复自己原则[44]软件开发。

史蒂夫·耶格(Steve Yegge)指出,而不是功能编程[45]

面向对象的编程将名词放在首位。您为什么要竭尽全力将演讲的一部分放在基座上?为什么一种概念应该优先于另一个概念?好像OOP突然使动词在我们实际思考的方式上变得不那么重要。这是一个奇怪的偏见的观点。

Rich Hickey,创建者克洛杰尔,将对象系统描述为现实世界中过于简单的模型。他强调了OOP无法正确建模时间,随着软件系统变得更加同时发生,这变得越来越困难。[37]

埃里克·雷蒙德(Eric S. Raymond), 一个Unix程序员和开源软件倡导者批评主张将面向对象的编程作为“一个真实的解决方案”,并写道面向对象的编程语言倾向于鼓励较厚的分层程序破坏透明度。[46]雷蒙德(Raymond)与Unix和Unix和C编程语言.[46]

罗布·派克(Rob Pike),参与创建的程序员UTF-8,称为面向对象的编程罗马数字计算”[47]并说OOP语言经常将重点从数据结构算法类型.[48]此外,他引用了一个实例爪哇教授的“惯用性”解决方案是创建六个新类,而不是简单地使用查找表.[49]

关于继承,鲍勃·马丁指出,由于它们是软件,因此相关类不一定会分享其代表事物的关系。[50]

正式语义

对像是面向对象的系统中的运行时实体。它们可以代表一个人,一个地方,银行帐户,数据表或该程序必须处理的任何项目。

已经有多次尝试将面向对象的编程中使用的概念形式化。以下概念和结构已被用作OOP概念的解释:

试图找到对象背后的共识定义或理论并未证明非常成功(但是,请参见Abadi&Cardelli,物体理论[52]对于许多OOP概念和构造的形式定义),并且通常会广泛分歧。例如,某些定义侧重于心理活动,有些定义用于程序结构。更简单的定义之一是,OOP是使用“映射”数据结构或数组的行为,可以包含函数和指针到其他地图,所有这些都带有某些句法和范围糖在上面。可以通过克隆地图(有时称为“原型”)来执行继承。

也可以看看

系统

建模语言

参考

  1. ^Kindler,E。;Krivy,I。(2011)。“具有复杂控制的系统的面向对象的模拟”。国际通用系统杂志:313–343。{{}}引用期刊需要|journal=帮助
  2. ^刘易斯,约翰; Loftus,William(2008)。编程设计的Java软件解决方案基础第六版。皮尔森教育公司ISBN 978-0-321-53205-3.,第1.6节“面向对象的编程”
  3. ^麦卡锡(J。);布雷顿,R。爱德华兹(Edwards)福克斯,P。霍德斯,L。Luckham,D。; Maling,K。;公园,D。罗素,S。(1969年3月)。“ LISP I程序员手册”(PDF).波士顿马萨诸塞州:人工智能小组,M.I.T.计算中心和研究实验室:88F。存档原本的(PDF)2010年7月17日。在当地的M.I.T.Patois,[原子符号]的关联列表也称为“属性列表”,有时称为“对象”。{{}}引用期刊需要|journal=帮助
  4. ^麦卡锡,约翰;亚伯拉罕,保罗·W。爱德华兹(Edwards),丹尼尔(Daniel J。);Hart,Swapnil d。;莱文(Levin),迈克尔(Michael I.)(1962)。LISP 1.5程序员手册.麻省理工学院出版社。 p。105.ISBN 978-0-262-13011-0.对象 - 原子符号的同义词
  5. ^一个b“艾伦·凯博士对“面向对象的编程”的含义"。 2003。检索2月11日2010.
  6. ^Sutherland,I。E.(1963年1月30日)。“素描板:人机图形通信系统”。技术报告第296号,马萨诸塞州林肯实验室,通过国防技术信息中心(stinet.dtic.mil)。存档原本的2013年4月8日。检索7月17日2019.
  7. ^模拟语言的发展,克里斯汀·尼加德(Kristen Nygaard)Ole-Johan Dahl,第254页uni-kl.ac.at
  8. ^罗斯,道格。“第一种软件工程语言”.LCS/AI实验室时间轴。麻省理工学院计算机科学和人工智能实验室。检索5月13日2010.
  9. ^一个bHolmevik,Jan Rune(1994)。“汇编模拟:技术起源的历史研究”(PDF).IEEE计算历史.16(4):25–37。doi10.1109/85.329756.S2CID 18148999。存档原本的(PDF)2017年8月30日。检索3月3日2018.
  10. ^一个bBertrand Meyer(2009)。班级的触摸:学会与对象和合同进行很好的编程。Springer科学与商业媒体。p。329。Bibcode2009TCLP.Book ..... m.ISBN 978-3-540-92144-8.
  11. ^凯,艾伦。“ Smalltalk的早期历史”。存档原本的2008年7月10日。检索9月13日2007.
  12. ^1995(6月)视觉Foxpro3.0,FoxPro从程序语言发展到面向对象的语言。Visual FoxPro 3.0介绍了数据库容器,无缝客户端/服务器功能,对ActiveX Technologies的支持以及OLE自动化和NULL支持。狐狸发行的摘要
  13. ^FOXPRO历史网站:foxprohistory.org
  14. ^1995年审稿人Visual FoxPro 3.0指南:dfpug.de
  15. ^库拉纳(Khurana),罗希特(2009年11月1日)。带有C ++的面向对象的编程,1E.ISBN 978-81-259-2532-3.
  16. ^Deborah J. Armstrong。面向对象的开发的夸克。对近40年的计算文献进行了调查,该调查确定了大多数OOP定义中发现的许多基本概念,以降序的流行顺序:继承,对象,阶级,封装,方法,消息传递,多态性和抽象。
  17. ^约翰·米切尔(John C. Mitchell)编程语言的概念,剑桥大学出版社,2003年,ISBN0-521-78098-5,第278页。列表:动态调度,抽象,亚型多态性和继承。
  18. ^迈克尔·李·斯科特(Michael Lee Scott),编程语言语用学,第2版,摩根·考夫曼(Morgan Kaufmann),2006年,ISBN0-12-633951-1,p。470.列表封装,继承和动态调度。
  19. ^皮尔斯,本杰明(2002)。类型和编程语言。麻省理工学院出版社。ISBN 978-0-262-16209-8.,第18.1节“什么是面向对象的编程?”列表:动态调度,封装或多方法(多次调度),亚型多态性,继承或委托,开放式递归(“ this“/“ self”))
  20. ^Booch,Grady(1986)。与ADA的软件工程。艾迪生·卫斯理。 p。 220。ISBN 978-0-8053-0608-8.以对象为导向的开发方法的最大优势是,它提供了一种捕获现实世界模型的机制。
  21. ^雅各布森,伊瓦尔;马格努斯·克里斯特森(Magnus Christersson)帕特里克·琼森(Patrik Jonsson);Gunnar Overgaard(1992)。面向对象的软件工程。 Addison-Wesley ACM出版社。 pp。43–69.ISBN 978-0-201-54435-0.
  22. ^“翡翠编程语言”。 2011年2月26日。
  23. ^纽纳德,泰德(2006年6月26日)。“计算机科学的越南”。发生互操作性。存档原本的2006年7月4日。检索6月2日2010.
  24. ^迈耶,第二版,第1页。 230
  25. ^M.Trofimov,OOOP - 第三个“ O”解决方案:打开OOP。头等舱,我的天啊,1993年,第1卷3,第3期,第14页。
  26. ^沃思,尼克劳斯(2006)。“好主意,透过镜子”(PDF).计算机.39(1):28–39。doi10.1109/MC.2006.20.S2CID 6582369。存档原本的(PDF)2016年10月12日。检索10月2日2016.
  27. ^Yegge,史蒂夫(2006年3月30日)。“名词王国处决”。 steve-yegge.blogspot.com。检索7月3日2010.
  28. ^蒂莫西(2009年6月11日)Boronczyk。“ OOP怎么了”。 zaemis.blogspot.com。检索7月3日2010.
  29. ^阿姆布勒,斯科特(1998年1月1日)。“对面向对象的重复使用的现实看”。 drdobbs.com。检索7月4日2010.
  30. ^雪莉,ASAF(2008年8月22日)。“面向对象建模的缺陷”。英特尔软件网络。检索7月4日2010.
  31. ^贾斯汀·詹姆斯(2007年10月1日)。“多线程是动词,而不是名词”。 TechRepublic.com。存档原本的2007年10月10日。检索7月4日2010.
  32. ^雪莉,ASAF(2008年8月22日)。“如何:多核编程(多处理)视觉C ++类设计指南,成员函数”。 support.microsoft.com。检索7月4日2010.
  33. ^罗伯特·哈珀(Robert Harper)(2011年4月17日)。“关于教授FP的一些想法”。存在类型的博客。检索12月5日2011.
  34. ^一个bCardelli,卢卡(1996)。“面向对象的语言的不良工程特性”.ACM计算。幸存.28(4ES):150 – Es。doi10.1145/242224.242415.ISSN 0360-0300.S2CID 12105785。检索4月21日2010.
  35. ^一个b阿姆斯特朗,乔。在工作中的编码人员:对编程技巧的思考。彼得·塞贝尔(Peter Seibel)编辑。codersatwork.com存档2010年3月5日在Wayback Machine,2009年11月13日访问。
  36. ^一个bStepanov,亚历山大.“ Stlport:对A. Stepanov的采访”。检索4月21日2010.
  37. ^一个bRich Hickey,JVM语言峰会2009 Keynote,我们到了吗?2009年11月。
  38. ^波托克,托马斯;姆拉登·瓦克(Mladen Vouk);Andy Rindos(1999)。“在商业环境中开发的面向对象软件的生产力分析”(PDF).软件:练习和经验.29(10):833–847。doi10.1002/(SICI)1097-024X(199908)29:10 <833 :: AID-SPE258> 3.0.co; 2-P.S2CID 57865731。检索4月21日2010.
  39. ^C. J. Date,数据库系统简介,第六版,第650页
  40. ^C. J. Date,休·达尔文。未来数据库系统的基础:第三宣言(第二版)
  41. ^克鲁伯纳,劳伦斯。“面向对象的编程是一场昂贵的灾难,必须结束”。 smashcompany.com。存档原本的2014年10月14日。检索10月14日2014.
  42. ^格雷厄姆,保罗.“为什么ARC不是特别面向对象”。 paulgraham.com。检索11月13日2009.
  43. ^布罗迪(Brodie),狮子座(1984)。思考(PDF)。第92–93页。检索5月4日2018.
  44. ^亨特,安德鲁。“不要重复自己”.类别极限编程。检索5月4日2018.
  45. ^“ Stevey的博客咆哮:名词王国处决”。检索5月20日2020.
  46. ^一个b埃里克·雷蒙德(Eric S. Raymond)(2003)。“ Unix编程的艺术:UNIX和面向对象的语言”。检索8月6日2014.
  47. ^派克,罗布(2004年3月2日)。“ [9fans]回复:线程:将荣誉徽章缝制到内核上”.comp.os.plan9(邮件列表)。检索11月17日2016.
  48. ^派克,罗布(2012年6月25日)。“更少的是指数级”。检索10月1日2016.
  49. ^派克,罗布(2012年11月14日)。“几年前我看到了此页”。存档原本的2018年8月14日。检索10月1日2016.
  50. ^“鲍勃叔叔坚实的原则”.YouTube.
  51. ^民意调查,埃里克。“分类数据类型的亚型和继承”(PDF)。检索6月5日2011.
  52. ^一个b阿巴迪,马丁; Cardelli,Luca(1996)。物体理论。 Springer-Verlag New York,Inc。ISBN 978-0-387-94775-4。检索4月21日2010.

进一步阅读

外部链接