你真的知道面向過程和面向對象的區別嗎?

2020-12-10 酷扯兒

本文轉載自【微信公眾號:五角錢的程式設計師,ID:xianglin965】,經微信公眾號授權轉載,如需轉載與原文作者聯繫

作者丨BossXiang 圖丨pexels

在面試時經常會被問到面向過程和面向對象有什麼區別,雖然都是編程的一種思想,但是他們的側重點不同,我們從以下幾個方面進行簡單總結。

/01/

1. 面向過程

面向過程是一種以事件為中心的編程思想,編程的時候把解決問題的步驟分析出來,然後用函數把這些步驟實現,在一步一步的具體步驟中再按順序調用函數。

舉個例子,下五子棋,面向過程的設計思路是首先分析解決這個問題的步驟:

(1)開始遊戲(2)黑子先走(3)繪製畫面(4)判斷輸贏(5)輪到白子(6)繪製畫面(7)判斷輸贏(8)返回步驟 (9)輸出最後結果。

用函數實現上面一個一個的步驟,然後在下五子棋的主函數裡依次調用上面的函數(不同的程式語言有不同的調用方法,我這裡寫的是直接調用):

下五子棋{開始遊戲();黑子先走();繪製畫面();判斷輸贏();輪到白子();繪製畫面();判斷輸贏();返回到 黑子先走();輸出最後結果;}

可見,面向過程始終關注的是怎麼一步一步地判斷棋局輸贏的,通過控制代碼,從而實現函數的順序執行。

/02/

2. 面向對象

在日常生活或編程中,簡單的問題可以用面向過程的思路來解決,直接有效,但是當問題的規模變得更大時,用面向過程的思想是遠遠不夠的。所以慢慢就出現了面向對象的編程思想。世界上有很多人和事物,每一個都可以看做一個對象,而每個對象都有自己的屬性和行為,對象與對象之間通過方法來交互。面向對象是一種以「對象」為中心的編程思想,把要解決的問題分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個對象在整個解決問題的步驟中的屬性和行為。

在下五子棋的例子中,用面向對象的方法來解決的話,首先將整個五子棋遊戲分為三個對象:

(1)黑白雙方,這兩方的行為是一樣的。

(2)棋盤系統,負責繪製畫面

(3)規則系統,負責判定犯規、輸贏等。

然後賦予每個對象一些屬性和行為:

(4)第一類對象(黑白雙方)負責接受用戶輸入,並告知第二類對象(棋盤系統)棋子布局的變化,棋盤系統接收到了棋子的變化,並負責在屏幕上面顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行判定。

可以看出,面向對象是以功能來劃分問題,而不是以步驟解決。比如繪製畫面這個行為,在面向過程中是分散在了多個步驟中的,可能會出現不同的繪製版本,所以要考慮到實際情況進行各種各樣的簡化。而面向對象的設計中,繪圖只可能在棋盤系統這個對象中出現,從而保證了繪圖的統一。

/03/

3、面向對象和面向過程的區別

之前在博客上看到這個比喻,覺得特別恰當,挺容易讓人理解的,現在分享一下:

用面向過程的方法寫出來的程序是一份蛋炒飯,而用面向對象寫出來的程序是一份蓋澆飯。所謂蓋澆飯,北京叫蓋飯,東北叫燴飯,廣東叫碟頭飯,就是在一碗白米飯上面澆上一份蓋菜,你喜歡什麼菜,你就澆上什麼菜。我覺得這個比喻還是比較貼切的。

蛋炒飯製作的細節,我不太清楚,因為我沒當過廚師,也不會做飯,但最後的一道工序肯定是把米飯和雞蛋混在一起炒勻。蓋澆飯呢,則是把米飯和蓋菜分別做好,你如果要一份紅燒肉蓋飯呢,就給你澆一份紅燒肉;如果要一份青椒土豆蓋澆飯,就給澆一份青椒土豆絲。

蛋炒飯的好處就是入味均勻,吃起來香。如果恰巧你不愛吃雞蛋,只愛吃青菜的話,那麼唯一的辦法就是全部倒掉,重新做一份青菜炒飯了。蓋澆飯就沒這麼多麻煩,你只需要把上面的蓋菜撥掉,更換一份蓋菜就可以了。蓋澆飯的缺點是入味不均,可能沒有蛋炒飯那麼香。

到底是蛋炒飯好還是蓋澆飯好呢?其實這類問題都很難回答,非要比個上下高低的話,就必須設定一個場景,否則只能說是各有所長。如果大家都不是美食家,沒那麼多講究,那麼從飯館角度來講的話,做蓋澆飯顯然比蛋炒飯更有優勢,他可以組合出來任意多的組合,而且不會浪費。

蓋澆飯的好處就是」菜」「飯」分離,從而提高了製作蓋澆飯的靈活性。飯不滿意就換飯,菜不滿意換菜。用軟體工程的專業術語就是」可維護性「比較好,」飯」 和」菜」的耦合度比較低。蛋炒飯將」蛋」「飯」攪和在一起,想換」蛋」「飯」中任何一種都很困難,耦合度很高,以至於」可維護性」比較差。軟體工程追求的目標之一就是可維護性,可維護性主要表現在3個方面:可理解性、可測試性和可修改性。面向對象的好處之一就是顯著的改善了軟體系統的可維護性。

/04/

四、總結

面向過程:

優點:性能比面向對象高,因為類調用時需要實例化,開銷比較大,比較消耗資源;比如單片機、嵌入式開發、 Linux/Unix等一般採用面向過程開發,性能是最重要的因素。

缺點:沒有面向對象易維護、易復用、易擴展

面向對象:

優點:易維護、易復用、易擴展,由於面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統 更加靈活、更加易於維護

缺點:性能比面向過程低

相關焦點

  • TIA Portal面向對象編程入門
    軟體工程從面向過程編程發展到面向對象編程(OOP:Object-Oriented
  • opencv-python獲取圖像:面向對象與面向過程
    關於圖片的來源:1973年6月,美國南加州大學的信號圖像處理研究所的一個助理教授和他的一個研究生打算為了一個學術會議找一張數字照片,而他們對於手頭現有成堆"無聊"照片感到厭煩。事實上他們需要的是一個人臉照片,同時又能讓人眼前一亮。這時正好有人走進實驗室,手上帶著一本當時的花花公子雜誌,結果故事發生了……而限於當時實驗室設備和測試圖片的需要,lenna的圖片只摳到了原圖的肩膀部分。
  • 「面向對象就是一個錯誤!」
    然而,C++和 Java 都是比較主流的面向對象語言。面向對象編程的流行是計算機科學領域的不幸,它對現代經濟造成了極大的破壞,造成了數萬億美元的間接損失。在過去的三十年中,幾乎所有行業都因潛在的面向對象編程危機而受到影響。為什麼面向對象編程如此危險?下面我們一起來尋找答案。
  • 面向對象編程會被拋棄嗎?這五大問題不容忽視
    這樣就可以將一些數據和那些只在相關數據上使用的函數耦合起來。 注意,這僅涵蓋封裝的概念。也就是說,位於對象內部的數據和函數對於外部是不可見的。我們只能通過消息(通常通過 getter 和 setter 函數)與對象的內容進行交互。 繼承性和多態性並沒有包含在最初的設計想法中,但是對於現在的面向對象編程而言是必需的。
  • 如何使用JavaScript -面向對象編程
    提示:每個對象都是基於一個引用類型創建的,這些類型可以是系統內置的原生類型,也可以是開發人員自定義的類型。什麼是面向對象面向對象不是新的東西,它只是過程式代碼的一種高度封裝,目的在於提高代碼的開發效率和可維護性。
  • JavaScript-面向對象中有哪些屬性和方法?
    對象則指的是類的實例。它將對象作為程序的基本單元,將程序和數據封裝其中,以提高軟體的重用性、靈活性和擴展性,對象裡的程序可以訪問及經常修改對象相關連的數據。舉個最簡單點的例子來區分 面向過程和面向對象有一天你想吃魚香肉絲了,怎麼辦呢?
  • 專家解析UML面向對象分析過程及包含圖形
    專家解析UML面向對象分析過程及包含圖形 本文向大家介紹一下UML面向對象分析及其包括的圖、建模步驟,在學習UML建模語言的過程中,你可能會遇到UML面向對象問題,這裡和大家分享一下。
  • 高級篇PLC的面向對象編程
    繼承」,甚至於它根本就不具備面向對象程式語言的特點,但面向對象編程的基本概念就是類和類的實例(即對象),我們只需要使用這種概念就可以了。在計算機編程中我們需要把一些事物抽象和歸納,才能編寫類,而在工業控制系統中,控制對象如:電機,閥等等是很明顯的控制類別,不需要抽象就可以很明顯的針對它們編寫類,以下將會用到西門子的Step7程式語言和施奈德的Unity 程式語言來講解PLC的面向對象編程。
  • 真的可以用C語言實現面向對象編程OOP
    解釋區分一下C語言和OOP 我們經常說C語言是面向過程的,而C++是面向對象的,然而何為面向對象,什麼又是面向過程呢?不管怎麼樣,我們最原始的目標只有一個就是實現我們所需要的功能,從這一點說它們是殊途同歸的。
  • 真的可以,用C語言實現面向對象編程OOP
    解釋區分一下C語言和OOP我們經常說C語言是面向過程的,而C++是面向對象的,然而何為面向對象,什麼又是面向過程呢?不管怎麼樣,我們最原始的目標只有一個就是實現我們所需要的功能,從這一點說它們是殊途同歸的。過程與對象只是側重點不同而已。
  • CSharp基礎知識-面向對象
    面向對象面向對象是一個抽象的概念,其本質就是對事物以抽象的方式建立對應的模型。 簡單來講,比如我有一隻鋼筆,那麼我就可以通過分析,可以得到 這隻鋼筆的材第是塑料,品牌是個雜牌 ,裡面裝的墨是黑色的,可以用。
  • Java面向對象編程開發認證考試項目介紹
    1、證書頒發機構介紹工業和信息化部人才交流中心(以下簡稱中心)創建於1985年1月,1992年10
  • Golang入門教程——面向對象篇
    golang作為一門剛剛誕生十年的新興語言自然是支持面向對象的,但是golang當中面向對象的概念和特性與我們之前熟悉的大部分語言都不盡相同。比如Java、Python等,相比之下, golang這個部分的設計非常得簡潔和優雅(仁者見仁),所以即使你之前沒有系統地了解過面向對象,也沒有關係,也一定能夠看懂。
  • Python入門基礎之面向對象二:類和實例、方法
    前面一篇文章我介紹了python面向對象的基本知識,連結在最下面。初步解釋了面向對象和面向對象的優點,今天就開始正式用代碼來展現面向對象。1、利用class創建類Python中,創建類的語句是如下所示先解釋一下,class後面跟的是類名,括號裡面是基類(也成為父類)python3中默認繼承object。
  • Python面向對象程式語言
    Python (發音:[ 'paiθ(ə)n; (US) 'paiθɔn ]n.蟒蛇,巨蛇 ),是一種面向對象的解釋性的電腦程式設計語言,也是一種功能強大而完善的通用型語言,已經具有十多年的發展歷史一個用編譯性語言比如C或C++寫的程序可以從源文件(即 C或C++語言)轉換到一個你的計算機使用的語言(二進位代碼,即0和1)。這個過程通過編譯器和不同的標記、選項完成。當你運行你的程序的時候,連接/ 轉載器軟體把你的程序從硬碟複製到內存中並且運行。而Python語言寫的程序不需要編譯成二進位代碼。你可以直接從原始碼 運行 程序。
  • 好好理解 Python 面向對象中的多繼承和super
    ok,以下是 VIP 基礎階段的試看文:Python快速入門 | 好好理解 Python 面向對象中的多繼承和super咱們上一篇講到了繼承,說到了子類和父類之間的關係,父類也叫作基類、超類,也就是 super class ,上次我們說要在子類使用父類定義的東西,就需要用到 super 方法,有些朋友不太理解:不是說子類繼承了父類,就直接都擁有了父類的東西了麼
  • Python面向對象編程的基本概念
    面向對象程序設計(OOP)與面向過程程序設計(POP)OOP的主要概念什麼是課程?對象和對象實例化類方法Python類中的繼承封裝形式多態性數據抽象什麼是面向對象的編程?面向對象編程(OOP)就是創建「對象」。對象是一組相互關聯的變量和函數。這些變量通常稱為對象的屬性,而功能則稱為對象的行為。這些對象為程序提供了更好,更清晰的結構。例如,汽車可以是物體。
  • Java基礎教學之面向對象概述
    面向對象概述尹成課程資料及演示AAAjiaoyuwang面向對象是一種符合人類思維習慣的編程思想。現實生活中存在各種形態不同的事物,這些事物之間存在著各種各樣的聯繫。在程序中使用對象來映射現實中的事物,使用對象的關係來描述事物之間的聯繫,這種思想就是面向對象。
  • 學會面向對象要知道的五大原則
    面向對象設計原則是OOPS編程的核心,但大多數Java程式設計師熱心於像Singleton (單例) 、 Decorator(裝飾器)、Observer(觀察者) 等設計模式,而沒有把足夠多的注意力放在學習面向對象的分析和設計上面。
  • 面向對象聖經
    有人寫了一個程序,用一個數據結構和函數實現了一個簡單的棧。上帝說:「要有Class!把這些重複的方法代碼從對象中剝離出來,放到一個公共的Class中!」上帝說:「隨你嘍!」還有人說:「這不又回到我們原始的狀態去了嗎?  void push(Stack *s,int data)」上帝告誡說:「雖然本質相同,但是表達形式不同,之前你在語法層面必須傳遞一個Stack 對象到函數,現在在語法層面不用加了。我會在編譯後的代碼,或者運行時自動給你們加上。」