优秀代码的特质 | 青训营笔记

79 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第6天。

当下,小到手腕上的手环,大到运载火箭,都依赖于使用代码描述的逻辑而运转。代码质量关系着生活的方方面面,如果一段质量不佳的代码被用到了关键位置,就有可能带来严重后果和经济损失,比如阿丽亚娜5运载火箭在首次测试发射时就因此发生事故。

因此,保证代码质量是一件重要的事情,高质量的代码才能带来优秀可靠的项目。

什么是优秀的代码

优秀的代码不少见,它们虽然各不相同,但总有一些共同的优点:

  • 函数、变量具备明确的语义,甚至不需要注释很容易就能看懂其作用
  • 满足各种边界条件,代码功能正确
  • 在功能变更时只需要进行较小的改动,具备较好的拓展性
  • 在发生异常时能够优雅的报错,或者能够自我恢复
  • 对于未预见的情景,能够优雅处理而不崩溃
  • 代码安全度高,不易被攻击

代码的可维护性原则

面对一个庞大的项目,如果代码缺乏可维护性,那么项目未来的发展将会异常艰难(比如一个Bug光是定位问题位置可能就需要非常久的时间),而对项目的更新迭代也将如噩梦般痛苦(面对一大坨不知所云的代码不知所措)。

代码的可维护性原则包括下面几点:

  • 统一的编码规范
    • 包括命名规范、代码格式、注释规范...
    • 比如:不要在命名中混合拼音和英文
  • 稳定的工程结构
    • 目录清晰(可以轻松找到相关代码)、模块化、组件化、依赖可控(依赖项容易添加和更新,基本保持稳定)、访问权限(防止代码被无意中破坏)...
  • 优秀的方案实现
    • 文档、用例(对应用场景考虑充分)、可测性(自动化测试)、高内聚低耦合...

代码清晰/复杂程度的度量方法

为了方便度量代码的清晰程度,这里介绍一下圈复杂度(Cyclomatic Complexity,也叫条件复杂度)的计算方法。

根据代码得到CFG(控制流图,Control Flow Graph,是一个过程或程序的抽象表现,是用在编译器中的一个抽象数据结构,由编译器在内部维护,代表了一个程序执行过程中会遍历到的所有路径),则这段代码的圈复杂度=CFG边数-CFG顶点数+2。另一种计算方法对人类更加友好,只需要统计代码中判定条件的数量,圈复杂度=判定条件数+1,这两种计算方法是等价的。

有了圈复杂度,我们就可以对代码进行评估了,通常来说,如果圈复杂度为1~10,那么代码是清晰的,维护成本也较低;而如果圈复杂度大于30,那么代码就基本不可读,维护成本也非常高。在实际应用中,单个文件的圈复杂度最好不要超过15。