这一章的主题主要是函数程序的重构,我们已经看到了大量的示例和概念。我们首先讨论了在数学意义上的重构,可以发现,在数学意义上,很容易推导出“代码”,因此,可以看到特定的改变在何时是正确的。由于其根源在数学中,因此,函数式编程通常也有这样的属性。
我们首先探讨了使用函数类型,能够减少代码重复,这是重构的简单情况;然后发现,使用函数式编程,能够方便跟踪代码中的相关性,因此,我们可以看到特定的重构是否是正确的。
接下来,我们重点关注使用 xUnit.net 进行函数式编程的单元测试。学会组合单元测试,以及使用 F# Interactive 进行交互式测试。因此,如果在前面章节你还担心过交互式测试,现在知道,交互式测试只是大型测试的一个部分。此外,我们还演示了不变性能够简化代码的测试,因为我们只需要测试函数能给出预期的结果,而不担心其副作用。
后面,我们把注意力转向了延迟性(laziness)。我们已经知道,延迟性可以用于缓存计算结果,当再次访问这个值时,代码会更有效地运行。只要我们只使用不可变的数据结构,这种修改不会改变程序的结果,所以,可以把它看作是另一种形式的重构。我们还学习了延迟性表达重要的函数概念,比如,无穷的数据类型。事实上,这只是下一章的预告,届时,我们将讨论 C# 的迭代和 F# 的序列表达式,两者都是以更自然的方式来表达序列值。这只是更大概念的一个示例,所以,我们还将看到如何改变或扩展通常的代码含义。
时间: 2024-10-09 09:32:38