1. 程式人生 > >重新思考面向過程與面向物件

重新思考面向過程與面向物件

目錄

部落格:blog.shinelee.me | 部落格園 | CSDN

面向過程與面向物件的思考方式

面向過程面向物件的差異主要體現在思考方式上,面對同樣一個任務,

面向過程的思考方式,首先想的是一步步該怎麼做

  • 對任務進行分解,先幹什麼後幹什麼,劃分成不同階段的子任務
  • 對每個階段的子任務進一步分解,形成函式,根據輸入輸出將所需資料整理為資料結構
  • 將任務串接起來,完成總任務
  • 重構,將重複工作抽象成單獨的函式
  • 複用的單元是函式

面向物件的思考方式,首先想的是任務中利益相關方都有誰

  • 找到任務中的所有利益相關方,並對其歸類
  • 確定每個利益相關方類別的屬性,並劃分責任和義務,定義出行為,抽象出類別
  • 對類進行例項化,例項間相互協作配合完成任務
  • 重構,疏理類別之間的關係,將共有部分抽離成基礎類,其他類從基礎類繼承而來
  • 複用的單元是類

如果以開公司為例的話:

面向過程的思考方式是,要採購原材料、生產產品、賣產品、管理入賬出賬,因此需要生產人員、銷售人員、財務等,將他們串起來,公司就運轉起來了。

面向物件的思考方式是,公司要分為生產部門、銷售部門、財務等,分別有各自的職責,生產的要記錄生產資料、接收原材料、產出產品,銷售的要記錄銷量、賣出產品……

面向過程的思考方式

偏邏輯、偏動作、偏執行,更符合人類的思考方式,像員工視角,把人做事的步驟函式化程式碼化

面向物件的思考方式偏抽象、偏資料、偏象形,像上帝模式,像老闆視角,各個利益相關方彷彿具有了生命,它們之間通過相互配合完成任務

在我看來,思考方式是面向過程與面向物件的最大差異,而不在於多型等語言特性。

面向過程與面向物件的聯絡

面向過程 和 面向物件並不是對立的。在問題複雜後,面向過程也會模組化,把同一類操作以及共有的資料結構整理在一起,朝面向物件邁進,就像公司從混亂的小作坊做大後就會形成部門;面向物件在執行具體工作時,仍是面向過程的,也是有步驟的,就像公司生產線上質檢員工,仍需要第一步檢查什麼、第二步檢查什麼。

此外,再談談語言層面面向過程語言(比如C語言),可以是流程化的,一個函式一個函式地呼叫,但也能表達面向物件思想,比如模組化後,將結構體和函式規劃好所屬類別,使用時類和物件的思想在腦袋裡;支援面向物件的語言(比如C++),是在語言層面對類和物件的思想提供了支援,將腦袋裡的類別用語言中的class具現出來,將類別間的衍生關係用語言中的繼承具現出來,同時在編譯器(編輯器)上提供了訪問的邊界,並有相應的語法來界定。

如何選擇

兩種程式設計思路並無明顯優劣之分,一切只看適不適合。面向過程模組化做得好,也可以很清晰。面向物件設計過度,也會噁心人。如何選擇呢?

這裡直接貼上SIGAI丁老師的建議,

  • 評估方法:預測未來,找到複用概率最高的幾個點
  • 將這幾個點用如下原則進行初步評估:高內聚,低耦合
  • 按照以上方法評估之後,心中往往已經有了答案

一般而言:

  • 注重複用和可維護性時, 面向物件多數要勝出的
  • 注重短期開發速度,而且是一次性的,面向過程肯定是首選

至於中間態,在兩者間權衡吧——最注重複用和可維護性的地方,面向物件;其他次要的,流程化的,面向過程。

以上。

參考