來自OOP語言,我熟悉面向對象設計的SOLID原則。看起來這些中的一些可能適合功能性編程模型,而其他部分在缺乏狀態的世界中沒有意義。是否有一套類似的重構功能代碼的原則?函數式編程SOLID用於函數式編程
回答
據我所知(我不是專家),固體原則並沒有說明任何關於狀態的內容。它們也應該適用於函數式編程語言。他們對如何實現模塊化提出了更多建議。
其中有些是相當明顯或至少是衆所周知的。單一職責是UNIX原則「做一件事並做得很好」,在「組合」被廣泛使用的功能語言中,這一原則更爲流行。接口隔離原理也非常自然(讓你的接口模塊化並保持正交概念分離)。最後,依賴倒置只是「抽象」的名稱,在函數式編程中是無處不在的。
作爲核心軟件工程概念,「OL」原則Open/Closed和LSP更多地面向基於繼承的語言。功能性語言值/模塊默認沒有開放遞歸,所以「實現繼承」僅用於特定情況。組合物是優選的。我不確定你應該如何解釋該設置中的開放/封閉原則。你可能會認爲它是關於封裝的,哪些功能程序也使用很多,使用抽象類型等。
最後,Liskov替代原則似乎是關於繼承。函數式語言並不總是使用子類型,但是當它們這樣做時,確實假定「派生類型」應該保留「基本類型」的規範。函數式程序員當然要小心地指定和尊重他們的程序,模塊等的接口和屬性,並且可以在編程,重構等基礎上根據這些規範使用代數推理(這相當於這個,所以我可以替代...)等等。然而,一旦你擺脫了「默認繼承」的想法,你的接口違規問題就會少得多,所以LSP不像它在OOP中那樣被強調爲重要的保障。
此評論不僅有助於查看OO和FP之間的鏈接,還有助於更直觀地理解SOLID原則。謝謝。 – lionel 2015-12-02 01:12:13
OCP不受繼承限制,這是一種常見的誤解,可能是因爲它經常用策略模式或模板方法模式來解釋。但是黑盒模塊可以重複使用,並且可以在不改變其內部的情況下進行擴展,只需將參數傳遞給它們(可能是功能性的)就完全與繼承無關。即使是「戰略模式」,使用仿函數而不是戰略對象層次結構實現起來也更簡單。 – 2016-06-18 08:24:22
This video介紹了SOLID原則,以及如何在Clojure中應用它們。
它展示了這些原則在OOP中如何保持在功能世界中,因爲我們仍然需要解決相同的基礎問題。總的來說,這讓我覺得功能編程更適合SOLID設計。
- 1. 函數式編程函數
- 2. 函數式編程
- 3. 函數式編程教程
- 4. 學習函數式編程
- 5. 函數式編程和Haskell
- 6. SML-函數式編程
- 7. 函數式編程新手
- 8. 函數式編程練習
- 9. Python的函數式編程
- 10. 函數式編程公理
- 11. 求和函數式編程
- 12. 函數式編程文檔
- 13. 函數式編程示例
- 14. 函數式編程或工作流程?
- 15. Ruby中的命令式編程與函數式編程
- 16. 以編程方式調用javascript函數
- 17. 函數式編程使用鏈表
- 18. 函數式編程副作用澄清
- 19. 函數式編程的副作用
- 20. 函數式編程:副作用
- 21. 使用Scala進行函數式編程
- 22. 函數式編程 - 所有參數調用函數
- 23. 使用函數式編程在mathematica中模擬排列函數
- 24. Scala的函數式編程練習
- 25. 函數式編程和邏輯?
- 26. 什麼是zip(函數式編程?)
- 27. 函數式編程的未來
- 28. JS中的函數式編程
- 29. 批處理和函數式編程
- 30. 斯威夫特函數式編程
實際上,實質上採用了極端**的SOLID是**在面嚮對象語言中具有不可變狀態的函數式編程。 – TeaDrivenDev 2014-02-18 21:22:20