2

由于函数式编程将数据和行为分开处理,并且行为不应该改变实例的状态,所以 FP 是否建议对域对象根本不使用实例方法?还是我应该始终将所有字段声明为最终字段?我在 Java 等面向对象语言的上下文中要求更多。

4

3 回答 3

1

由于函数式编程将数据和行为分开处理,

我听说这说了很多,但不一定是真的。是的,在语法上它们是不同的,但封装也是 FP 中的一件事。你真的不想让你的数据结构暴露出来,因为你不想在 OOP 中暴露它,你想在以后发展它。您想要添加功能或优化它。一旦您直接访问数据,您就基本上失去了对该数据的控制。

例如在 haskell 中,有modules,它们实际上是单个单元中的数据 + 行为。通常,数据的“构造函数”(即直接访问“字段”)不可用于外部函数。(一如既往地有例外。)

FP 是否建议完全没有域对象的实例方法

FP 是一种范式,它表示应该使用(数学)函数的(数学)组合来构建软件。基本上就是这样。现在,如果您足够眯眼,您可以将方法称为函数,只需一个附加参数this。前提是一切都是不可变的。

所以我会说不,“FP”没有明确定义语法,它可以在某些条件下与对象兼容。

我在 Java 等面向对象语言的上下文中要求更多。

这就是它变得朦胧的地方。Java 不太适合进行函数式编程。请记住,它可能从传统的 FP 语言中借用了某些语法,但这并不适合 FP。

例如不变性,纯函数,函数组合都是你应该做的 FP,Java 没有这些。我的意思是你可以编写代码来“假装”,但你会逆流而上。

于 2019-09-18T10:30:35.513 回答
0

您的字段应该是最终的,但功能代码和实例方法并不相互排斥。

以 BigDecimal 类为例:

BigDecimal x = new BigDecimal(1);
BigDecimal y = new BigDecimal(2);
BigDecimal z = a.add(b);

x 和 y 是不可变的,add 方法使它们保持不变并创建一个新的 BigDecimal。

于 2019-09-21T16:01:58.893 回答
0

FP 是否建议完全没有域对象的实例方法?

在 Domain Driven Design 一书中,Eric Evans 讨论了使用实体和值对象对域进行建模。

值对象模式需要不可变的私有数据;一旦初始化值对象,它就不会改变。在命令查询分离的语言中,我们会说值对象的接口支持查询,但不支持命令。

因此,值对象上的实例方法与闭包非常相似,对象的不可变私有状态扮演捕获变量的角色。

于 2019-09-18T02:56:24.467 回答