面向物件程式設計

物件導向程式設計是種具有物件概念的程式設計典範，同時也是一種程式開發的抽象方針。它可能包含資料、特性、程式碼與方法。物件則指的是類別的例項。它將物件作為程式的基本單元，將程式和資料封裝其中，以提高軟體的重用性、靈活性和擴充套件性，物件裡的程式可以訪問及經常修改物件相關連的資料。在物件導向程式程式設計裡，電腦程式會被設計成彼此相關的物件。面向物件程式設計可以看作一種在程式中包含各種獨立而又互相呼叫的物件的思想，這與傳統的思想剛好相反：傳統的程式設計主張將程式看作一系列函式的集合，或者直接就是一系列對電腦下達的指令。面向物件程式設計中的每一個物件都應該能夠接受資料、處理資料並將資料傳達給其它物件，因此它們都可以被看作一個小型的“機器”，即物件。目前已經被證實的是，面向物件程式設計推廣了程式的靈活性和可維護性，並且在大型專案設計中廣為應用。此外，支持者聲稱面向物件程式設計要比以往的做法更加便於學習，因為它能夠讓人們更簡單地設計並維護程式，使得程式更加便於分析、設計、理解。反對者在某些領域對此予以否認。當我們提到面向物件的時候，它不僅指一種程式設計方法。它更多意義上是一種程式開發方式。在這一方面，我們必須瞭解更多關於面向物件系統分析和麵向物件設計方面的知識。許多流行的程式語言是物件導向的，它們的風格就是會透由物件來創出例項。重要的物件導向程式語言包含Common Lisp、Python、C++、Objective-C、Smalltalk、Delphi、Java、Swift、C#、Perl、Ruby、JavaScript 與 PHP等。特徵.物件導向程式程式設計的定義是使用「物件」來做設計，但並非所有的程式語言都直接支援「物件導向程式程式設計」相關技術與結構。對於OOP的準確定義及其本意存在著不少爭論。通常，OOP被理解為一種將程式分解為封裝資料及相關操作的模組而進行的程式設計方式。有別於其它程式設計方式，OOP中的與某資料型別相關的一系列操作都被有機地封裝到該資料型別當中，而非散放於其外，因而OOP中的資料型別不僅有著狀態，還有著相關的行為。OOP理論，及與之同名的OOP實踐相結合創造出了新的一個程式設計架構；OOP思想被廣泛認為是非常有用的，以致一套新的程式設計範型被創造了出來。的研究最終導致了OOP的誕生。其中由Deborah J. Armstrong進行的長達40年之久的計算機著作調查中，顯示出了一系列面向物件程式設計的基本理論。物件導向程式特徵被條列如下分享非物件導向程式前身語言.物件導向程式設計通常共享高階程式語言的低階功能。可用於建構一個程式的基本工具包括：類與物件.支援面向物件程式語言通常利用繼承其他類達到程式碼重用和可擴充套件性的特性。而類有兩個主要的概念：其中類定義了一件事物的抽象特點。類的定義包含了資料的形式以及對資料的操作。舉例來說，“犬”這個類會包含犬的一切基礎特徵，即所有“犬”都共有的特徵或行為，例如它的品種、毛皮顏色和吠叫的能力。類可以為程式提供模版和結構。一個類的方法和屬性被稱為“成員”。我們來看一段虛擬碼：類犬開始公有成員:吠():私有成員:毛色:品種:結束在這串程式碼中，我們聲明瞭一個類，這個類具有一些犬的基本特徵。關於公有成員和私有成員，請面的繼承性的內容。物件假設我們已經在上面定義了犬這個類，我們就可以用這個類來定義物件：定義大黃是犬大黃.毛色 : 黃大黃.吠()我們無法讓犬這個類去吠，但是我們可以讓物件“大黃”去吠，正如狗可以吠，但沒有具體的狗就無法吠。類和物件就好比是“實型”和“1.23”，“實型”是一種資料的型別，而“1.23”是一個真正的“實數”。所有的“實數”都具有“實型”所描訴的特徵，如“實數的大小”，系統則分配記憶體給“實數”儲存具體的數值。動態配置與訊息傳遞機制.定義上動態配置是指方法會隨著例項動態的改變。而訊息傳遞機制是指一個物件透過接受訊息、處理訊息、傳出訊息或使用其他類別的方法來實作一定功能。如：大黃可以透過吠引起人的注意，從而導致一系列的事發生。封裝性.具備封裝性；Eiffel語言則可以讓使用者指定哪個類別可以存取所有成員。因此，舉例來說，“犬”這個類有“吠()”的方法，這一方法定義了犬具體該透過什麼方法吠。但是，大黃的朋友並不知道它到底是如何吠的。從例項來看：/* 一個面向過程的程式會這樣寫： */定義大黃大黃.定音(442)大黃.吸氣()大黃.吐氣()/* 而當狗的吠叫被封裝到類中，任何人都可以簡單地使用： */定義大黃是犬大黃.吠()繼承.繼承性會繼承這些成員。這意味著程式設計師只需要將相同的程式碼寫一次。在虛擬碼中我們可以這樣寫：類中華田園犬 : 繼承犬定義大黃是中華田園犬大黃.吠() /* 註釋：注意這裡呼叫的是狗這個類的吠叫方法。*/回到前面的例子，“中華田園犬”這個類可以繼承“毛色”這個屬性，並指定其為黃色。而“牧羊犬”則可以繼承“吠()”這個方法，並指定它的音調。子類也可以加入新的成員，例如，“牧羊犬”這個類可以加入一個方法叫做“放牧()”。設若用“中華田園犬”這個類定義了一個例項“大黃”，那麼大黃就不會放牧，因為這個方法是屬於牧羊犬的，而非中華田園犬。事實上，我們可以把繼承理解為“是”或“屬於”。大黃“是”中華田園犬，中華田園犬“屬於”犬類。因此，大黃既得到了中華田園犬的屬性，又繼承了犬的屬性。我們來看虛擬碼：類牧羊犬 : 繼承犬開始公有成員:放牧()結束類中華田園犬 : 繼承犬定義大黃是中華田園犬大黃.放牧() /* 註釋：錯誤：放牧是牧羊犬的成員方法。 */當一個類從多個父類繼承時，我們稱之為“多重繼承”。如一隻狗既是中華田園犬又是牧羊犬。多重繼承並不總是被支援的，因為它很難理解，又很難被好好使用。多型.多型是指由繼承而產生的相關的不同的類，其物件對同一訊息會做出不同的響應。例如，狗和雞都有“叫()”這一方法，但是呼叫狗的“叫()”，狗會吠叫；呼叫雞的“叫()”，雞則會啼叫。我們將它體現在虛擬碼上：類犬開始公有成員:叫()開始吠()結束結束類雞開始公有成員:叫()開始啼()結束結束定義大黃是狗定義紅帽是雞大黃.叫()紅帽.叫()這樣，雖然同樣是做出叫這一種行為，但大黃和紅帽具體做出的表現方式將大不相同。多型性的概念可以用在運算子過載上，可以根據需求檢視相關介面。抽象性.抽象是簡化複雜的現實問題的途徑，它可以為具體問題找到最恰當的類定義，並且可以在最恰當的繼承級別解釋問題。舉例說明，大黃在大多數時候都被當作一條狗，但是如果想要讓它做中華田園犬做的事，你完全可以呼叫中華田園犬的方法。如果狗這個類還有動物的父類，那麼你完全可以視大黃為動物。歷史.面向物件程式設計的雛形，早在1960年代的Simula語言中即可發現，當時的程式設計領域正面臨著一種危機：在軟硬體環境逐漸複雜的情況下，軟體如何得到良好的維護？面向物件程式設計在某種程度上透過強調可重複性解決了這一問題。20世紀70年代的Smalltalk語言在面向物件方面堪稱經典——以至於30年後的今天依然將這一語言視為面嚮物件語言的基礎。計算機科學中物件和例項概念的最早萌芽可以追溯到麻省理工學院的PDP-1系統。這一系統大概是最早的基於容量架構這種辦法是分析式程式的最早概念體現。在分析式程式中，我們將真實世界的物件對映到抽象的物件，這叫做“模擬”。Simula不僅引入了“類”的概念，還應用了例項這一思想——這可能是這些概念的最早應用。20世紀70年代施樂PARC研究所發明的Smalltalk語言將面向物件程式設計的概念定義為，在基礎運算中，對物件和訊息的廣泛應用。Smalltalk的建立者深受Simula 67的主要思想影響，但Smalltalk中的物件是完全動態的——它們可以被建立、修改並銷燬，這與Simula中的靜態物件有所區別。此外，Smalltalk還引入了繼承性的思想，它因此一舉超越了不可建立例項的程式設計模型和不具備繼承性的Simula。此外，Simula 67的思想亦被應用在許多不同的語言，如Lisp、Pascal。面向物件程式設計在80年代成為了一種主導思想，這主要應歸功於C++——C語言的擴充版。在圖形使用者介面。一種說法是，GUI的引入極大地推動了面向物件程式設計的發展。蘇黎世聯邦理工學院的尼克勞斯·維爾特和他的同事們對抽象資料和模組化程式設計進行了研究。Modula-2將這些都包括了進去，而Oberon則包括了一種特殊的面向物件方法——不同於Smalltalk與C++。面向物件的特性也被加入了當時較為流行的語言：Ada、BASIC、Lisp、Fortran、Pascal以及種種。由於這些語言最初並沒有面向物件的設計，故而這種糅合常常會導致相容性和維護性的問題。與之相反的是，“純正的”面嚮物件語言卻缺乏一些程式設計師們賴以生存的特性。在這一大環境下，開發新的語言成為了當務之急。作為先行者，Eiffel成功地解決了這些問題，併成為了當時較受歡迎的語言。在過去的幾年中，Java語言成為了廣為應用的語言，除了它與C和C++語法上的近似性。Java的可移植性是它的成功中不可磨滅的一步，因為這一特性，已吸引了龐大的程式設計師群的投入。在最近的計算機語言發展中，一些既支援面向物件程式設計，又支援面向過程程式設計的語言悄然浮出水面。它們中的佼佼者有Python、Ruby等等。正如面向過程程式設計使得結構化程式設計的技術得以提升，現代的面向物件程式設計方法使得對設計模式的用途、契約式設計和建模語言技術也得到了一定提升。物件導向程式語言.支援部分或絕大部分面向物件特性的語言即可稱為基於物件的或面向物件的語言。Simula (1967)被視為第一個具有物件導向特性的語言。早期，完全面向物件的語言主要包括Smalltalk等語言，目前較為流行的語言中有Java、C#、Eiffel等。隨著軟體工業的發展，比較早的程式導向的語言在近些年的發展中也紛紛吸收了許多物件導向的概念，比如C→C++，C→Objective-C，BASIC→Visual Basic→Visual Basic .NET，Pascal→Object Pascal，Ada→Ada95。「純粹」的物件導向語言, 因為所有的東西都是由物件所組成，例如：Eiffel, Emerald, JADE, Obix, Ruby, Scala, Smalltalk, Self.指令碼中的OOP.近年來，面向物件的程式設計越來越流行於指令碼語言中。Python和Ruby是建立在OOP原理的指令碼語言，Perl和PHP亦分別在Perl 5和PHP 4時加入物件導向特性。