可重构的代码指:可以放心的改代码,不用担心因为改代码而导致 bug。可重构的代码的是对代码质量最高的要求,也是最难达到的。
可重构的代码是易于维护的。对于非可重构的代码,如果改了某模块,可能会导致一系列相关改动。如何找到改动会导致的影响?这不仅需要工作量,还有漏改导致的质量风险。
写出可重构的代码要做 3 件事:
隔离副作用是写出可重构代码的基础。使用静态类型是对过程的检查。写测试是对结果的检查。
下面具体来说。
副作用指修改模块外的数据。常见的模块外的数据有:全局变量,Web Storage,DOM,组件间共享的数据,其他模块的内部数据。
在模块代码中,混入副作用代码会导致如下的问题:
如何隔离副作用?方法是:
使用静态类型可以规避很多低级的语法和逻辑错误,比如参数少传了,参数的类型传错了等。
function add(a: number, b: number) : number {
return a + b
}
// 编译报错: 参数少传了。
add(3)
// 编译报错:参数的类型传错了。
add(3, '4')
修改某个 API 后,通过静态类型检查,我们可以知道,哪些调用的地方需要做对应的修改。
JavaScript 是个弱类型语言,不支持静态类型检查。可以用 TypeScript 来做静态类型检查。
这边的测试指的是白盒测试。
白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,即清楚盒子内部的东西以及里面是如何运作的。"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。 -百度百科
测试可以保证测试覆盖部分的功能是总是正确的。代码修改后,只要测试用例能跑通过,则保证了代码改动没有破坏之前的功能。
测试是分层的。对前端来说,测试包括三层:
单元测试主要针对的是方法,类和组件。接口测试主要针对的是后端接口。UI 测试主要针对UI和交互,属于集成测试。
Mike Cohn 在著作中《Succeeding with Agile》中提出了 测试金字塔 的概念。如下图所示:
我们写测试的数量,应该是:单元测试 > 接口集成测试 > UI测试。这主要考虑的是时间投入产出的性价比:
我们写测试场景优先考虑:业务流程不频繁改动的核心场景。
可重构的代码可以被放心的修改。要写出可重构的代码需要:
至此,《学得会,抄得走的提升前端代码质量方法》系列就完结啦~ 前几期地址: