1. 程式人生 > >OOP(面向物件程式設計) 和 OPP(面向過程程式設計) 的異同點及系統總結

OOP(面向物件程式設計) 和 OPP(面向過程程式設計) 的異同點及系統總結

近段時間關於OO的思想和OP思想的爭論不絕於耳,  不敢確信自己能否做一個全面的分析, 因此參考網上一些經典的文章來總結一些這兩種思想在軟體架構上的異同。

首先我個人的傾向是: OO和OP的思想務必要結合. OO適合細節上做封裝;OP適合在模組級別, 架構級別上做統籌. 後面我會借用一些資料來輔佐這樣的論點.

首先還是需要稍微介紹下OO和OP 的基本定義和區別:

在以下兩方面, 面向物件和麵向過程會有區別(下面考慮的都是軟體工程中一般的做法, 不考慮生僻情況):

  • 封裝性上
    • 面向物件的封裝將一系列的資料和方法集中在類中
    • 面向過程的封裝, 方法一般不做封裝, 資料用Struct封裝, 方法和資料分離
  • 程式碼複用性上
    • 面向物件利用繼承的方式複用
    • 面向過程只能以普通的函式複用
  • 其它的細節區別, 比如overload, overwrite之類的區別, 屬於語義上的區別, 不影響本文的主題.

下面的文章來自於JavaEye, 見解比較深刻.

這篇文章的思想是:

1. OO的特點, 就是把資料和邏輯封裝成一個整體, 帶來了強耦合的問題.

2. OP的特點, 資料和邏輯分開, 絕對的鬆耦合, 但封裝性不夠.

上述兩個東東的互斥的特性, 給我們帶來了非常重要的提示:

  1. 模組 之間的設計, 為了維護程式碼(修改bug, 增加新功能, 獨立協調成員工作).  嚴重關注耦合度, 要求儘量即插即用, 模組間完全獨立. 這個時候我們需要儘量的按照OP的思路. 模組和模組之間的協作, 務必按照OP的思路. 邏輯分離得非常徹底. 
  2. 內部單元 的設計, 儘量封裝良好, 利用OO的思想, 將各個零部件整理成一個類整體.

比如, 電腦的組裝, 在整體上, 我們是通過電源線將機箱和插座, 以及顯示器連線, 這個上面的設計思路, 是按照OP來的直觀的連線流程(連線線可以視為膠合層, 《Unix程式設計藝術》上明確的要求這個層面儘量薄), 但機箱內部, 各個零件, 如DVD, 硬碟, 主機板, 都是一個分裝完美的物件, 包含資料, 也包含處理的動作. 這個可以實現外掛的管理模式.

特別強調的一點, OP和OO的設計思路, 主要是看在哪個層次, "模組"和“內部單元”實質上是一個非常抽象的概念, 在某個層面上, “內部單元”可能是一個“模組”, 而在更大的層面上, "模組"也被當做一個“內部單元來處理”, 所以, 如何選擇OO的設計方式, 還是OP的設計方式, 需要視情況而定.  我們所設計的任何一個點, 都停留在產品金字塔結構的一個“內部單元”中, 同時也停留在一個"模組中". 下圖概括了上文的表述內容:

結合一下目前瞭解的一個GPS專案來說明下OP和OO在一個專案中的體現.