SOLID用于函数式编程

时间:2011-04-07 06:46:45

标签: functional-programming solid-principles

来自OOP语言,我熟悉面向对象设计的SOLID原则。似乎其中一些适合功能性编程模型,而其他部分在缺乏状态的世界中毫无意义。重构功能代码是否有类似的原则?

4 个答案:

答案 0 :(得分:37)

据我所知(我不是专家),SOLID原则并没有说明状态。它们也应该适用于函数式编程语言。他们对如何实现模块化提出了更多建议。

其中一些相当明显或至少是众所周知的。单一责任是UNIX原则“做一件事,做得好”,在“组合”被广泛使用的功能语言中更为流行,同样如此。接口隔离原则也非常自然(将接口模块化并保持正交概念分离)。最后,依赖倒置只是“抽象”的名称,在函数式编程中无处不在。

“OL”原则,Open / Closed和LSP,更倾向于基于继承作为核心软件工程概念的语言。函数式语言值/模块默认情况下没有开放递归,因此“实现继承”仅用于非常特殊的情况。组合物是优选的。我不确定你应该如何解释那个环境中的开放/封闭原则。您可能会认为这是关于封装,哪些功能程序也使用抽象类型等等。

最后,Liskov替代原则似乎与继承有关。函数式语言并不总是使用子类型,但是当它们这样做时,确实假设“派生类型”应该保留“基类型”的规范。功能程序员当然要谨慎地指定和尊重他们的程序,模块等的接口和属性,并且可以在编程,重构时使用代数推理(这相当于我可以替代......)。但是,一旦你摆脱了“默认继承”的想法,你就不会有更多的接口违规问题,所以LSP并不像OOP那样被强调为重要的保护措施。

答案 1 :(得分:6)

This video介绍了SOLID原则,以及如何在Clojure中应用它们。

它显示了这些原则在功能世界中如何与OOP一样,因为我们仍然需要解决相同的潜在问题。总的来说,它让我觉得功能编程更适合SOLID设计。

答案 2 :(得分:3)

实际上, SOLID 可能是一个更好的函数式编程原理的好主意:

  • SRP Only do one thing首先来自命令式编程。具有集中的小型功能是很好的。

  • OCP :允许您更改行为而无需修改代码是很好的。函数式编程比继承更多地使用高阶函数,但是原理仍然成立。

  • LSP :在功能编程中,遵循某些接口协定与面向对象一样好。如果排序函数使用比较器,那么您会期望'0等于,小于提供负结果,大于大于正结果'的行为。

  • ISP :大多数功能语言仍具有结构。指定功能所需的最小数据集仍然是一种好习惯。仍然要求对数据使用最不特定的接口(当T的Enumeration同样工作时,为什么要使用整数列表?)仍然是一种好习惯。

  • DIP :在函数编程中为函数指定参数(或检索函数的高阶函数)而不是对函数进行硬编码以获取一定的价值面向对象。

即使在进行面向对象的编程时,这些原理中的许多原理也适用于对象中的方法设计。

答案 3 :(得分:1)

“伦敦JCP委员会成员理查德·沃伯顿(Richard Warburton)在演讲中将SOLID原理描述为由罗伯特·C·马丁(Robert C. Martin)在2000年代初确定的公认的面向对象编程设计原理的一个例子,并逐一分析试图找到功能等效项或至少在功能方面相关的五项原则中的一项。 Richards的经验是,尽管许多开发人员不知道如何在功能设计中使用他们现有的设计技能,但是功能编程通常可以帮助实现SOLID原理,并且功能思维方式实际上可以帮助实现面向对象的一个​​重要方面封装”。

更多信息: