如何提升代码质量
好的代码都有一些共同的特征,如可读性、较少的方法行数、高内聚低耦合、职责单一。但这只是一个结果,作为一个工程师,我们应该如何做到好的代码质量呢。
即使对于一流的程序员,高质量的代码大多也不是一蹴而就的(不排除少数天赋异禀)。在写代码的过程中,Martin Fowler说我们有两顶帽子:实现、重构。我们开发中先戴上实现的帽子,在实现的过程中,我们只考虑如何实现功能。当实现完成后,我们戴上重构的帽子,我们寻找代码中的坏味道,如过长的函数、不清晰的命名等等(详见代码的24个坏味道),然后对代码进行重构,直到代码的坏味道消失,这时候高质量的代码就涌现了出来。因此可以说,好的代码是重构出来的。
在代码重构过程中,很可能会引入新的Bug。那么如何保证重构的质量和效率呢?答案是单元测试。如果我们的代码有完整的单元测试覆盖,那么我们在重构的时候就不必担心因为重构引入新的Bug。每次重构一部分代码,我们都跑一下单元测试,确保我们没有破坏原有的逻辑。如果测试跑不过,回滚或者修改代码让它通过。
良好的单元测试,也可以帮助驱动你的代码的接口更加合理。我看到很多同学在拿到任务后,一开始无从下手,不知道接口应该如何设计。如果你从测试开始写,那么就给了你一个从外部审视代码的角度,从这个角度编写接口会比较容易。这就引入了另外一个实践——TDD(测试驱动开发)。
单元测试是为了测试业务逻辑,为了更好地编写单元测试,我们需要把业务逻辑和实现细节拆开。实现细节包括但不限于数据库、外部接口、IO、框架等。很多人觉得单元测试很难,就是因为无法隔离这些实现。要隔离这些实现,目前的做法是领域驱动开发DDD,编写仅仅含有业务逻辑的领域模块,通过接口实现对外部细节的操作。这样我们就能很方便的编写单元测试来测试业务逻辑。
总结:通过TDD驱动DDD的开发,通过重构提高领域中业务代码的质量,是代码质量提升的有效途径。