跳转到内容

User: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