从函数的角度来看TDD开发

TDD是Test Driven Development,即我们常说的测试驱动开发。这种开发模式的一个显著特点是开发时,先写测试用例,然后再来写代码。

关于TDD有很多专门的书籍,我在这里只分享我对其中一个小点,“函数”的看法。

为了明确对函数外延的认识,我这里要用函数是否具有引用透明这一属性,对函数进行二分划分,得到“纯函数”和“非纯函数(即有副作用的函数)”。

纯函数的特点是引用透明,可被方程式推导,即对于给定的函数f,其参数和结果之间的关系是恒定不变的,因此可被天然地单元测试。如下:


function add (x, y) { return x + y; }

非纯函数,即函数涉及外部实体的行为,例如,异常,网络,系统时间,文件系统等,这些行为都会导致函数的结果不可被方程式推导,即输入和输出之间没有恒定的关系。这类函数不能被单元测试,如下:

function getDate() { return new Date(); }

因此,在做TDD设计时,要严格区分纯函数和非纯函数。将业务逻辑尽可能的放在纯函数中,将文件读写,数据库读写,网络读写,异常处理等行为放在非纯函数中。

我曾经就因为没有严格区分纯函数和非纯函数,导致单元测试写起来特别困难,曾一度认为TDD只是一个噱头。

有了上面的明确划分,我们在写TDD的代码时就有了明确的方向。

题外话

从逻辑学的划分角度(即某一类事物是否具有某一个属性,这里就是是否具有引用透明的属性),我们把函数划分为纯函数和非纯函数。

但是从分解的角度来看,非纯函数一定是包含纯函数的。

这也是我们很容易写出不利于单元测试的函数的原因。

你可能感兴趣的:(Javascript,函数式编程,tdd)