概述
面向對象程式設計(Object Oriented Programming,OOP)是一種計算機編程架構。OOP的一條基本原則是電腦程式由單個能夠起到子程式作用的單元或對象組合而成。OOP達到了軟體工程的三個主要目標:重用性、靈活性和擴展性。OOP=對象+類+繼承+多態+訊息,其中核心概念是類和對象。
面向對象程式設計方法是儘可能模擬人類的思維方式,使得軟體的開發方法與過程儘可能接近人類認識世界、解決現實問題的方法和過程,也即使得描述問題的問題空間與問題的解決方案空間在結構上儘可能一致,把客觀世界中的實體抽象為問題域中的對象。
面向對象程式設計以對象為核心,該方法認為程式由一系列對象組成。類是對現實世界的抽象,包括表示靜態屬性的數據和對數據的操作,對象是類的實例化。對象間通過訊息傳遞相互通信,來模擬現實世界中不同實體間的聯繫。在面向對象的程式設計中,對象是組成程式的基本模組。
特點
1、封裝性:
封裝是指將一個計算機系統中的數據以及與這個數據相關的一切操作語言(即描述每一個對象的屬性以及其行為的程式代碼)組裝到一起,一併封裝在一個有機的實體中,把它們封裝在一個“模組”中,也就是一個類中,為軟體結構的相關部件所具有的模組性提供良好的基礎。在面向對象技術的相關原理以及程式語言中,封裝的最基本單位是對象,而使得軟體結構的相關部件的實現“
高內聚、低耦合”的“最佳狀態”便是面向對象技術的封裝性所需要實現的最基本的目標。對於用戶來說,對象是如何對各種行為進行操作、運行、實現等細節是不需要刨根問底了解清楚的,用戶只需要通過封裝外的通道對計算機進行相關方面的操作即可。大大地簡化了操作的步驟,使用戶使用起計算機來更加高效、更加得心應手。
2、繼承性:
繼承性是面向對象技術中的另外一個重要特點,其主要指的是兩種或者兩種以上的類之間的聯繫與區別。繼承,顧名思義,是後者延續前者的某些方面的特點,而在面向對象技術則是指一個對象針對於另一個對象的某些獨有的特點、能力進行複製或者延續。如果按照繼承源進行劃分,則可以分為單繼承(一個對象僅僅從另外一個對象中繼承其相應的特點)與多繼承(一個對象可以同時從另外兩個或者兩個以上的對象中繼承所需要的特點與能力,並且不會發生衝突等現象);如果從繼承中包含的內容進行劃分,則繼承可以分為四類,分別為取代繼承(一個對象在繼承另一個對象的能力與特點之後將父對象進行取代)、包含繼承(一個對象在將另一個對象的能力與特點進行完全的繼承之後,又繼承了其他對象所包含的相應內容,結果導致這個對象所具有的能力與特點大於等於父對象,實現了對於父對象的包含)、受限繼承、特化繼承。
3、多態性:
從巨觀的角度來講,多態性是指在面向對象技術中,當不同的多個對象同時接收到同一個完全相同的訊息之後,所表現出來的動作是各不相同的,具有多種形態;從微觀的角度來講,多態性是指在一組對象的一個類中,面向對象技術可以使用相同的調用方式來對相同的函式名進行調用,即便這若干個具有相同函式名的函式所表示的函式是不同的。
名詞解釋
面向對象程式設計中的概念主要包括:對象、類、數據抽象、繼承、動態綁定、數據封裝、
多態性、訊息傳遞。通過這些概念面向對象的思想得到了具體的體現。
1)對象(Object) :
可以對其做事情的一些東西。一個對象有狀態、行為和標識三種屬性。
一個共享相同結構和行為的對象的集合。類(Class)定義了一件事物的抽象特點。通常來說,類定義了事物的屬性和它可以做到的(它的行為)。舉例來說,“狗”這個類會包含狗的一切基礎特徵,例如它的孕育、毛皮顏色和吠叫的能力。類可以為程式提供模版和結構。一個類的方法和屬性被稱為“成員”。
3)封裝(encapsulation):
第一層意思:將數據和操作捆綁在一起,創造出一個新的類型的過程。第二層意思:將
接口與實現分離的過程。
4)繼承:
類之間的關係,在這種關係中,一個類共享了一個或多個其他類定義的結構和行為。繼承描述了類之間的“是一種”關係。子類可以對基類的行為進行擴展、覆蓋、重定義。
5)組合:
既是類之間的關係也是對象之間的關係。在這種關係中一個對象或者類包含了其他的對象和類。
組合描述了“有”關係。
類型理論中的一個概念,一個名稱可以表示很多不同類的對象,這些類和一個共同超類有關。因此,這個名稱表示的任何對象可以以不同的方式回響一些共同的操作集合。
7)動態綁定:
也稱動態類型,指的是一個對象或者表達式的類型直到運行時才確定。通常由編譯器插入特殊代碼來實現。與之對立的是靜態類型。
8)靜態綁定:
也稱靜態類型,指的是一個對象或者表達式的類型在編譯時確定。
9)訊息傳遞:
指的是一個對象調用了另一個對象的方法(或者稱為成員函式)。
10)方法:
也稱為成員函式,是指對象上的操作,作為類聲明的一部分來定義。方法定義了可以對一個對象執行那些操作。
設計原理
面向對象技術是對計算機的結構化方法的深入、發展和補充,在保障進行良好的計算機軟體的需求設計的同時,也需要儘可能實現利用低成本來開發出高質量的套用軟體的目標。訊息是傳遞一個對象與另一個對象之間的信息,實現兩者進行通信的橋樑,訊息鏈負責指定功能無條件的執行,而計算機軟體的主程式則負責對訊息進行篩選(哪些可以接受、可以執行,哪些則需要摒棄,不可帶入),軟體開發主要由以下幾個方面組成,分別為需求定義、制定計畫、軟體的功能設計、軟體的功能實現、驗證和確認,這五個方面是最基本的環節,缺一不可。
設計優點
面向對象出現以前,結構化程式設計是程式設計的主流,結構化程式設計又稱為
面向過程的程式設計。在面向過程程式設計中,問題被看作一系列需要完成的任務,函式(在此泛指例程、函式、過程)用於完成這些任務,解決問題的焦點集中於函式。其中函式是面向過程的,即它關注如何根據規定的條件完成指定的任務。
比較面向對象程式設計和面向過程程式設計,還可以得到面向對象程式設計的其他優點:
1)數據抽象的概念可以在保持外部接口不變的情況下改變內部實現,從而減少甚至避免對外界的干擾;
2)通過繼承大幅減少
冗餘的代碼,並可以方便地擴展現有代碼,提高編碼效率,也減低了出錯機率,降低軟體維護的難度;
3)結合面向對象分析、面向對象設計,允許將問題域中的對象直接映射到程式中,減少軟體開發過程中中間環節的轉換過程;
4)通過對對象的辨別、劃分可以將軟體系統分割為若干相對為獨立的部分,在一定程度上更便於控制
軟體複雜度;
5)以對象為中心的設計可以幫助開發人員從靜態(屬性)和動態(方法)兩個方面把握問題,從而更好地實現系統;
6)通過對象的聚合、聯合可以在保證封裝與抽象的原則下實現對象在內在結構以及外在功能上的擴充,從而實現對象由低到高的升級。
設計缺陷
(1)運行效率較低。
類的大量載入會犧牲系統性能,降低運行速度。雖然CPU速度在提高,記憶體容量在增加,但這一問題仍會隨著系統規模變大而逐漸顯示出來,變得越發嚴重。
(2)類庫龐大。
由於類庫都過於龐大,程式設計師對它們的掌握需要一段時間,從普及、推廣的角度來看,類庫應在保證其功能完備的基礎上進行相應的縮減。
(3)類庫可靠性。
越龐大的系統必會存在我們無法預知的問題隱患,程式設計師無法完全保證類庫中的每個類在各種環境中百分之百的正確,當使用的類發生了問題,就會影響後續工作,程式設計師也有可能推翻原來的全部工作。