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

来源:https://www.cnblogs.com/shine-lee/archive/2018/11/29/10040102.html
-Advertisement-
Play Games

博客: "blog.shinelee.me" | "博客園" | "CSDN" [TOC] 面向過程與面向對象的思考方式 面向過程 和 面向對象 的差異主要體現在 思考方式 上,面對同樣一個任務, 面向過程的思考方式 ,首先想的是 一步步該怎麼做 , 對任務進行分解,先乾什麼後乾什麼,劃分成不同階段 ...


目錄

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

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

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

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

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

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

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

如果以開公司為例的話:

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

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

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

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

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

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

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

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

如何選擇

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

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

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

一般而言:

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

以上。

參考


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、js判斷數組是否為空 方法一: arr.length 二、js判斷數組是否含有某個值 方法一: arr.indexOf() 方法二: for迴圈結合if判斷 方法三: arr.find(callback) ...
  • 1.解構賦值可以輕鬆獲取對象或者數組中的數據 結果: json中的數據就被輕鬆獲取; 2.解構複製可以交換變數 結果: a=4,b=3,c=2,d=1 賦值的過程需要保證兩邊的數據格式匹配 [a,b,c,d]=[d,c,b,]; d的值將為underfinded 3.對象的解構賦值 結果,666,8 ...
  • inputNumber算是一個比較簡單的組件了。 解析: (1)先看下html結構 左邊的減號和右邊的加號是通過絕對定位,設置在input左右的padding位置的,input的css代碼如下: 這個inputNumber源碼還算簡單,多看幾遍就懂了 ...
  • The web is constantly evolving. The technology was conceived and implemented based on the needs, current at the time of creation. The business require... ...
  • url的正則表達式:包括IP,功能變數名稱(domain),ftp,二級功能變數名稱,功能變數名稱中的文件,功能變數名稱加上埠!用戶名等等信息 匹配手機號 用戶名正則,4到16位(字母,數字,下劃線,減號) 密碼強度正則 整數正則 數字正則 Email正則 身份證號正則 URL正則 IPv4地址正則 十六進位顏色正則 日期正則 ...
  • 一、事件流(捕獲,冒泡) 事件流:指從頁面中接收事件的順序,有冒泡流和捕獲流。 當頁面中發生某種事件(比如滑鼠點擊,滑鼠滑過等)時,毫無疑問子元素和父元素都會接收到該事件,可具體順序是怎樣的呢?冒泡和捕獲則描述了兩種不同的順序。 DOM2級事件規定事件流包括三個階段,如圖: 假如我們點擊一個div, ...
  • 一定的需求情況下,無法使用小程式原生的 tabbar 的時候,需要自行實現一個和 tabbar 功能一模一樣的自製組件。 查閱了海量的博客和文檔之後,親自踩坑。總結了三種在不使用微信小程式原生 tabbar的情況下自製 tabbar 的方法。並說說這幾種方法各自的特色。 類 navigator 跳轉 ...
  • 小程式冒泡事件與非冒泡事件 會隨之觸發父元素的稱為冒泡事件,反之,則是非冒泡事件 wxml: wxss: js(在page里添加): 頁面效果: 點擊view1: 點擊view2,也會觸發父元素 點擊view3,會觸發view2,然後再觸發view3 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...