面向過程和麵向物件的區別
先來看生活中的一個例子。
想必每個人都下過五子棋吧?在下棋的整個過程中可以有兩種不同的思路來實現:
1、按步驟來看:
(1)、開始遊戲,(2)、黑子先走,(3)、繪製畫面,(4)、判斷輸贏,(5)、輪到白子,(6)、繪 制畫面,(7)、判斷輸贏,(8)、返回步驟(2),(9)輸出最後結果
2、按組成模組來看:
(1) 、黑白雙方模組, (2) 、棋盤模組, (3) 、規則模組
以上兩種完全不同的設計思路,正好對應於程式設計中完全不同的兩種思想:前者側重於遊戲步驟的設計,對應於程式設計中的面向過程思想;後者著重於分層,有模組化設計理念,對應於程式設計中的面向物件思想。可以很明顯地看出:面向物件是以功能來劃分問題,而不是步驟。同樣是繪製棋局,這樣的行為在面向過程的設計中分散在了多個步驟中,很可能出現不同的繪製版本,因為通常設計人員會考慮到實際情況進行各種各樣的簡化。而面向物件的設計中,繪圖只可能在棋盤物件中出現,從而保證了繪圖的統一。
C語言是典型的“面向過程”設計語言。面向過程就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候一個一個依次呼叫就可以了。“面向過程”是一種以過程為中心的程式設計思想。“面向過程”也可稱之為“面向記錄”程式設計思想,它們不支援豐富的“面向物件”特性(比如繼承、多型)。如下圖:

Java是典型的“面向物件”設計語言。“面向物件”是一種以事物為中心的程式設計思想。是把構成問題的事物分解成各個物件,建立物件的目的不是為了完成某一個步驟,而是為了描述某個事物在整個解決問題的步驟中的行為。如下圖:

面向過程適合於一個人的小量工作,而面向物件更側重於團隊合作,需要很多人完成的大量工作。面向過程思想是我們每一個人天生具備的。在程式設計時,我們總會不自覺的去考慮怎麼來完成某一需求,分析出具體的步驟,然後按照步驟來一步步實現。但是在現實生活當中,並不是每一件事都可以自己獨立來完成,我們需要團隊,需要合作才可以完成某一項複雜的工作。這樣來看的話,面向物件思想似乎更符合人們的做事方式,也更生活化。是的呢,不管是生活中,亦或是程式設計中,面向物件才是我們更應該具備的一種思想,先來看幾組概念。
物件:物件是人們要進行研究的任何事物,從最簡單的整數到複雜的飛機等均可看做物件,它不僅能表示具體的事物,還能表示抽象的規則、計劃或事件等。
類:具有相同特性(資料元素)和行為(功能)的物件的抽象就是類。因此,物件的抽象是類,類的具體化就是物件,也可以說類的例項化是物件,類實際上就是一種資料型別。
面向物件三大特徵:封裝、繼承、多型。
封裝:封裝是一種把程式碼和程式碼所操作的資料捆綁在一起,使這兩者不受外界干擾和誤用的機制。封裝可被理解為一種用作保護的包裝器,以防止程式碼和資料被包裝器外部所定義的其它程式碼任意訪問。
繼承:繼承是指一個物件從另一個物件中獲得屬性和方法的過程。它支援按層次分類的概念,如果不使用層次的概念,每個物件需要明確定義各自的全部特徵,通過層次分類方式,一個物件只需要在它的類中定義使它成為唯一的各個屬性和方法。
多型:多型是指同一個實體同時具有多種形式。同一操作作用於不用的物件,可以有不同的解釋,產生不同的執行結果。在執行時,可以通過指向基類的引用,來呼叫實現派生類中的方法。
面向過程
優點:效能比面向物件高。
缺點:沒有面向物件易維護、易複用、易擴充套件。
面向物件
優點:易維護、易複用、易擴充套件。由於面向物件有封裝、繼承、多型性的特徵,可以設計出低耦合的系統,使系統更加靈活,更加易於維護和擴充套件。
缺點:效能比面向過程低。