2011-04-07 41 views
24

來自OOP語言,我熟悉面向對象設計的SOLID原則。看起來這些中的一些可能適合功能性編程模型,而其他部分在缺乏狀態的世界中沒有意義。是否有一套類似的重構功能代碼的原則?函數式編程SOLID用於函數式編程

+2

實際上,實質上採用了極端**的SOLID是**在面嚮對象語言中具有不可變狀態的函數式編程。 – TeaDrivenDev 2014-02-18 21:22:20

回答

30

據我所知(我不是專家),固體原則並沒有說明任何關於狀態的內容。它們也應該適用於函數式編程語言。他們對如何實現模塊化提出了更多建議。

其中有些是相當明顯或至少是衆所周知的。單一職責是UNIX原則「做一件事並做得很好」,在「組合」被廣泛使用的功能語言中,這一原則更爲流行。接口隔離原理也非常自然(讓你的接口模塊化並保持正交概念分離)。最後,依賴倒置只是「抽象」的名稱,在函數式編程中是無處不在的。

作爲核心軟件工程概念,「OL」原則Open/Closed和LSP更多地面向基於繼承的語言。功能性語言值/模塊默認沒有開放遞歸,所以「實現繼承」僅用於特定情況。組合物是優選的。我不確定你應該如何解釋該設置中的開放/封閉原則。你可能會認爲它是關於封裝的,哪些功能程序也使用很多,使用抽象類型等。

最後,Liskov替代原則似乎是關於繼承。函數式語言並不總是使用子類型,但是當它們這樣做時,確實假定「派生類型」應該保留「基本類型」的規範。函數式程序員當然要小心地指定和尊重他們的程序,模塊等的接口和屬性,並且可以在編程,重構等基礎上根據這些規範使用代數推理(這相當於這個,所以我可以替代...)等等。然而,一旦你擺脫了「默認繼承」的想法,你的接口違規問題就會少得多,所以LSP不像它在OOP中那樣被強調爲重要的保障。

+0

此評論不僅有助於查看OO和FP之間的鏈接,還有助於更直觀地理解SOLID原則。謝謝。 – lionel 2015-12-02 01:12:13

+0

OCP不受繼承限制,這是一種常見的誤解,可能是因爲它經常用策略模式或模板方法模式來解釋。但是黑盒模塊可以重複使用,並且可以在不改變其內部的情況下進行擴展,只需將參數傳遞給它們(可能是功能性的)就完全與繼承無關。即使是「戰略模式」,使用仿函數而不是戰略對象層次結構實現起來也更簡單。 – 2016-06-18 08:24:22

6

This video介紹了SOLID原則,以及如何在Clojure中應用它們。

它展示了這些原則在OOP中如何保持在功能世界中,因爲我們仍然需要解決相同的基礎問題。總的來說,這讓我覺得功能編程更適合SOLID設計。