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