在面向对象的范式中,我会在开始使用 OO 语言实现它之前创建一个对象/概念模型。
函数式编程中是否有任何与对象模型平行的东西。它被称为功能模型吗?或者我们在两种范式中创建相同的概念模型,然后用其中一种语言实现它。
如果存在功能模型,是否有文章/书籍可以阅读?
或者换一种说法……即使我们使用的是函数式编程语言,我们会从对象模型开始吗?
在面向对象的范式中,我会在开始使用 OO 语言实现它之前创建一个对象/概念模型。
函数式编程中是否有任何与对象模型平行的东西。它被称为功能模型吗?或者我们在两种范式中创建相同的概念模型,然后用其中一种语言实现它。
如果存在功能模型,是否有文章/书籍可以阅读?
或者换一种说法……即使我们使用的是函数式编程语言,我们会从对象模型开始吗?
事实上有。有一种基于抽象数据类型的函数式语言规范,称为代数规范。它们的行为在某些方面与对象的行为非常相似,但是构造是逻辑和数学的,并且像函数构造一样是不可变的。
布宜诺斯艾利斯大学的算法和数据结构课程中使用的一种特定功能规范语言具有生成器、观察器和其他操作。生成器是一个表达式,它既是数据类型的实例又是可能的组合。例如,对于二叉树 (ADT bt),我们有空节点和二叉节点。所以我们会有生成器:
-nil
-bin(left:bt, root: a, right:bt)
其中left是一个bt的实例,root是一个通用值,而right是另一个bt。所以,nil 是 a bt 的有效形式,但是 bin(bin(nil,1,nil),2,nil) 也是有效的,表示一棵二叉树,根节点的值为 2,左子节点的值为值为 1,且右子节点为空。
因此,对于一个计算树中节点数的函数,您定义了 ADT 的观察者,并定义了一组映射到每个生成器的公理。因此,例如:
numberOfNodes(nil) == 0
numberOfNodes(bin(left,x,right))== 1 + numberOfNodes(left) + numberOfNodes(right)
这具有使用操作的递归定义的优点,并且具有更正式有趣的属性,您可以使用称为结构归纳的东西来证明您的规范是正确的(是的,您证明您的算法将产生正确的结果)。
这是一个在学术界之外很少见的相当学术的话题,但值得深入了解可能会改变您对算法和数据结构的看法的程序设计。正确的参考书目包括:
Bernot, G.、Bidoit, M. 和 Knapik, T. 1995。观测规范和不可区分性假设。理论。计算。科学。139,1-2(1995 年 3 月),275-314。DOI= http://dx.doi.org/10.1016/0304-3975(94)00017-D
Guttag, JV 和 Horning, JJ 1993。落叶松:正式规范的语言和工具。Springer-Verlag New York, Inc. 软件开发中的抽象和规范,Barbara Liskov 和 John Guttag,麻省理工学院出版社,1986 年。
代数规范的基础 1. 方程和初始语义。H. Ehrig y B. Mahr Springer-Verlag,柏林,海德堡,纽约,东京,德国,1985。
带有相应链接: http ://www.cs.st-andrews.ac.uk/~ifs/Resources/Notes/FormalSpec/AlgebraicSpec.pdf http://nms.lcs.mit.edu/larch/pub/larchBook。 ps
这是一个有趣的话题。
在 OO 和 FP 范式中,您形成域模型(您正在解决的问题),然后在程序中创建对象以镜像域对象。存在一些差异,因为程序对象如何反映域对象受您使用的范例和语言的影响。一些例子(在 Haskell 中):
流程图和/或过程模型/图表可以用作非 OO 程序的功能模型。但它仍然没有给出类似于 OO 模型的边界感。