"
"
為什麼有這麼多開發者討厭面向對象編程?


關於面向對象編程,有人喜歡它,也有人討厭它。

面向對象編程(OOP)已經存在了很長時間。它是一種編碼風格、一種思想流派、一種學校裡的教授實踐。它的核心思想是將代碼組織成有意義的“對象”,這些“對象”是現實問題的模型,將描述模型各個“狀態”的變量和修改這些變量的方法(子例程或函數)捆綁在一起。

面向對象編程思想與人們在現實世界中思考問題的方式是一致的。他們將代碼組織成有意義的代碼塊,這些代碼塊之間有著各種直接的關係。他們最終得到的是不同類型的對象,這些對象之間進行離散的交互,相互交換數據狀態變更消息。

但在實踐當中,有些批評者聲稱,OOP 並不總是這麼回事。

Ilya Suzdalnitski 是這種“憎恨者”陣營的一員,他是一位高級全棧工程師,上個月發表了一篇 6000 字的文章( https://medium.com/better-programming/object-oriented-programming-the-trillion-dollar-disaster-92a4b666c7c7 ),說 OOP 是“萬億美元的災難”。而且事實證明,他並不是唯一一個有這種強烈感覺的人。在寫完另一篇系列文章後,他發現,“這兩篇文章在一個月內達到了 50 萬的閱讀量”。

Suzdalnitski 說,“OOP 沒能把它本應該要解決的問題解決好”,反而把事情變得更加複雜。OOP 代碼的變量及其可變狀態“在不同的對象之間被隨意共享”。

他在一封電子郵件中寫道:“在大多數情況下,OOP 代碼最終會變成帶有全局狀態的大泥團,任何人都可以隨意修改它”。

Suzdalnitski 還認為,面向對象代碼難以重構,也難以進行單元測試。他在文章中大膽宣稱:“寫出好的、可維護的面向對象代碼很難……”

他寫道:“程序員寶貴的時間和精力都花在思考‘抽象’和‘設計模式’上,而不是解決現實世界中的問題。”

Suzdalnitski 指出了 OOP 的另一個主要問題:併發。他在電子郵件中說:“OOP 生於單核 CPU 時代,那時的程序員不需要擔心併發問題……而函數式編程(還有 Go 語言和 Rust 等)崛起的一個主要原因是它們能夠有效地處理併發問題”。

他在文章最後指出,函數式編程將是更好的選擇。函數式編程是 OOP 的競爭編程範式,在函數式編程中,問題不是被建模成對象,而是純數學函數,並強調要避免讓狀態發生變化。三週後,Suzdalnitski 以欲揚先抑的諷刺性筆調發表了另一篇文章(《不要再嘗試函數式編程了》),對函數式編程大加稱道了一番。

"
為什麼有這麼多開發者討厭面向對象編程?


關於面向對象編程,有人喜歡它,也有人討厭它。

面向對象編程(OOP)已經存在了很長時間。它是一種編碼風格、一種思想流派、一種學校裡的教授實踐。它的核心思想是將代碼組織成有意義的“對象”,這些“對象”是現實問題的模型,將描述模型各個“狀態”的變量和修改這些變量的方法(子例程或函數)捆綁在一起。

面向對象編程思想與人們在現實世界中思考問題的方式是一致的。他們將代碼組織成有意義的代碼塊,這些代碼塊之間有著各種直接的關係。他們最終得到的是不同類型的對象,這些對象之間進行離散的交互,相互交換數據狀態變更消息。

但在實踐當中,有些批評者聲稱,OOP 並不總是這麼回事。

Ilya Suzdalnitski 是這種“憎恨者”陣營的一員,他是一位高級全棧工程師,上個月發表了一篇 6000 字的文章( https://medium.com/better-programming/object-oriented-programming-the-trillion-dollar-disaster-92a4b666c7c7 ),說 OOP 是“萬億美元的災難”。而且事實證明,他並不是唯一一個有這種強烈感覺的人。在寫完另一篇系列文章後,他發現,“這兩篇文章在一個月內達到了 50 萬的閱讀量”。

Suzdalnitski 說,“OOP 沒能把它本應該要解決的問題解決好”,反而把事情變得更加複雜。OOP 代碼的變量及其可變狀態“在不同的對象之間被隨意共享”。

他在一封電子郵件中寫道:“在大多數情況下,OOP 代碼最終會變成帶有全局狀態的大泥團,任何人都可以隨意修改它”。

Suzdalnitski 還認為,面向對象代碼難以重構,也難以進行單元測試。他在文章中大膽宣稱:“寫出好的、可維護的面向對象代碼很難……”

他寫道:“程序員寶貴的時間和精力都花在思考‘抽象’和‘設計模式’上,而不是解決現實世界中的問題。”

Suzdalnitski 指出了 OOP 的另一個主要問題:併發。他在電子郵件中說:“OOP 生於單核 CPU 時代,那時的程序員不需要擔心併發問題……而函數式編程(還有 Go 語言和 Rust 等)崛起的一個主要原因是它們能夠有效地處理併發問題”。

他在文章最後指出,函數式編程將是更好的選擇。函數式編程是 OOP 的競爭編程範式,在函數式編程中,問題不是被建模成對象,而是純數學函數,並強調要避免讓狀態發生變化。三週後,Suzdalnitski 以欲揚先抑的諷刺性筆調發表了另一篇文章(《不要再嘗試函數式編程了》),對函數式編程大加稱道了一番。

為什麼有這麼多開發者討厭面向對象編程?


讀者的反應

Suzdalnitski 敢於挑戰 OOP 編程範式的論調激起了其他開發者的強烈反應。Suzdalnitski 的第一篇文章在 Medium 上得到了 174 個回覆,其中有一個來自德克薩斯州的軟件工程師 Jesse Dickey,他說 OOP 這個名字本身就是一個錯誤。“你不是在用對象編程,而是用類。所以,你可以把它叫作面向類編程……”他後來補充說,更準確地說,類應該是“自定義類型”。

Suzdalnitski 第一篇文章的鏈接也出現在了 Reddit 的 10 個討論話題中,開發者開始對哪種編程範式更好產生了尖銳的分歧——是函數式編程還是面向對象編程:

“我使用的是 OOP 語言,但卻以 FP(函數式編程)的方式編寫代碼(大部分是 TypeScript)。函數和數據是相互獨立的。與 FP 相比,重構一個混亂的 OOP 代碼庫簡直是一場噩夢……”“我研究了一下‘純函數式編程’,但感覺這就是一場災難,就像是在沒有電子表格軟件的情況下處理電子表格……”

很快,他們開始爭論問題到底是該歸咎於編程範式還是程序員本身。

“軟件應該由普通程序員開發來開發,而不是精英程序員。如果你的編程範式或技術棧需要精英程序員,那麼隨著時間的推移,很可能會以失敗告終,因為精英程序員很難留住……”“OOP 傾向於讓代碼變得混亂,而函數式編程傾向於讓事情變得儘可能清晰……”
"
為什麼有這麼多開發者討厭面向對象編程?


關於面向對象編程,有人喜歡它,也有人討厭它。

面向對象編程(OOP)已經存在了很長時間。它是一種編碼風格、一種思想流派、一種學校裡的教授實踐。它的核心思想是將代碼組織成有意義的“對象”,這些“對象”是現實問題的模型,將描述模型各個“狀態”的變量和修改這些變量的方法(子例程或函數)捆綁在一起。

面向對象編程思想與人們在現實世界中思考問題的方式是一致的。他們將代碼組織成有意義的代碼塊,這些代碼塊之間有著各種直接的關係。他們最終得到的是不同類型的對象,這些對象之間進行離散的交互,相互交換數據狀態變更消息。

但在實踐當中,有些批評者聲稱,OOP 並不總是這麼回事。

Ilya Suzdalnitski 是這種“憎恨者”陣營的一員,他是一位高級全棧工程師,上個月發表了一篇 6000 字的文章( https://medium.com/better-programming/object-oriented-programming-the-trillion-dollar-disaster-92a4b666c7c7 ),說 OOP 是“萬億美元的災難”。而且事實證明,他並不是唯一一個有這種強烈感覺的人。在寫完另一篇系列文章後,他發現,“這兩篇文章在一個月內達到了 50 萬的閱讀量”。

Suzdalnitski 說,“OOP 沒能把它本應該要解決的問題解決好”,反而把事情變得更加複雜。OOP 代碼的變量及其可變狀態“在不同的對象之間被隨意共享”。

他在一封電子郵件中寫道:“在大多數情況下,OOP 代碼最終會變成帶有全局狀態的大泥團,任何人都可以隨意修改它”。

Suzdalnitski 還認為,面向對象代碼難以重構,也難以進行單元測試。他在文章中大膽宣稱:“寫出好的、可維護的面向對象代碼很難……”

他寫道:“程序員寶貴的時間和精力都花在思考‘抽象’和‘設計模式’上,而不是解決現實世界中的問題。”

Suzdalnitski 指出了 OOP 的另一個主要問題:併發。他在電子郵件中說:“OOP 生於單核 CPU 時代,那時的程序員不需要擔心併發問題……而函數式編程(還有 Go 語言和 Rust 等)崛起的一個主要原因是它們能夠有效地處理併發問題”。

他在文章最後指出,函數式編程將是更好的選擇。函數式編程是 OOP 的競爭編程範式,在函數式編程中,問題不是被建模成對象,而是純數學函數,並強調要避免讓狀態發生變化。三週後,Suzdalnitski 以欲揚先抑的諷刺性筆調發表了另一篇文章(《不要再嘗試函數式編程了》),對函數式編程大加稱道了一番。

為什麼有這麼多開發者討厭面向對象編程?


讀者的反應

Suzdalnitski 敢於挑戰 OOP 編程範式的論調激起了其他開發者的強烈反應。Suzdalnitski 的第一篇文章在 Medium 上得到了 174 個回覆,其中有一個來自德克薩斯州的軟件工程師 Jesse Dickey,他說 OOP 這個名字本身就是一個錯誤。“你不是在用對象編程,而是用類。所以,你可以把它叫作面向類編程……”他後來補充說,更準確地說,類應該是“自定義類型”。

Suzdalnitski 第一篇文章的鏈接也出現在了 Reddit 的 10 個討論話題中,開發者開始對哪種編程範式更好產生了尖銳的分歧——是函數式編程還是面向對象編程:

“我使用的是 OOP 語言,但卻以 FP(函數式編程)的方式編寫代碼(大部分是 TypeScript)。函數和數據是相互獨立的。與 FP 相比,重構一個混亂的 OOP 代碼庫簡直是一場噩夢……”“我研究了一下‘純函數式編程’,但感覺這就是一場災難,就像是在沒有電子表格軟件的情況下處理電子表格……”

很快,他們開始爭論問題到底是該歸咎於編程範式還是程序員本身。

“軟件應該由普通程序員開發來開發,而不是精英程序員。如果你的編程範式或技術棧需要精英程序員,那麼隨著時間的推移,很可能會以失敗告終,因為精英程序員很難留住……”“OOP 傾向於讓代碼變得混亂,而函數式編程傾向於讓事情變得儘可能清晰……”
為什麼有這麼多開發者討厭面向對象編程?


作者的想法

面對讀者的激烈反應,Suzdalnitski 作何感想?

Suzdalnitski 在郵件中寫道:“我一生中的大部分時間都在編程。我獲得的經驗越多,就越開始意識到我以前寫的代碼有多糟糕,真的很糟糕。這些年來,我花了大量時間學習 OOP,但具有諷刺意味的是,我得到的回報非常少……”

即使是簡單的功能也需要“大量時間”來實現,而且代碼庫越大,實現起來就越困難。

“問題越來越多,而且問題出現得越來越頻繁”。

2014 年,Suzdalnitski 發現了 F#——微軟在 2010 年發佈的多範式編程語言。

“這門語言看起來很奇怪,但同時又很優雅……從那時候開始,函數式編程的想法一直縈繞在我腦海裡”。

"
為什麼有這麼多開發者討厭面向對象編程?


關於面向對象編程,有人喜歡它,也有人討厭它。

面向對象編程(OOP)已經存在了很長時間。它是一種編碼風格、一種思想流派、一種學校裡的教授實踐。它的核心思想是將代碼組織成有意義的“對象”,這些“對象”是現實問題的模型,將描述模型各個“狀態”的變量和修改這些變量的方法(子例程或函數)捆綁在一起。

面向對象編程思想與人們在現實世界中思考問題的方式是一致的。他們將代碼組織成有意義的代碼塊,這些代碼塊之間有著各種直接的關係。他們最終得到的是不同類型的對象,這些對象之間進行離散的交互,相互交換數據狀態變更消息。

但在實踐當中,有些批評者聲稱,OOP 並不總是這麼回事。

Ilya Suzdalnitski 是這種“憎恨者”陣營的一員,他是一位高級全棧工程師,上個月發表了一篇 6000 字的文章( https://medium.com/better-programming/object-oriented-programming-the-trillion-dollar-disaster-92a4b666c7c7 ),說 OOP 是“萬億美元的災難”。而且事實證明,他並不是唯一一個有這種強烈感覺的人。在寫完另一篇系列文章後,他發現,“這兩篇文章在一個月內達到了 50 萬的閱讀量”。

Suzdalnitski 說,“OOP 沒能把它本應該要解決的問題解決好”,反而把事情變得更加複雜。OOP 代碼的變量及其可變狀態“在不同的對象之間被隨意共享”。

他在一封電子郵件中寫道:“在大多數情況下,OOP 代碼最終會變成帶有全局狀態的大泥團,任何人都可以隨意修改它”。

Suzdalnitski 還認為,面向對象代碼難以重構,也難以進行單元測試。他在文章中大膽宣稱:“寫出好的、可維護的面向對象代碼很難……”

他寫道:“程序員寶貴的時間和精力都花在思考‘抽象’和‘設計模式’上,而不是解決現實世界中的問題。”

Suzdalnitski 指出了 OOP 的另一個主要問題:併發。他在電子郵件中說:“OOP 生於單核 CPU 時代,那時的程序員不需要擔心併發問題……而函數式編程(還有 Go 語言和 Rust 等)崛起的一個主要原因是它們能夠有效地處理併發問題”。

他在文章最後指出,函數式編程將是更好的選擇。函數式編程是 OOP 的競爭編程範式,在函數式編程中,問題不是被建模成對象,而是純數學函數,並強調要避免讓狀態發生變化。三週後,Suzdalnitski 以欲揚先抑的諷刺性筆調發表了另一篇文章(《不要再嘗試函數式編程了》),對函數式編程大加稱道了一番。

為什麼有這麼多開發者討厭面向對象編程?


讀者的反應

Suzdalnitski 敢於挑戰 OOP 編程範式的論調激起了其他開發者的強烈反應。Suzdalnitski 的第一篇文章在 Medium 上得到了 174 個回覆,其中有一個來自德克薩斯州的軟件工程師 Jesse Dickey,他說 OOP 這個名字本身就是一個錯誤。“你不是在用對象編程,而是用類。所以,你可以把它叫作面向類編程……”他後來補充說,更準確地說,類應該是“自定義類型”。

Suzdalnitski 第一篇文章的鏈接也出現在了 Reddit 的 10 個討論話題中,開發者開始對哪種編程範式更好產生了尖銳的分歧——是函數式編程還是面向對象編程:

“我使用的是 OOP 語言,但卻以 FP(函數式編程)的方式編寫代碼(大部分是 TypeScript)。函數和數據是相互獨立的。與 FP 相比,重構一個混亂的 OOP 代碼庫簡直是一場噩夢……”“我研究了一下‘純函數式編程’,但感覺這就是一場災難,就像是在沒有電子表格軟件的情況下處理電子表格……”

很快,他們開始爭論問題到底是該歸咎於編程範式還是程序員本身。

“軟件應該由普通程序員開發來開發,而不是精英程序員。如果你的編程範式或技術棧需要精英程序員,那麼隨著時間的推移,很可能會以失敗告終,因為精英程序員很難留住……”“OOP 傾向於讓代碼變得混亂,而函數式編程傾向於讓事情變得儘可能清晰……”
為什麼有這麼多開發者討厭面向對象編程?


作者的想法

面對讀者的激烈反應,Suzdalnitski 作何感想?

Suzdalnitski 在郵件中寫道:“我一生中的大部分時間都在編程。我獲得的經驗越多,就越開始意識到我以前寫的代碼有多糟糕,真的很糟糕。這些年來,我花了大量時間學習 OOP,但具有諷刺意味的是,我得到的回報非常少……”

即使是簡單的功能也需要“大量時間”來實現,而且代碼庫越大,實現起來就越困難。

“問題越來越多,而且問題出現得越來越頻繁”。

2014 年,Suzdalnitski 發現了 F#——微軟在 2010 年發佈的多範式編程語言。

“這門語言看起來很奇怪,但同時又很優雅……從那時候開始,函數式編程的想法一直縈繞在我腦海裡”。

為什麼有這麼多開發者討厭面向對象編程?


“危險的 OOP”

多年來,他開始將函數式編程思想應用到他的 C#代碼中。隨後,他所在的公司完成了向 JavaScript 的遷移。從那天起,“我非常努力地尋找 OOP 的使用場景,但從來沒有找到過”。

“在使用非 OOP 語言時,比如 JavaScript,函數可以獨立於對象存在。我們再也不用為了包含這些函數而去發明一些奇怪的概念(比如 SomethingManager),這真是一種解脫。”

這一切都讓他相信“OOP 是危險的。OOP 程序固有的非確定性讓代碼變得不可靠”。程序在運行時會有很多不同的路徑,因為會有很多不同的對象,而且會不斷動態創建出新的對象。“這種看似無辜的編程範式對世界經濟造成的破壞性影響是人們難以理解的”。

他知道他的觀點會讓一些人感到生氣。但在文章瀏覽量達到 50 萬之後,他有沒有聽到什麼可以讓他改變主意的東西,或者從另一個角度看問題呢?

Suzdalnitski 表示,“有一條評論引起了我的注意”。一個讀者評論說,現在存在著一種制度潛流,這種潛流導致不斷產生大量 OOP 程序員。“對於管理者來說,繼續使用 OOP 是有道理的,因為廉價的 OOP 開發者遍地都是,很多應屆畢業生都熟悉 OOP”。但 Suzdalnitski 認為他們最終會為此付出代價。或者,換句話說,“OOP 之所以流行,是因為廉價的 OOP 開發者隨處可見,而函數式程序員通常更聰明、更貴……”

“當然,交付 OOP 產品通常需要更長的時間,不僅難以維護,而且由於 OOP 的非確定性,通常會有很多 bug”。

這也就是為什麼 Suzdalnitski 開始在網上發表他的文章,因為“如果我能激勵一千個人質疑 OOP 的好處,並嘗試函數式編程,那麼他們將會寫出更好、更可靠的代碼。”

他認為自己成功了,他的文章瀏覽量達到了 50 萬,讓世界走上了一條新道路。這條道路通往另一個世界,在這個新世界裡,有更快樂的開發者、更快樂的用戶和更省錢的公司……

"

相關推薦

推薦中...