相当于SOLID原理的函数式编程


35

在考虑面向对象的设计时,我发现SOLID原理非常有用。

是否有针对功能编程量身定制的类似/等效的语言不可知原理集?


12
FWIW,一年前在SO上对此进行了简要讨论
StuartLC 2012年


该视频以及这些幻灯片介绍了应用于函数式编程的SOLID原理。他们都以Clojure语言为例,但是这些原则在其他语言中也适用。
2014年


Answers:


14

找到等效项有点困难,但是我可以尝试:

  • FP中的S(SRP)函数始终为相同的参数创建相同的输出,这称为引用透明性
  • FP中的O(OCP)有一个称为代数数据类型的概念,请看一下它与类层次结构的关系以及两者都试图解决的问题1
  • L(LSP)Liskov替代原理是协方差2
  • 通用函数式编程中的D(DIP)通过函数组合来实现抽象,借助范畴论(例如monoid或functor),还有其他机制用于“依赖注入” 3

21
我仍在思考您如何从“ 单一责任原则”转变为参照透明性。这两个是无关的。SRP是关于具有单一目的的功能。就此而言,它可能是参考透明的,也可能不是。
Goran Jovic 2012年

3
啊,我的坏-我明白了。从原则上讲并等同于首字母缩写,它们是等同的,而不是在相同或相似的事物的含义上。对不起,不好意思!
Goran Jovic 2012年

1
正确,这是阅读它的预期方式。我试图在fp的上下文中描述这些术语的映射。
AndreasScheinert 2012年

伙计,我讨厌您无法编辑评论,实际上,这些内容至少应该表示类似的意思。
AndreasScheinert

也许高阶函数可以提供某种类型的依赖注入:您可以将一个具体函数作为参数注入到通用(高阶)函数中。
Giorgio

44

对于功能/命令域来说,SOLID也是一个好主意。

SRP- “只做一件事情”首先是从命令式编程中获得的。具有小的,集中的功能是好的。

OCP-允许您无需修改​​代码即可更改行为。函数式编程使用高阶函数比继承更多,但是原理仍然成立。

LSP -通过一些接口守合同只是在函数式编程好,因为在面向对象的。如果排序函数使用比较器,则您会期望'0等于,小于提供负结果,大于大于正结果'的行为。

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

DIP-为函数指定参数(或更高阶的函数以检索参数),而不是硬编码要获得一定价值的函数,在函数编程中与在面向对象中一样好。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.