12

我目前正在使用 Scala 编程,但我想这适用于任何函数式编程语言,或者更确切地说,适用于任何推荐不变性并可以与数据库交互的编程语言。

当我从数据库中获取数据时,我将其映射到模型数据结构。在函数式编程中,数据结构往往是不可变的。但是数据库中的数据是可变的,所以我想知道我的模型是否也应该是可变的。一般来说,在这种情况下,什么是好的和被广泛接受的做法?

在 Coursera 上 Martin Odersky 的 Scala 课程之后,我记得他说过这样的话:

使用不可变数据结构更好,但是当您想与现实世界交互时,使用可变数据结构会很有用。

所以,再次,我想知道我该怎么做。到目前为止,我的数据结构是不可变的,当我想更新数据库中的记录时,这会导致大量的样板代码。使用可变模型会有助于减少这个样板吗?

(我已经问过一个类似的问题,该问题非常具体到我使用的技术,但我对实际答案并不满意,所以我在这里概括了它。)

4

3 回答 3

6

为什么数据库是可变的?数据库的基本性质是可变的吗?关系模型并将其用作应用程序数据的持久存储可能会引导您得出这个结论,但它可能不是基本属性。

鉴于您可能有其他选择,例如在更新数据时存储新版本的数据,那么问题的前提可能会受到一定程度的破坏。也许,即使您确实有一个“可变”数据库,您仍然需要为更新函数提供一个与旧值分开的新值 - 例如考虑一个乐观锁,其中只有在旧值有更新时才会发生更新在此期间没有改变。

换句话说,数据库的可变性与否根本不重要,您正在处理应用程序中的一个单独的域层。如果你需要问,那么答案将永远是不变的。可变性是一个复杂性向量,只有在证明有必要时,专家才应将其作为性能优化引入。

于 2012-10-21T08:17:47.360 回答
5

在我目前正在开发的交易应用程序中,几乎所有内容都是不可变的——当然模型也是如此。

我们的经验是,这极大地简化了我们使用模型的方式,包括持久性。

我还不明白为什么事情变得更简单了,它就是这样。我需要更多地思考这个问题。推理代码并使用它更简单。

是的,你需要使用镜头之类的东西,但我倾向于编写它们——一个机械过程——然后继续前进。这是一个很小的部分,我相信它可以被巧妙地处理。

于 2012-10-21T11:21:03.903 回答
3

“与现实世界交互”与你使用可变数据结构还是不可变数据结构无关。这是一个经常重复的毛茸茸的问题,你对它提出质疑真是太好了。

虽然消除这样的垃圾通常更健康,但您可能会对粗略的揭穿感兴趣:http: //blog.higher-order.com/blog/2012/09/13/what-purity-is-and-isnt /

但是,我强烈建议您放弃它并继续前进。

关于您的问题,您说当您想对不可变数据结构执行操作时,您有样板文件。事实上,有一个非常成熟的理论在很大程度上解决了这个问题。这是一篇使用 Scala 写的关于它的论文:

http://dropbox.tmorris.net/media/doc/lenses.pdf

希望有帮助。

于 2012-10-21T08:30:26.567 回答