40

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

4

4 回答 4

56

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

其中一些是相当明显的,或者至少是众所周知的。单一职责是 UNIX 原则“做一件事,做好”,类似地,在广泛使用“组合”的函数式语言中更为流行。接口隔离原则也很自然(让您的接口模块化并保持正交概念分离)。最后,依赖倒置只是“抽象”的一个名称,在函数式编程中无处不在。

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

最后,里氏替换原则似乎与继承有关。函数式语言并不总是使用子类型,但是当他们这样做时,确实假定“派生类型”应该保留“基本类型”的规范。函数式程序员当然会小心地指定和尊重他们的程序、模块等的接口和属性,并且在编程、重构、但是,一旦你摆脱了“默认继承”的想法,接口冲突的问题就会少得多,因此 LSP 不像在 OOP 中那样被强调为重要的保障。

于 2011-04-07T08:49:40.027 回答
7

该视频介绍了 SOLID 原则,以及如何在 Clojure 中应用它们。

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

于 2014-07-14T08:28:04.220 回答
6

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

  • SRPOnly do one thing首先取自命令式编程。拥有小的、集中的功能是好的。

  • OCP:允许你在不修改代码的情况下改变行为是好的。函数式编程比继承更多地使用高阶函数,但原则是成立的。

  • LSP:遵守一些接口契约在函数式编程中和在面向对象中一样好。如果排序函数采用比较器,那么您会期望“0 等于,小于提供负面结果,大于正面结果”的行为。

  • ISP:大多数函数式语言仍然有结构。指定函数所需的最小数据集仍然是一种很好的做法。要求数据的最不具体的接口(为什么在 T 的枚举也能正常工作时使用整数列表?)仍然是一种很好的做法。

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

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

于 2020-06-23T05:36:39.127 回答
2

“伦敦 JCP 委员会成员 Richard Warburton 在他的演讲中将 SOLID 原则描述为已确立的面向对象编程设计原则的一个示例,该原则由 Robert C. Martin 在 2000 年代初期确定,并着眼于五项中的每一项原则试图找到功能等价物或至少与功能方面相关的东西。Richards 的经验是,尽管许多开发人员不知道如何在功能设计中使用他们现有的设计技能,但功能编程通常可以帮助实现 SOLID 原则和此外,功能性思维方式实际上可以帮助实现面向对象的一个​​重要方面,即封装。”

更多信息:

于 2019-08-05T08:50:23.927 回答