跳转到内容

用户:Brithe.chiu/沙盒

维基百科,自由的百科全书

面向对象程式设计 (OOP) 是种具有物件概念的程式编程典范,它可能包含资料、属性、程式码方法。物件的一个显著特征是,物件里的程序可以访问及经常修改物件相关连的资料。在面向对象程式编程里,计算机程序会被设计成彼此相关的物件。[1][2] 许多流行的编程语言是面向对象的,它们的风格就是会透由物件来创出实例。重要的面向对象编程语言包含Common LispPythonC++Objective-CSmalltalkDelphiJavaSwiftC#PerlRubyPHP.

特征

面向对象程式编程的定义是使用物件来做设计,但并非所有的编程语言都直接支援面向对象程式编程相关技术与结构。面向对象程式特征被条列如下[3][4][5][6]

分享非面向对象程式前身语言

面向对象程式设计通常共享高阶编程语言的低阶功能。可用于建构一个程序的基本工具包括:

类别与物件

支持面向对象编程语言通常利用继承其他类别达到代码重用和可扩展性的特性。而类别有两个主要的概念:

  • 类别(Class):定义了一件事物的抽象特点。类别的定义包含了数据的形式以及对数据的操作。
  • 物件:是类别的实例。

物件有时会对应到现实世界中的事物,举例来说,一个图形程式可能有圆形、举行与画面等物件,一个线上购物系统可能有购物车、顾客与产品等类别。[7]有时物件会表示更抽象的实体,比如一个被开启的档案或是一个提供美国惯用量测转换的服务。 每个物件就是一个特定类别的实例(例如,名称是“玛丽”的物件可能是类别雇员的一个实例)。程序在面向对象编程当中被视为方法,变数被视为成员或属性。

动态配置与讯息传递机制

定义上动态配置是指方法会随着实例动态的改变。而讯息传递机制(Message Passing)是指一个物件通过接受讯息、处理讯息、传出讯息或使用其他类别的方法来实作一定功能。

封装性

具备封装性(Encapsulation)的面向对象程式设计隐藏了某一方法的具体执行步骤,取而代之的是通过讯息传递机制传送讯息给它。封装是通过限制只有特定类别的物件可以存取这一特定类别的成员,而它们通常利用界面实作讯息的传入传出。通常来说,成员会依它们的存取权限被分为3种:公有成员、私有成员以及保护成员。有些语言更进一步:Java可以限制同一包内不同类别的存取;C#和VB.NET保留了为类别的成员聚集准备的关键字:internal(C#)和Friend(VB.NET);Eiffel语言则可以让使用者指定哪个类别可以存取所有成员。

历史

面向对象程序设计的雏形,早在1960年的Simula语言中即可发现,当时的程序设计领域正面临着一种危机:在软硬件环境逐渐复杂的情况下,软件如何得到良好的维护?面向对象程序设计在某种程度上通过强调可重复性解决了这一问题。20世纪70年代的Smalltalk语言在面向对象方面堪称经典——以至于30年后的今天依然将这一语言视为面向对象语言的基础。

计算机科学中对象和实例概念的最早萌芽可以追溯到麻省理工学院PDP-1系统。这一系统大概是最早的基于容量架构(capability based architecture)的实际系统。另外1963年Ivan Sutherland的Sketchpad应用中也蕴含了同样的思想。对象作为编程实体最早是于1960年代由Simula 67语言引入思维。Simula这一语言是奥利-约翰·达尔克利斯登·奈加特在挪威奥斯陆计算机中心为模拟环境而设计的。(据说,他们是为了模拟船只而设计的这种语言,并且对不同船只间属性的相互影响感兴趣。他们将不同的船只归纳为不同的类,而每一个对象,基于它的类,可以定义它自己的属性和行为。)这种办法是分析式程序的最早概念体现。在分析式程序中,我们将真实世界的对象映射到抽象的对象,这叫做“模拟”。Simula不仅引入了“类”的概念,还应用了实例这一思想——这可能是这些概念的最早应用。

20世纪70年代施乐PARC研究所发明的Smalltalk语言将面向对象程序设计的概念定义为,在基础运算中,对对象消息的广泛应用。Smalltalk的创建者深受Simula 67的主要思想影响,但Smalltalk中的对象是完全动态的——它们可以被创建、修改并销毁,这与Simula中的静态对象有所区别。此外,Smalltalk还引入了继承性的思想,它因此一举超越了不可创建实例的程序设计模型和不具备继承性的Simula。此外,Simula 67的思想亦被应用在许多不同的语言,如LispPascal

面向对象程序设计在80年代成为了一种主导思想,这主要应归功于C++——C语言的扩充版。在图形用户界面(GUI)日渐崛起的情况下,面向对象程序设计很好地适应了潮流。GUI和面向对象程序设计的紧密关联在Mac OS X中可见一斑。Mac OS X是由Objective-C语言写成的,这一语言是一个仿Smalltalk的C语言扩充版。面向对象程序设计的思想也使事件处理式的程序设计更加广泛被应用(虽然这一概念并非仅存在于面向对象程序设计)。一种说法是,GUI的引入极大地推动了面向对象程序设计的发展。

苏黎世联邦理工学院的尼克劳斯·维尔特和他的同事们对抽象数据和模块化程序设计进行了研究。Modula-2将这些都包括了进去,而Oberon则包括了一种特殊的面向对象方法——不同于SmalltalkC++

面向对象的特性也被加入了当时较为流行的语言:AdaBASICLispFortranPascal以及种种。由于这些语言最初并没有面向对象的设计,故而这种糅合常常会导致兼容性和维护性的问题。与之相反的是,“纯正的”面向对象语言却缺乏一些程序员们赖以生存的特性。在这一大环境下,开发新的语言成为了当务之急。作为先行者,Eiffel成功地解决了这些问题,并成为了当时较受欢迎的语言。

在过去的几年中,Java语言成为了广为应用的语言,除了它与CC++语法上的近似性。Java的可移植性是它的成功中不可磨灭的一步,因为这一特性,已吸引了庞大的程序员群的投入。

在最近的计算机语言发展中,一些既支持面向对象程序设计,又支持面向过程程序设计的语言悄然浮出水面。它们中的佼佼者有PythonRuby等等。

正如面向过程程序设计使得结构化程序设计的技术得以提升,现代的面向对象程序设计方法使得对设计模式的用途、契约式设计建模语言(如UML)技术也得到了一定提升。

面向对象编程语言

Simula (1967)被视为第一个具有面向对象特性的语言。

参见

系统

建模语言

参考文献

  1. ^ Kindler, E.; Krivy, I. Object-Oriented Simulation of systems with sophisticated control. International Journal of General Systems: 313–343. 2011. 
  2. ^ Lewis, John; Loftus, William. Java Software Solutions Foundations of Programming Design 6th ed. Pearson Education Inc. 2008. ISBN 0-321-53205-8. , section 1.6 "Object-Oriented Programming"
  3. ^ Deborah J. Armstrong. The Quarks of Object-Oriented Development. A survey of nearly 40 years of computing literature which identified a number of fundamental concepts found in the large majority of definitions of OOP, in descending order of popularity: Inheritance, Object, Class, Encapsulation, Method, Message Passing, Polymorphism, and Abstraction.
  4. ^ John C. Mitchell, Concepts in programming languages, Cambridge University Press, 2003, ISBN 0-521-78098-5, p.278. Lists: Dynamic dispatch, abstraction, subtype polymorphism, and inheritance.
  5. ^ Michael Lee Scott, Programming language pragmatics, Edition 2, Morgan Kaufmann, 2006, ISBN 0-12-633951-1, p. 470. Lists encapsulation, inheritance, and dynamic dispatch.
  6. ^ Pierce, Benjamin. Types and Programming Languages. MIT Press. 2002. ISBN 0-262-16209-1. , section 18.1 "What is Object-Oriented Programming?" Lists: Dynamic dispatch, encapsulation or multi-methods (multiple dispatch), subtype polymorphism, inheritance or delegation, open recursion ("this"/"self")
  7. ^ Booch, Grady. Software Engineering with Ada. Addison Wesley. 1986: 220. ISBN 978-0805306088. Perhaps the greatest strength of an object-oriented approach to development is that it offers a mechanism that captures a model of the real world. 
  8. ^ The Emerald Programming Language. 2011-02-26. 

延伸阅读

外部链接

Template:Programming language