11 第十一章 重构和测试函数式程序

11 第十一章 重构和测试函数式程序

 

本章介绍

■ 重构函数式程序

■ 使用不变性推理代码

■ 写 F# 程序的单元测试

■ 使用延迟值缓存结果

 

    这本书的主题之一就是,函数编程只通过读代码,就能理解。当需要修改一个陌生的程序,或者通过组合现有函数实现行为,或者重构现有的代码时,??这一点尤为重要。函数式编程使重构更容易,缘于清晰度和模块化:可以改善代码,并且有信心这个变化不会破坏程序的其他部分。

    正如在函数式编中的程很多事情一样,修改代码没有改变其含义的思想,是与数学密切相关的,因为,不改变表达式含义的操作是许多数学任务的基础。我们可以把一个复杂的等式,化简,得到一个更易于阅读,但意思相同的等式。让我们看看下面的等式:y = 2x + 3(5 - x)。如果我们用 3 乘以括号中的表达,可以写为y = 2x + 15 - 3x,又可以简化为:y = 15 �C x。

    我们可以从数学学习的另一种技巧是替换。如果我们有两个方程,y = x/2 和 x = 2z,我们可以把第二个方程的右边代入第一个方程,就得到(化简后)y = z。最重要的一点是,把一个正确的方程成另一个方程,代入的方程不会突然变得不正确。出现函数编程中的这种技巧叫组合。

    函数编程与是数学密切相关,所以,一些代数中所使用的技巧可以应用到函数程序中,这并不奇怪。在编程的世界里,化简程组对应于重构(refactoring),这是本章的核心。特别是,我们将讨论减少重复代码和代码的依赖关系。

    替换也是一种形式的重构,但是,你将学习其他重要的实际好处,尤其是在单元测试当中。替换让我们能够集中精力于测试基本函数,花费少得多的时间测试从简单的积木组成的组合函数,因为,组合函数不会破坏已测试的组件。

    我们还将研究一个与重构密切相关的主题。如果一个程序没有副作用,不管其中个别部分执行的顺序如何,我们应该得到同样的结果。一个值,只要它一声明,就可以被计算,也可以延迟执行,直到真正需要这个值时。这种技术被称为延迟laziness(或延迟计算lazy evaluation),我们将向你展示一些真正的好处,当我们探索可能是无限的数据结构和计算机值的缓存时。

你可能感兴趣的:(代码,.net,重构,职场,休闲)