重新思考面向過程與面向對象


博客:blog.shinelee.me | 博客園 | CSDN

面向過程與面向對象的思考方式

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

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

  • 對任務進行分解,先干什么后干什么,划分成不同階段的子任務
  • 對每個階段的子任務進一步分解,形成函數,根據輸入輸出將所需數據整理為數據結構
  • 將任務串接起來,完成總任務
  • 重構,將重復工作抽象成單獨的函數
  • 復用的單元是函數

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

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

如果以開公司為例的話:

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

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

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

面向對象的思考方式偏抽象、偏數據、偏象形,像上帝模式,像老板視角,各個利益相關方仿佛具有了生命,它們之間通過相互配合完成任務

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

面向過程與面向對象的聯系

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

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

如何選擇

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

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

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

一般而言:

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

以上。

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM