程式設計中面向過程和麵向物件的區別

  面向過程程式設計和對面物件程式設計都是程式設計的方法,這兩者有什麼區別呢,下面小編來告訴你面向過程和麵向物件這兩者方法的區別。

  面對過程和麵對物件的區別

  面向過程就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候一個一個依次呼叫就可以了。

  面向物件是把構成問題事務分解成各個物件,建立物件的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。

  例如五子棋,面向過程的設計思路就是首先分析問題的步驟:

  1、開始遊戲

  2、黑子先走

  3、繪製畫面

  4、判斷輸贏

  5、輪到白子

  6、繪製畫面

  7、判斷輸贏

  8、返回步驟2

  9、輸出最後結果

  把上面每個步驟用分別的函式來實現,問題就解決了。

  面向物件的設計則是從另外的思路來解決問題。整個五子棋可以分為

  1、黑白雙方,這兩方的行為是一模一樣的,

  2、棋盤系統,負責繪製畫面

  3、規則系統,負責判定諸如犯規、輸贏等。

  第一類物件***玩家物件***負責接受使用者輸入,並告知第二類物件***棋盤物件***棋子佈局的變化,棋盤物件接收到了棋子的i變化就要負責在螢幕上面顯示出這種變化,同時利用第三類物件***規則系統***來對棋局進行判定。

  可以明顯地看出,面向物件是以功能來劃分問題,而不是步驟。同樣是繪製棋局,這樣的行為在面向過程的設計中分散在了總多步驟中,很可能出現不同的繪製版本,因為通常設計人員會考慮到實際情況進行各種各樣的簡化。而面向物件的設計中,繪圖只可能在棋盤物件中出現,從而保證了繪圖的統一。

  功能上的統一保證了面向物件設計的可擴充套件性。比如我要加入悔棋的功能,如果要改動面向過程的設計,那麼從輸入到判斷到顯示這一連串的步驟都要改動,甚至步驟之間的循序都要進行大規模調整。如果是面向物件的話,只用改動棋盤物件就行了,棋盤系統儲存了黑白雙方的棋譜,簡單回溯就可以了,而顯示和規則判斷則不用顧及,同時整個對物件功能的呼叫順序都沒有變化,改動只是區域性的。

  再比如我要把這個五子棋遊戲改為圍棋遊戲,如果你是面向過程設計,那麼五子棋的規則就分佈在了你的程式的每一個角落,要改動還不如重寫。但是如果你當初就是面向物件的設計,那麼你只用改動規則物件就可以了,五子棋和圍棋的區別不就是規則嗎?***當然棋盤大小好像也不一樣,但是你會覺得這是一個難題嗎?直接在棋盤物件中進行一番小改動就可以了。***而下棋的大致步驟從面向物件的角度來看沒有任何變化。

  當然,要達到改動只是區域性的需要設計的人有足夠的經驗,使用物件不能保證你的程式就是面向物件,初學者或者很蹩腳的程式設計師很可能以面向物件之虛而行面向過程之實,這樣設計出來的所謂面向物件的程式很難有良好的可移植性和可擴充套件性。

  小編推薦:

  1、面向物件相對面向過程的優點

  1*** 結構清晰。使人們的程式設計與實際的世界更加接近,所有的物件被賦予屬性和方法,結果程式設計就更加富有人性化。

  2*** 封裝性。減小外部對內部的影響。封裝將物件有關的資料和行為封裝成整體來處理,使得物件以外的部分不能隨意存取物件的內部屬性,從而有效地避免了外部錯誤對它的影響,大大減小了查錯和排錯的難度。

  3*** 容易擴充套件,程式碼重用率高。容易擴充套件,在大框架不變的情況下很容易就開發出適合自己的功能,實現簡單,可有效地減少程式的維護工作量,軟體開發效率高。

  2、面向物件相對面向過程的缺點

  1*** 增加工作量。如果一味地強調封裝,當進行修改物件內部時,物件的任何屬性都不允許外部直接存取,則要增加許多沒有其他意義、只負責讀或寫的行為。這會為程式設計工作增加負擔,增加執行開銷,並且使程式顯得臃腫。

  2*** 效能低。由於面向更高的邏輯抽象層,使得面向物件在實現的時候,不得不做出效能上面的犧牲,計算時間和空間儲存大小的都開銷很大。