本文轉載自【微信公眾號:五角錢的程式設計師,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等一般採用面向過程開發,性能是最重要的因素。
缺點:沒有面向對象易維護、易復用、易擴展
面向對象:
優點:易維護、易復用、易擴展,由於面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統 更加靈活、更加易於維護
缺點:性能比面向過程低