如果每個人都討厭OOP,為什麼它仍然如此廣泛傳播? - StackOverflow

banq發表於2020-09-07

OOP取得了巨大的成功。但是成功僅僅是偶然嗎?並且它還能在2020年提供其他程式設計範例無法提供的獨特功能嗎?
在1981年8月的Byte雜誌中,David Robson公開了他的文章,該文章成為許多人進入“ 物件導向的軟體系統 ” 的敲門磚,他承認這與許多熟悉命令式、自上而下的程式設計習慣是背道而馳的。 
“許多不知道計算機如何工作的人都覺得物件導向程式設計的想法很自然。相反,許多有計算機經驗的人最初認為物件導向系統有些奇怪。”
可以說,幾代人以後,將程式碼組織成更大的有意義的物件(對問題的各個部分建模)的想法繼續困擾著程式設計師。如果將它們用於自上而下的程式設計或函數語言程式設計(將程式碼元素視為精確的數學函式),則需要一些時間來習慣。
在OOP最初的大肆宣傳期承諾對模組化和組織大型程式碼庫進行改進之後,想法被過度應用。在OOP之後緊跟著OOA(物件導向分析)和OOD(物件導向設計)之後,感覺就像您在軟體中所做的一切都必須分解為物件及其相互之間的關係一樣。很多評論家發表了非常失望的看法。
一些人聲稱在OOP下程式設計會更加困難,並且需要格外小心地重構。重用程式碼時會產生額外的開銷,Erlang的建立者曾把這種OOP程式碼比喻成:當您需要香蕉但卻抱著吃香蕉的大猩猩。一切都帶有隱性、不可避免的上下文環境。(banq注:老子在道德經中說:大道就像深淵中的魚,當你把魚打撈上來時以為得到大道,其實失去了大道)
命令式和麵向物件的類比:命令式是廚師或化學家,遵循食譜和公式以達到所需的結果;而物件導向是有關的希臘哲學家或19世紀自然主義者用適當的分類法對程式設計世界實現描述。  
 

成功只是巧合嗎? 
目前,OOP仍然是主要的範例之一。但這可能是由於碰巧是OOP的語言的成功所致。Java,C ++和Kotlin統治了Android的移動領域,而Swift和iOS的Objective-C統治了移動領域,因此除非您瞭解物件導向的方法,否則您將無法開發移動軟體。對於網路,它是JavaScript,Python,PHP和Ruby。
為什麼OOP有這麼多被廣泛使用的語言?理查德·費爾德曼(Richard Feldman)在講話中指出,這可能只是巧合。C ++是由Bjarne Stroustrup在1980年代初期開發的,最初是對C程式語言的擴充套件。C ++以C為基礎,增加了物件導向的功能,但Feldman認為它在從C進行整體升級方面變得很流行,包括型別安全性,並增加了對自動資源管理,通用程式設計和異常處理等的支援。
然後Java希望吸引C ++程式設計師,並在OOP方面加倍投入。最終,Sun Microsystems希望透過使採用Java的開發人員最熟悉的方式來重複C ++技巧。 
由於當時Java與Web瀏覽器的獨家整合,數百萬開發人員迅速轉向Java。這樣看來,OOP似乎只是在兜圈,而不是推動成功。
 

OOP可以做什麼呢?
OOP有一些有價值的方面,即使它有缺點,也有一些方面使其無處不在。讓我們看一下OOP的基石。

  • 封裝

這意味著,如果可能的話,通常會將資料從語言的其他部分隱藏起來(放在膠囊中)。OOP預設封裝資料;物件包含資料和影響該資料的方法,良好的OOP實踐意味著您提供了getter和setter方法來控制對資料的訪問。這樣可以防止可變資料被隨意更改,並使應用程式資料更安全。 
據說,這是OOP的最大好處之一。儘管它最常與物件導向的程式設計相關聯,但概念本身實際上與它是分開的,可以在不使用物件的情況下實現。抽象是此處封裝的補充概念。在封裝隱藏內部資訊的地方,抽象提供了易於使用的公共資料介面。在任何情況下,它都不是唯一的OOP功能,並且可以透過隔離系統功能或模組資料以及模組中對這些資料的操作的模組來完成。
  • 繼承

因為可以將物件建立為其他物件的子型別,所以它們可以從那些物件繼承變數和方法。這允許物件支援由先前型別定義的操作,而不必提供自己的定義。目的是不要重複自己—難以維護同一程式碼的多次使用。但是函數語言程式設計也可以透過可重用的函式來實現DRY。記憶體效率也是如此。即使繼承確實對此有所貢獻,FP中的閉包概念也是如此
雖然繼承是物件導向的特定概念,但有人認為相比繼承可以透過組合更好地替代實現。在繼承中物件和方法會變異為結構和過程的語法糖。注意:繼承對於允許多型性也是必要的,我們將在下面討論。
  • 多型性

從字面上講,這種改變形態的概念是允許一個物件或方法(無論是通用物件,介面還是常規物件)充當其他物件和方法的模板。有多種形態的多型性。單個函式可以過載,變形並適應其所在的任何類。物件導向的程式設計傾向於使用許多子型別多型性和ad-hoc多型性,但是同樣,這不限於OOP。 
好像在2020年一樣,OOP並沒有其他程式設計範例可以做的那麼多,而優秀的程式設計師將在克服複雜性的鬥爭中一起使用多種範例中的策略。例如,如果您同時查詢與OOP與函數語言程式設計中相關的最頻繁出現的關鍵詞問題時,則JavaScript會同時出現。 
 

會發生什麼?
但是,OOP取得了巨大的成功。這種成功可能是由OOP支援並受其支援的龐大行業發展的結果。
那麼開發人員自己呢?我們今年的開發人員調查顯示,他們獲得了越來越多的購買影響力。好吧,如果我們也看看開發人員喜歡使用什麼,Haskell和Scala就是最受歡迎的程式語言之一。Scala獲得第二高的薪水。因此,隨著FP函式式傳道越多,他們會爬上名單最流行的語言了。
儘管有一些動靜,但像Twitter這樣的大公司幾乎完全在Scala程式碼上執行其後端。最近一直使用Haskell和許多主要OOP語言的Facebook也採用了函式式功能。.NET具有LINQ和Java 8引入的Lambda。儘管在ES6中引入了類,但是JavaScript的函式越來越強大。Swift可能是介於物件導向和函式語言之間的快樂媒介。因此,也許沒有必要選擇:你可以同時有class Cake和eatCake()。
 

相關文章