函数编程和模拟对象

时间:2010-08-25 10:33:00

标签: functional-programming mocking

我最近正在观看有关Clojure的网络直播。主持人在讨论Clojure的FP性质的背景下做了评论,这就像(我希望我不会歪曲他)“Mock对象嘲笑你”。

当我在微软的Reactive Framework开始出现时观看网络直播时,我也听到了类似的评论。它类似于“模拟对象适合那些不懂数学的人”。

现在我知道这两个评论都是笑话/诙谐等等(并且可能是非常复述),但是它们的基础显然是概念性的,我不明白,因为我还没有真正转向FP范例。

所以,如果有人能够解释FP是否确实使得嘲弄变得多余,如果是这样的话,我将不胜感激。

2 个答案:

答案 0 :(得分:8)

在纯FP中,您具有引用透明函数,每次使用相同输入调用它们时都会计算相同的输出。因此,您所需的所有状态必须作为参数显式传入,并作为函数结果传递,没有任何有状态的对象以某种方式“隐藏”在您调用的函数之后。但是,这就是您的模拟对象通常所做的事情:模拟您测试对象所依赖的一些外部隐藏状态或行为。

换句话说: OO:您的对象结合了相关的状态和行为。 纯FP:状态是你在函数之间传递的东西,它们本身就是无状态的,只依赖于其他无状态函数。

答案 1 :(得分:8)

我认为重要的是要考虑使用测试的想法可以帮助您构建代码。模拟真的是推迟你现在不想采取的决定(以及一种被广泛误解的技术)。而不是对象状态,考虑部分函数。您可以编写一个函数,将其行为的一部分推迟到传入的部分函数。在单元测试中,这可能是一个虚假的实现,让您只关注手头的代码。稍后,您将使用实际实现来构建新代码以构建系统。

实际上,当我们开发Mocks的想法时,我总是这样想着Mocks。对象部分是偶然的。