面向对象的编程
面向对象的编程(哎呀)是编程范式基于“对象”,可以包含数据和代码。数据以字段(通常被称为属性或者特性),并且代码以程序的形式(通常称为方法)。
对象的一个共同特征是将过程(或方法)附加到它们上,并可以访问和修改对象的数据字段。在这个OOP品牌中,通常有一个特殊名称this
或者self
用于引用当前对象。在OOP中,计算机程序是通过使它们与彼此相互作用的对象进行设计的。[1][2]OOP语言是多种多样的,但最受欢迎的语言是基于课堂,这意味着对像是实例的课程,这也决定了他们的类型.
许多使用最广泛的编程语言(例如C ++,Java,Python等)是多范式他们或多或少地支持面向对象的编程,通常结合至关重要的,程序编程.
重要的面向对象的语言包括:艾达,ActionScript,C ++,常见的LISP,C#,镖,埃菲尔,Fortran 2003,哈克斯,爪哇,JavaScript,科特林,标识,MATLAB,Objective-C,对象Pascal,珀尔,php,Python,r,raku,红宝石,Scala,SIMSScript,模拟,短暂聊天,迅速,瓦拉和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 432和Linn Smartrekursiv.
1981年,戈德堡编辑了八月号的字节杂志,向更广泛的受众介绍Smalltalk和面向对象的编程。1986年,计算机协会组织第一个关于面向对象的编程,系统,语言和应用程序会议(OOPSLA),有1000人意外参加。在1980年代中期Objective-C是由布拉德·考克斯,谁在ITT Inc., 和Bjarne Stroustrup,他曾使用Simula进行博士学位论文,最终去创建了面向对象的C ++.[10]1985年贝特兰·迈耶(Bertrand Meyer)还制作了第一个设计埃菲尔语。Eiffel专注于软件质量,是一种纯粹是面向对象的编程语言,也是支持整个软件生命周期的符号。迈耶(Meyer)根据软件工程和计算机科学的少数关键思想描述面向对象的软件构建。迈耶的可靠性机制是艾菲尔的质量重点至关重要的通过合同设计,这是方法和语言的组成部分。
在1990年代初期和中期,以对象为导向的编程作为主要的编程开发范例当支持这些技术的编程语言被广泛使用时。这些包括视觉Foxpro3.0,[12][13][14]C ++,[15]和德尔菲。通过上升的普及进一步提高了其主导地位图形用户界面,这很大程度上依赖于面向对象的编程技术。可以在可可框架Mac OS X,写在Objective-C,基于SmallTalk的面向对象的,动态的消息传递扩展。OOP工具包也提高了事件驱动的编程(尽管这个概念不仅限于OOP)。
在苏黎世Eth,Niklaus 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)的语言通常使用遗产用于代码重复使用和可扩展性的形式课程或者原型。那些使用类的人支持两个主要概念:
物体有时与现实世界中发现的事物相对应。例如,图形程序可能具有“圆”,“正方形”,“菜单”之类的对象。在线购物系统可能具有“购物车”,“客户”和“产品”之类的对象。[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理论。关于对象取向的程度,可以进行以下区别:
- 语言称为“纯” OO语言,因为其中的所有内容都被视为对象,从字符和标点符号等原始内容,一直到整个类,原型,块,模块等。甚至强制执行,OO方法。例子:红宝石,Scala,短暂聊天,埃菲尔,翠,[22]玉,自己,raku.
- 语言主要用于OO编程,但具有一些程序元素。例子:爪哇,Python,C ++,C#,德尔菲/对象Pascal,vb.net.
- 历史上的语言程序语言,但已有一些OO功能扩展。例子:php,珀尔,视觉基本(源自基本),MATLAB,COBOL 2002,Fortran 2003,ABAP,ADA 95,帕斯卡.
- 具有对象的大多数特征(类,方法,继承)的语言,但具有明显的原始形式。例子:奥伯隆(Oberon-1或Oberon-2)。
- 语言抽像数据类型可用于类似于OO编程的支持,但没有对象取向的所有功能。这包括目的-基于和基于原型语言。例子:JavaScript,卢阿,模量-2,克鲁.
- 支持多种范式的变色龙语言,包括OO。TCL在其中脱颖而出的TCLOO,这是一种支持两者的混合对象系统基于原型的编程和基于班级的OO。
动态语言中的oop
近年来,面向对象的编程在动态编程语言.Python,电源外壳,红宝石和groovy是基于OOP原则的动态语言,而珀尔和php从Perl 5和PHP 4开始添加面向对象的功能,以及冷灌注由于版本6。
这文档对像模型的html,XHTML, 和XML互联网上的文档对受欢迎JavaScript/eCMAScript语言。JavaScript也许是最著名的基于原型的编程语言,它采用了从原型而不是从班级继承的克隆(与基于班级的编程)。采用这种方法的另一种脚本语言是卢阿.
网络协议中的oop
计算机之间流动以在客户端服务器环境中请求服务的消息可以设计为由客户端和服务器已知的类对象定义的对象的线性化。例如,一个简单的线性化对象将由一个长度字段组成,代码点标识了类和数据值。一个更复杂的示例将是一个命令,由命令的长度和代码点组成,由代表命令参数的线性化对象组成。每个这样的命令必须由服务器指向其类(或超类)识别命令并能够提供请求的服务的对象。客户和服务器最好将其建模为复杂的面向对象的结构。分布式数据管理体系结构(DDM)采用了这种方法,并使用类对像在四个正式层次结构的四个层面上定义对象:
- 定义形成消息的数据值的字段,例如其长度,代码点和数据值。
- 对象和对象的集合,类似于在短暂聊天消息和参数程序。
- 经理类似IBM我对象,例如由元数据和记录组成的文件和文件目录。经理在概念上为其包含的对象提供内存和处理资源。
- 由实施完整处理环境所需的所有经理组成的客户或服务器,支持目录服务,安全性和并发控制等方面。
DDM定义的分布式文件服务的初始版本。后来扩展为分布式关系数据库体系结构(DRDA)。
设计模式
几种方法解决了面向对象设计的挑战。最常见的是设计模式由伽马编纂等。。更广泛地说,术语“设计模式“可用于将任何一般,可重复的解决方案模式转介到软件设计中通常发生的问题。这些常见问题中的一些问题具有针对面向对象的开发的含义和解决方案。
继承和行为亚型
直观地假设继承创造了语义"是一个“关系,从而推断从子类实例化的对象总是可以是安全代替从超级类实例化的那些。不幸的是,这种直觉在大多数OOP语言中都是错误的,尤其是所有允许的人可变对象。亚型多态性就像由类型检查器用OOP语言(具有可变的物体)无法保证行为亚型在任何情况下。行为亚型通常是不确定的,因此程序(编译器)不能实施。考虑到无法句法检测的可能的错误用途,必须仔细设计类或对象层次结构。这个问题被称为Liskov替代原则.
团伙四个设计模式
设计模式:可重复使用的面向对象软件的元素是一本有影响力的书,于1994年出版埃里希·伽玛(Erich Gamma),理查德·赫尔姆(Richard Helm),拉尔夫·约翰逊, 和约翰·弗里西德(John Vlissides),经常被幽默地称为“四个帮派”。除了探索面向对象的编程的功能和陷阱外,它还描述了23个常见的编程问题和解决方案的模式。截至2007年4月,这本书是第36印刷的。
该书描述了以下模式:
- 创建模式(5):工厂方法模式,抽象的工厂模式,Singleton图案,建筑商模式,原型模式
- 结构模式(7):适配器图案,桥图,复合图案,装饰器图案,立面模式,轻量级图案,代理模式
- 行为模式(11):责任链模式,命令模式,解释器模式,迭代图案,中介图案,纪念品模式,观察者模式,状态模式,策略模式,模板方法模式,访客模式
对象方向和数据库
两者都是面向对象的编程和关系数据库管理系统(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概念的解释:
- CO代数数据类型[51]
- 递归类型
- 封装状态
- 遗产
- 记录是理解对象的基础功能文字可以存储在字段中(例如在功能编程语言中),但是实际的计算需要更为复杂才能结合OOP的基本特征。几个扩展系统f<:研究了可变的物体。[52]这两个都允许亚型多态性和参数多态性(仿制药)
试图找到对象背后的共识定义或理论并未证明非常成功(但是,请参见Abadi&Cardelli,物体理论[52]对于许多OOP概念和构造的形式定义),并且通常会广泛分歧。例如,某些定义侧重于心理活动,有些定义用于程序结构。更简单的定义之一是,OOP是使用“映射”数据结构或数组的行为,可以包含函数和指针到其他地图,所有这些都带有某些句法和范围糖在上面。可以通过克隆地图(有时称为“原型”)来执行继承。
也可以看看
系统
建模语言
参考
- ^Kindler,E。;Krivy,I。(2011)。“具有复杂控制的系统的面向对象的模拟”。国际通用系统杂志:313–343。
{{}}
:引用期刊需要|journal=
(帮助) - ^刘易斯,约翰; Loftus,William(2008)。编程设计的Java软件解决方案基础第六版。皮尔森教育公司ISBN 978-0-321-53205-3.,第1.6节“面向对象的编程”
- ^麦卡锡(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=
(帮助) - ^麦卡锡,约翰;亚伯拉罕,保罗·W。爱德华兹(Edwards),丹尼尔(Daniel J。);Hart,Swapnil d。;莱文(Levin),迈克尔(Michael I.)(1962)。LISP 1.5程序员手册.麻省理工学院出版社。 p。105.ISBN 978-0-262-13011-0.
对象 - 原子符号的同义词
- ^一个b“艾伦·凯博士对“面向对象的编程”的含义"。 2003。检索2月11日2010.
- ^Sutherland,I。E.(1963年1月30日)。“素描板:人机图形通信系统”。技术报告第296号,马萨诸塞州林肯实验室,通过国防技术信息中心(stinet.dtic.mil)。存档原本的2013年4月8日。检索7月17日2019.
- ^模拟语言的发展,克里斯汀·尼加德(Kristen Nygaard),Ole-Johan Dahl,第254页uni-kl.ac.at
- ^罗斯,道格。“第一种软件工程语言”.LCS/AI实验室时间轴。麻省理工学院计算机科学和人工智能实验室。检索5月13日2010.
- ^一个bHolmevik,Jan Rune(1994)。“汇编模拟:技术起源的历史研究”(PDF).IEEE计算历史.16(4):25–37。doi:10.1109/85.329756.S2CID 18148999。存档原本的(PDF)2017年8月30日。检索3月3日2018.
- ^一个bBertrand Meyer(2009)。班级的触摸:学会与对象和合同进行很好的编程。Springer科学与商业媒体。p。329。Bibcode:2009TCLP.Book ..... m.ISBN 978-3-540-92144-8.
- ^凯,艾伦。“ Smalltalk的早期历史”。存档原本的2008年7月10日。检索9月13日2007.
- ^1995(6月)视觉Foxpro3.0,FoxPro从程序语言发展到面向对象的语言。Visual FoxPro 3.0介绍了数据库容器,无缝客户端/服务器功能,对ActiveX Technologies的支持以及OLE自动化和NULL支持。狐狸发行的摘要
- ^FOXPRO历史网站:foxprohistory.org
- ^1995年审稿人Visual FoxPro 3.0指南:dfpug.de
- ^库拉纳(Khurana),罗希特(2009年11月1日)。带有C ++的面向对象的编程,1E.ISBN 978-81-259-2532-3.
- ^Deborah J. Armstrong。面向对象的开发的夸克。对近40年的计算文献进行了调查,该调查确定了大多数OOP定义中发现的许多基本概念,以降序的流行顺序:继承,对象,阶级,封装,方法,消息传递,多态性和抽象。
- ^约翰·米切尔(John C. Mitchell),编程语言的概念,剑桥大学出版社,2003年,ISBN0-521-78098-5,第278页。列表:动态调度,抽象,亚型多态性和继承。
- ^迈克尔·李·斯科特(Michael Lee Scott),编程语言语用学,第2版,摩根·考夫曼(Morgan Kaufmann),2006年,ISBN0-12-633951-1,p。470.列表封装,继承和动态调度。
- ^皮尔斯,本杰明(2002)。类型和编程语言。麻省理工学院出版社。ISBN 978-0-262-16209-8.,第18.1节“什么是面向对象的编程?”列表:动态调度,封装或多方法(多次调度),亚型多态性,继承或委托,开放式递归(“ this“/“ self”))
- ^Booch,Grady(1986)。与ADA的软件工程。艾迪生·卫斯理。 p。 220。ISBN 978-0-8053-0608-8.
以对象为导向的开发方法的最大优势是,它提供了一种捕获现实世界模型的机制。
- ^雅各布森,伊瓦尔;马格努斯·克里斯特森(Magnus Christersson)帕特里克·琼森(Patrik Jonsson);Gunnar Overgaard(1992)。面向对象的软件工程。 Addison-Wesley ACM出版社。 pp。43–69.ISBN 978-0-201-54435-0.
- ^“翡翠编程语言”。 2011年2月26日。
- ^纽纳德,泰德(2006年6月26日)。“计算机科学的越南”。发生互操作性。存档原本的2006年7月4日。检索6月2日2010.
- ^迈耶,第二版,第1页。 230
- ^M.Trofimov,OOOP - 第三个“ O”解决方案:打开OOP。头等舱,我的天啊,1993年,第1卷3,第3期,第14页。
- ^沃思,尼克劳斯(2006)。“好主意,透过镜子”(PDF).计算机.39(1):28–39。doi:10.1109/MC.2006.20.S2CID 6582369。存档原本的(PDF)2016年10月12日。检索10月2日2016.
- ^Yegge,史蒂夫(2006年3月30日)。“名词王国处决”。 steve-yegge.blogspot.com。检索7月3日2010.
- ^蒂莫西(2009年6月11日)Boronczyk。“ OOP怎么了”。 zaemis.blogspot.com。检索7月3日2010.
- ^阿姆布勒,斯科特(1998年1月1日)。“对面向对象的重复使用的现实看”。 drdobbs.com。检索7月4日2010.
- ^雪莉,ASAF(2008年8月22日)。“面向对象建模的缺陷”。英特尔软件网络。检索7月4日2010.
- ^贾斯汀·詹姆斯(2007年10月1日)。“多线程是动词,而不是名词”。 TechRepublic.com。存档原本的2007年10月10日。检索7月4日2010.
- ^雪莉,ASAF(2008年8月22日)。“如何:多核编程(多处理)视觉C ++类设计指南,成员函数”。 support.microsoft.com。检索7月4日2010.
- ^罗伯特·哈珀(Robert Harper)(2011年4月17日)。“关于教授FP的一些想法”。存在类型的博客。检索12月5日2011.
- ^一个bCardelli,卢卡(1996)。“面向对象的语言的不良工程特性”.ACM计算。幸存.28(4ES):150 – Es。doi:10.1145/242224.242415.ISSN 0360-0300.S2CID 12105785。检索4月21日2010.
- ^一个b阿姆斯特朗,乔。在工作中的编码人员:对编程技巧的思考。彼得·塞贝尔(Peter Seibel)编辑。codersatwork.com存档2010年3月5日在Wayback Machine,2009年11月13日访问。
- ^一个bStepanov,亚历山大.“ Stlport:对A. Stepanov的采访”。检索4月21日2010.
- ^一个bRich Hickey,JVM语言峰会2009 Keynote,我们到了吗?2009年11月。
- ^波托克,托马斯;姆拉登·瓦克(Mladen Vouk);Andy Rindos(1999)。“在商业环境中开发的面向对象软件的生产力分析”(PDF).软件:练习和经验.29(10):833–847。doi:10.1002/(SICI)1097-024X(199908)29:10 <833 :: AID-SPE258> 3.0.co; 2-P.S2CID 57865731。检索4月21日2010.
- ^C. J. Date,数据库系统简介,第六版,第650页
- ^C. J. Date,休·达尔文。未来数据库系统的基础:第三宣言(第二版)
- ^克鲁伯纳,劳伦斯。“面向对象的编程是一场昂贵的灾难,必须结束”。 smashcompany.com。存档原本的2014年10月14日。检索10月14日2014.
- ^格雷厄姆,保罗.“为什么ARC不是特别面向对象”。 paulgraham.com。检索11月13日2009.
- ^布罗迪(Brodie),狮子座(1984)。思考(PDF)。第92–93页。检索5月4日2018.
- ^亨特,安德鲁。“不要重复自己”.类别极限编程。检索5月4日2018.
- ^“ Stevey的博客咆哮:名词王国处决”。检索5月20日2020.
- ^一个b埃里克·雷蒙德(Eric S. Raymond)(2003)。“ Unix编程的艺术:UNIX和面向对象的语言”。检索8月6日2014.
- ^派克,罗布(2004年3月2日)。“ [9fans]回复:线程:将荣誉徽章缝制到内核上”.comp.os.plan9(邮件列表)。检索11月17日2016.
- ^派克,罗布(2012年6月25日)。“更少的是指数级”。检索10月1日2016.
- ^派克,罗布(2012年11月14日)。“几年前我看到了此页”。存档原本的2018年8月14日。检索10月1日2016.
- ^“鲍勃叔叔坚实的原则”.YouTube.
- ^民意调查,埃里克。“分类数据类型的亚型和继承”(PDF)。检索6月5日2011.
- ^一个b阿巴迪,马丁; Cardelli,Luca(1996)。物体理论。 Springer-Verlag New York,Inc。ISBN 978-0-387-94775-4。检索4月21日2010.
进一步阅读
- 阿巴迪,马丁;卢卡·卡德利(Luca Cardelli)(1998)。物体理论.施普林格·维拉格(Springer Verlag).ISBN 978-0-387-94775-4.
- 阿伯森,哈罗德;杰拉尔德·杰伊·苏斯曼(Gerald Jay Sussman)(1997)。计算机程序的结构和解释.麻省理工学院出版社.ISBN 978-0-262-01153-2。存档原本的2017年12月26日。检索1月22日2006.
- 阿姆斯特朗(Deborah J.)(2006年2月)。“面向对象的发展的夸克”。ACM的通信.49(2):123–128。doi:10.1145/1113034.1113040.ISSN 0001-0782.S2CID 11485502.
- Booch,Grady(1997)。带有对象的分析和设计.Addison-Wesley.ISBN 978-0-8053-5340-2.
- 鳗鱼,彼得;奥利弗·西姆斯(Oliver Sims)(1998)。建立业务对象.约翰·威利(John Wiley&Sons).ISBN 978-0-471-19176-6.
- 伽玛,埃里希;理查德·赫尔姆(Richard Helm);拉尔夫·约翰逊;约翰·弗里西德(John Vlissides)(1995)。设计模式:可重复使用的对象软件的元素。 Addison-Wesley。Bibcode:1995dper.book ..... g.ISBN 978-0-201-63361-0.
- 哈蒙,保罗;威廉·莫里西(William Morrissey)(1996)。对象技术案例书 - 屡获殊荣的业务应用程序的教训。约翰·威利(John Wiley&Sons)。ISBN 978-0-471-14717-6.
- 雅各布森,伊瓦(1992)。面向对象的软件工程:用例驱动方法。 Addison-Wesley。Bibcode:1992年读书..... j.ISBN 978-0-201-54435-0.
- 凯,艾伦.Smalltalk的早期历史。存档原本的2005年4月4日。检索4月18日2005.
- 迈耶,伯特兰(1997)。面向对象的软件构建.Prentice Hall.ISBN 978-0-13-629155-8.
- Pecinovsky,Rudolf(2013)。OOP - 学习面向对象的思维和编程。布鲁克纳出版。ISBN 978-80-904661-8-0.
- Rumbaugh,詹姆斯;迈克尔·布拉哈;威廉·普雷曼尼(William Premerlani);弗雷德里克·埃迪(Frederick Eddy);威廉·洛伦森(William Lorensen)(1991)。面向对象的建模和设计。 Prentice Hall。ISBN 978-0-13-629841-0.
- Schach,Stephen(2006)。面向对象和古典软件工程,第七版.麦格劳 - 希尔.ISBN 978-0-07-319126-3.
- Schreiner,Axel-Tobias(1993)。用ANSI-C面向对象的编程。汉森。HDL:1850/8544.ISBN 978-3-446-17426-9.
- 泰勒,大卫·A(1992)。面向对象的信息系统 - 计划和实施。约翰·威利(John Wiley&Sons)。ISBN 978-0-471-54364-0.
- Weisfeld,Matt(2009)。面向对象的思维过程,第三版.Addison-Wesley.ISBN 978-0-672-33016-2.
- 韦斯特,大卫(2004年)。对象思维(开发人员参考).Microsoft Press.ISBN 978-0-7356-1965-4.
外部链接
- 面向对象的编程概念简介(OOP)等由L.W.C. Nirosh
- 关于OOP缺陷的讨论
- OOP概念(Java教程)