OOP和FP的區別
首先確定什麼是OOP和什麼是FP?
什麼是OOP?
為了真正掌握這一理念,我強烈建議您關注 ofollow,noindex" target="_blank">Alan Kay 的工作。當然,他並不是這種模式背後唯一的人,但我發現他的解釋非常明確。這個 主題演講 是一個良好的開端。簡而言之,艾倫(除了其他知識)擁有生物學博士學位。複雜生物的工作方式基本上是啟發OOP正規化的原因。
換句話說:通過專門元件協作來實現複雜的任務。每個元件都可以是獨立的,不需要了解整個系統。
他們只是合作,在需要某些訊息時收到訊息,並在他們為系統做了一些有意義的事情時傳送訊息。這些元件如何進行通訊,以及如何管理它們之間的編排不是由範例強加的。不同的語言使用了不同的實現。但是這種獨立元件協作的概念是OOP的核心概念。
什麼是FP
函式程式設計不是在生物學領域尋找靈感,而是植根於數學。我將引用Philip Wadler給出一個更好的定義:
“ 純函式式語言中的程式是作為一組方程式編寫的。顯式資料流確保表示式的值僅取決於其自由變數。因此,將等號一邊替換為另外一邊總是有效的,這使得這些程式特別易於推理。[...]顯式資料流也確保計算順序無關緊要,使[函式]程式容易受到惰性評估。“
他的意思是什麼?如果我寫X = A + B,或Y = C * DI不關心A和B,或C和D的值。這是一個數學方程,它代表了所有有效值的概念。型別A和B,或型別C和D的乘法。因此我可以用Y組成X,並做替換:X >> Y =(A + B)>> Y = X >>(C * D)=( A + B)>>(C * D)
(>>是F#中的合成運算子)
如果這些值中的任何一個有可能在我的範圍之外改變(變異),那麼所有這些推理都不再成立。更糟糕的是,如果不僅值,而且型別可以改變。這就是我們在FP中說的原因,我們可以編寫只在本地邏輯有效的程式碼。我知道我的“方程式”(或純函式)總是正確的,不需要考慮世界其他地方來確保這一點。
請注意,這種“本地思維”的意願也可以在OOP的“獨立元件”中找到。但與OOP相反,由於數學原因,FP解釋瞭如何實現它。
哪一個是最好的?
最後,整個行業多年來一直在尋找答案。問題應該改為:在我的背景下哪一個是最好的?現在我們可以開始談談了。
您擁有的約束越多,編寫的程式碼就越難,從長遠來看維護程式碼就越容易。什麼是程式碼約束?我們有許多取決於語言:語法,不變性,無副作用,單元測試,型別和依賴型別。
是否更快地編寫程式碼或擁有長期可維護程式碼?在開始啟動的時候,我可能需要快速生成程式碼,直到找到好的產品。在涉及活的變化的關鍵環境中,我可能想要一些強大的東西,即使我需要1年的時間來編寫它。
當然,從“快速和骯髒”到“數學上強大”的所有尺度都可能取決於您的背景上下文。
只是工具
函式程式設計本質上比面向物件程式設計更受限制。因為它禁止可變性和副作用。當語言也使用型別時,它會產生強大的概念,如型別驅動開發,我們可以通過設計從系統中刪除無效狀態,使其在執行時更加健壯。當語言也使用依賴型別時,我們甚至可以將業務規則編碼為型別,以避免在不滿足業務規則時進行編譯。缺點是:它難以編寫。
但是當你完成函式的編寫後,你可以相信這句名言“如果它能編譯,它就很有效”。維護此程式碼通常比龐大的OO程式碼庫更容易,因為由於純函式,我們可以使用本地推理來維護系統。請注意我前一句中的“通常”。
FP難以編寫,但易於維護(更容易推理)。OOP更容易編寫,但更難維護(由於副作用而難以推理)。