我已经看到了一个最近的帐户域模型示例,其中每次从事务日志向左折叠计算余额,而不是将其作为对象的状态。这是非常好的。但它是不变性的核心。 (无法在此处标出提出设计的答案)
答案 0 :(得分:3)
您所描述的是一种用于编写系统的强大技术;它几乎可以保证系统永远不会丢失数据,这意味着编程错误永远不会“破坏”您的数据 - 一旦修复了错误,系统就会返回正确的结果,即使是在错误生效时添加的记录也是如此。一种有用的技术(与有时称为“lambda体系结构”密切相关)是将此计算视为给定信息的“规范”形式,但也提供了一个缓存以提高效率 - 比较数据库设计所在数据库被非规范化以提高特定查询的性能。
但这不是用不可变数据编写系统的唯一方法;例如,您可以在收到更新时应用更新,存储完整帐户的不可变实例,其历史记录指向先前版本(请注意,如果两个人同时进行更改,则可能需要用户协调不同的“分支” - 与使用类似git的VCS进行比较)。这可能更适合于一个系统,在这个系统中,保留帐户在特定时间点的确切内容非常重要,而保留从一个版本到另一个版本的更改的重要性则不太重要(例如我曾经在系统上工作过处理保险合同)。
“这是不变性的核心吗?”这是一个毫无意义的问题。我建议寻找能让您的代码更清晰,更易于维护的实用技术,而不是寻找“核心”。