重新思考面向過程與面向物件
目錄
部落格:blog.shinelee.me | 部落格園 | CSDN
面向過程與面向物件的思考方式
面向過程和面向物件的差異主要體現在思考方式上,面對同樣一個任務,
面向過程的思考方式,首先想的是一步步該怎麼做,
- 對任務進行分解,先幹什麼後幹什麼,劃分成不同階段的子任務
- 對每個階段的子任務進一步分解,形成函式,根據輸入輸出將所需資料整理為資料結構
- 將任務串接起來,完成總任務
- 重構,將重複工作抽象成單獨的函式
- 複用的單元是函式
面向物件的思考方式,首先想的是任務中利益相關方都有誰
- 找到任務中的所有利益相關方,並對其歸類
- 確定每個利益相關方類別的屬性,並劃分責任和義務,定義出行為,抽象出類別
- 對類進行例項化,例項間相互協作配合完成任務
- 重構,疏理類別之間的關係,將共有部分抽離成基礎類,其他類從基礎類繼承而來
- 複用的單元是類
如果以開公司為例的話:
面向過程的思考方式是,要採購原材料、生產產品、賣產品、管理入賬出賬,因此需要生產人員、銷售人員、財務等,將他們串起來,公司就運轉起來了。
面向物件的思考方式是,公司要分為生產部門、銷售部門、財務等,分別有各自的職責,生產的要記錄生產資料、接收原材料、產出產品,銷售的要記錄銷量、賣出產品……
面向過程的思考方式
面向物件的思考方式偏抽象、偏資料、偏象形,像上帝模式,像老闆視角,各個利益相關方彷彿具有了生命,它們之間通過相互配合完成任務。
在我看來,思考方式是面向過程與面向物件的最大差異,而不在於多型等語言特性。
面向過程與面向物件的聯絡
面向過程 和 面向物件並不是對立的。在問題複雜後,面向過程也會模組化,把同一類操作以及共有的資料結構整理在一起,朝面向物件邁進,就像公司從混亂的小作坊做大後就會形成部門;面向物件在執行具體工作時,仍是面向過程的,也是有步驟的,就像公司生產線上質檢員工,仍需要第一步檢查什麼、第二步檢查什麼。
此外,再談談語言層面。面向過程語言(比如C語言),可以是流程化的,一個函式一個函式地呼叫,但也能表達面向物件思想,比如模組化後,將結構體和函式規劃好所屬類別,使用時類和物件的思想在腦袋裡;支援面向物件的語言(比如C++),是在語言層面對類和物件的思想提供了支援,將腦袋裡的類別用語言中的class具現出來,將類別間的衍生關係用語言中的繼承具現出來,同時在編譯器(編輯器)上提供了訪問的邊界,並有相應的語法來界定。
如何選擇
兩種程式設計思路並無明顯優劣之分,一切只看適不適合。面向過程模組化做得好,也可以很清晰。面向物件設計過度,也會噁心人。如何選擇呢?
這裡直接貼上SIGAI丁老師的建議,
- 評估方法:預測未來,找到複用概率最高的幾個點
- 將這幾個點用如下原則進行初步評估:高內聚,低耦合
- 按照以上方法評估之後,心中往往已經有了答案
一般而言:
- 注重複用和可維護性時, 面向物件多數要勝出的
- 注重短期開發速度,而且是一次性的,面向過程肯定是首選
至於中間態,在兩者間權衡吧——最注重複用和可維護性的地方,面向物件;其他次要的,流程化的,面向過程。
以上。