電腦誕生以來,為適應程式不斷增長的複雜過程,程式設計方法論發生了巨大變化。例如,在電腦發展初期,程式設計是通過輸入二進位機器指令來完成的。在程式僅限於幾百條指令的情況下,這種方法是可接受的。隨著程式規模的增長,人們發明瞭彙編語言,這樣程式員就可以使用代表機器指令的符號表示法來處理大型的、複雜的程 ...
電腦誕生以來,為適應程式不斷增長的複雜過程,程式設計方法論發生了巨大變化。例如,在電腦發展初期,程式設計是通過輸入二進位機器指令來完成的。在程式僅限於幾百條指令的情況下,這種方法是可接受的。隨著程式規模的增長,人們發明瞭彙編語言,這樣程式員就可以使用代表機器指令的符號表示法來處理大型的、複雜的程式。隨著程式規模的繼續增長,高級語言的引入為程式員提供了更多的工具,這些工具可以使他們能夠處理更複雜的程式。
20世紀60年代誕生了結構化程式設計方法,Pascal和C語言是使用這種方法的語言。結構化編程採用了模塊分解與功能抽象和自頂向下、分而治之的方法,從而有效地將一個較複雜的程式系統設計任務分解成許多易於控制和處理的子程式,便於開發和維護。但是由於在實際開發中需求會經常發生變化,因此,它不能很好地適應需求變化的開發過程。結構化程式設計是面向過程的。
面向對象程式設計師一種功能強大的設計方法。它吸收了結構化程式設計的思想精華,並且提出了一些新的概念。廣義上講,一個程式可以用兩種方法組織:一是圍繞代碼(發生了什麼);二是圍繞數據(誰受了影響)。如果僅使用結構化程式設計技術,那麼程式通常圍繞代碼來組織。
面向對象程式則以另一種方式工作,它們圍繞數據來組織程式。在面向對象語言中,需要定義數據和作用於數據的操作。
1 面向過程
面向過程編程(Procedure Oriented Programming,OPP)是一種以事物為中心的編程思想。主要關註“怎麼做”,即完成任務的具體細節。它以過程(可以理解為方法、函數、操作)作為組織代碼的基本單元,以數據(可以理解為成員變數、屬性)與方法相分離為最主要的特點。面向過程風格是一種流程化的編程風格,通過拼接一組順序執行的方法來操作數據完成一項功能。
2 面向對象
2.1 概述
面向對象編程(Object Oriented Programming,OOP)是一種以對象為基礎的編程思想。主要關註“誰來做”,即完成任務的對象。使用這種方法開發的軟體具有易維護性、可重用和可擴展等特性。
2.2 基本概念
1.對象
在現實世界中,對象無處不在。人們身邊存在的一切事物都是對象。例如,一個人、一輛汽車、一臺電視機、一所學校甚至一個地球,這些都是對象。除了這些可以觸及的事物是對象外,還有一些抽象的概念,如一次會議、一場足球比賽、一個賬戶等也都可以抽象為一個對象。
一個對象一般具有兩方面的特征:狀態和行為。狀態用來描述對象的靜態特征,行為用來描述對象的動態特征。
例如,一輛汽車可以用下麵的特征描述:生產廠家、顏色、最高時速、出廠年份、價格等。汽車可以啟動、加速、轉彎和停止等,這些是汽車所具有的行為或者說施加在汽車上的操作。又如,一場足球比賽可以通過比賽時間、比賽地點、參加的球隊和比賽結果等特性來描述。軟體對象也是對現實世界對象的狀態和行為的模擬,如軟體中的視窗就是一個對象,它可以有自己的狀態和行為。
通過上面的說明,可以給“對象”下一個定義,即對象是現實世界中的一個實體,它具有如下特征:有一個狀態,用來描述它的某些特征。有一組操作,每個操作決定對象的一種功能或行為。
因此,對象是其自身所具有的狀態特征及可以對這些狀態施加的操作結合在一起所構成的實體。一個對象可以非常簡單,也可以非常複雜。複雜的對象往往是由若幹個簡單對象組合而成。例如,一輛汽車就是由發動機、輪胎、車身等許多其他對象組成。
2.類
類(class)是面向對象系統中最重要的概念。在日常生活中經常提到類這個詞,如人類、魚類、鳥類等。類可以定義為具有相似特征和行為的對象的集合,如人類共同具有的區別於其他動物的特征有直立行走、使用工具、使用語言交流等。所有的事物都可以歸到某類中。例如,汽車屬於交通工具類,手機屬於通信工具類。
屬於某個類的一個具體的對象稱為該類的一個實例(instance)。例如,我的汽車是汽車類中的一個實例。實例與對象是同一個概念。
類與實例的關係是抽象與具體的關係。類是多個實例的綜合抽象,實例是某個類的個體實物。
3.消息
對象與對象之間不是孤立的,它們之間存在著某種聯繫,這種聯繫是通過消息傳遞的。例如,開汽車就是人向汽車傳遞消息。
一個對象發送的消息包含三方面的內容:接收消息的對象;接受對象採用的方法(操作);方法所需要的參數。
2.3 面向對象的基本特征
面向對象最基本的特征為:封裝性、繼承性、多態性。
1.封裝性
封裝(encapsulation)就是把對象的狀態(屬性)和行為(方法)結合成一個獨立的系統單位,並儘可能的隱藏對象的內部細節。封裝使得一個對象形成兩個部分:介面部分和實現部分。對用戶來說,介面部分是可見的,而實現部分是不可見的。封裝提供了兩種保護。首先封裝可以保護對象,防止用戶直接存取對象的內部細節;其次封裝也保護了客戶端,防止對象實現部分的改變可能產生的副作用,即實現部分的改變不會影響到客戶端的改變。
2.繼承性
繼承(inheritance)的概念普遍存在於現實世界中。它是一個對象獲得另一個對象屬性的過程。繼承之所以重要,是因為它支持層次結構類的概念。可以發現,在現實世界中,許多知識都是通過層次結構方式進行管理的。
3.多態性
多態性(ploymorphism)是面向對象編程語言的一個重要特征。所謂多態,是指一個程式中相同的名字表示不同含義的情況。面向對象中多態有多種情況。在簡單的情況下,在同一個類中定義了多個名稱相同的方法,即方法重載;另一種情況是子類中定義的與父類中的方法同名的方法,即方法覆蓋。這兩種情況都稱為多態,且前者為靜態多態,後者稱為動態多態。
3 面向對象與面向過程的區別
如今主流的軟體開發思想有兩種:一個是面向對象,另一個是面向過程。面向過程出現的較早,典型代表為C語言,開發中小型項目的效率很高,但是很難適應如今主流的大中型項目開發場景。面向對象則出現的更晚一些,典型代表為Java和C++等語言,更加適用於大型開發場景。兩種開發思想各有長短,
對於面向過程的思想:當需要實現一個功能時,看中的是每一個步驟怎麼做,整體的過程是怎樣的,每一個過程都需要自己親力親為。
對於面向過程的思想:當需要實現一個功能時,不看重具體的過程和步驟是怎樣的,而是關心“誰能幫我做這件事”。
面向過程是最為實際的一種思考方式,就算是面向對象的方法也是含有面向過程的思想。可以說面向過程是一種基礎的方法。它考慮的是實際地實現。一般的面向過程是從上往下步步求精,所以面向過程最重要的是模塊化的思想方法。當程式規模不是很大時,面向過程的方法還會體現出一種優勢。因為程式的流程很清楚,按著模塊與函數的方法可以很好的組織。
面向對象是基於對象概念,以對象為中心,以類和繼承為構造機制,來認識、理解、刻畫客觀世界和設計、構建相應的軟體系統。類和繼承是是適應人們一般思維方式的描述範式。方法是允許作用於該類對象上的各種操作。這種對象、類、消息和方法的程式設計範式的基本點在於對象的封裝性和類的繼承性。通過封裝能將對象的定義和對象的實現分開,通過繼承能體現類與類之間的關係,以及由此帶來的動態聯編和實體的多態性。