什么是面向對象編程
面向對象是一種設計思想,面向對象的核心是 類 (class)和 對象 (object),通過類來抽象現實世界,通過對象來模擬現實世界。 面向對象的難點在於抽象,抽象的好壞很大程度決定了整個程序設計的好壞。
面向對象的設計中會有很多的層次結構,然后現實世界很多時候並沒有那么多層次結構, 這時,如果強行用面向對象的設計方式,反而會把問題復雜化,也會讓應對變化沒那么容易,所以產生了 設計模式 這種概念。 設計模式被很多人推崇,個人感覺設計模式進一步讓設計遠離現實世界,把對解決實際問題的關注變為對重構代碼的關注。
當然,面向對象也有它明顯的優勢,在代碼組織上結構清晰,有嚴格的訪問控制,同時簡單易懂,相對於函數式編程,更容易上手。
面向對象的核心概念
- 封裝
- 繼承
- 多態
什么是函數式編程
函數式編程其實是比面向對象更早的編程方式,但是由於其對使用者有更高的要求(主要在代碼組織方面,將實際問題轉換為函數方面), 所有面向對象設計方式出現之后,一度被忽略,成為一種小眾的編程方式。
函數式的編程范式使得它更加適用於復雜數據處理,高並發的環境,這也是函數式編程最近又興起的原因之一。
- 函數是一等公民,也就是函數和變量等其他數據類型一樣使用
- 沒有副作用,函數保持獨立,和外部的交互僅限於 函數參數 和 返回值
函數式編程核心概念
- 不變性
- 純函數
- 高階函數
函數式 和 面向對象 比較
面向對象核心是狀態,函數式核心是數據
所以面向對象更適合對業務(復雜的狀態變化)的設計,而函數式適合對功能(復雜的數據變化)的設計, 我想,這也是面向對象應用廣泛的原因之一,畢竟大部分人接觸的都是業務開發。
隨着面向對象設計方式的發展,理論是越來越完善,復雜度也越來越高,面向對象的設計方式很多時候不再把目光投向實際的問題, 而是追求所謂的設計技巧。 函數式編程則更加直接,將問題轉化為對數據的處理,關注點更容易集中在問題本身。
函數式 和 AI
函數式編程能夠再度火起來,和 AI 也有一定的關系,機器學習本身就是對大量數據的學習和處理,通過數據來訓練出算法。 這種模式更加適合函數式編程,而面向對象面對這種未知結果的學習,抽象會非常困難。