跳至內容

使用者: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