0%

《代码整洁之道》要点整理

前言

根据《代码整洁之道》提取的一些书籍中的要点,根据自己习惯整理,可能对于他人不适用。整理了大部分要点,关于代码重构和代码味道的部分没有整理,在读code smell的时候再整理这部分。

整洁代码

  • 代码的不可替代性
    代码呈现了需求的细节,只有代码能够将需求明确到机器可以执行的程度

  • 什么是糟糕的代码
    可能是因为赶时间,来不及做代码的重构,想要留到后面再做,导致代码越来越“混乱”。稍后等于用不(Later equals never)

  • 糟糕代码的代价

    • 后期无法清理

    • 新人难以上手

    • 生产力不断下降

  • 整洁代码的特性

    • 优雅(命名,不重复)
      读代码,能够让人愉悦,而不是眉头紧锁

    • 效率(测试)
      尽量不浪费运算周期

    • 完善错误处理
      在细节上花心思

    • 只做好一件事(函数大小,不发散)
      每个函数、每个类和每个模块都应该全神贯注与一件事,不受四周细节的干扰和污染

    • 可增补性

错误处理

  • 使用异常

  • 函数不返回null

  • 参数不传递null

  • 对象和数据结构

    • 对象暴露行为,隐藏数据

    • 数据结构暴露数据,没有明显的行为

格式

  • 善用IDE格式化工具

  • 团队规则统一

  • 注释

    • 注释不能美化代码

    • 尽量用代码来阐述

    • 可用的注释

      • 法律信息

      • 对意图的解释

      • 警示

      • Todo注释

      • 代码Doc

    • 需要避免的注释

      • 多余的注释

      • 误导性注释

      • 循规式注释

      • 可以用函数或变量代替的注释

      • 注释掉的代码

      • 和当前代码没有联系的注释

函数

  • 短小
    最大行数20

  • 只做一件事
    函数应该做一件事,并且做好这件事。判断函数是否不止做了一件事,可以看是否还能拆出一个函数,而该函数不仅是重新诠释实现

  • switch语句
    尽量将switch语句埋到抽象工厂下面,用多态代替

  • 使用描述性的名称

  • 函数参数不要超过3个
    理解参数的成本,测试的成本

  • 抽离Try/Catch代码块

  • 结构化编程
    代码块应该有一个入口、一个出口

命名

  • 名副其实
    如果名称需要注释来补充,那么它就不算名副其实

  • 避免误导

  • 有意义的区分
    如a作为域内变量,the用于函数参数

  • 使用可搜索的名称

  • 避免使用编码
    如接口需要加 I 前缀,成员变量加m_前缀

  • 类名
    类名和对象名应该是名词或者名词短语,指代它代表的含义,不应该是动词

  • 方法名
    方法名应该是动词或者动词短语,指代要做的事情

  • 每个概念对应一个词

  • 添加有意义的语境

单元测试

  • TDD三定律

    • 在编写不能通过的单元测试前,不可编写生产代码

    • 只可编写刚好无法通过的单元测试,不能编译也算不通过

    • 只可编写刚好足以通过当前失败测试的生产代码

  • 保持可读性

  • Given-When-Then的结构

  • 每个测试只包含一个概念

  • F,I,R,S,T(Fast, Independent, Repeatable, Self-Validating, Timely)

  • 短小
    避免出现supper class

  • 单一权责原则

  • 内聚

系统

  • 工厂
    不关心其内部实现

  • 依赖注入(DI)

  • 优化决策

  • 迭进

    • 简单设计

      • 运行所有测试

      • 不可重复

      • 表达意图

      • 尽可能减少类和方法的数量

      • 以上规则按其重要程度排列

  • 并发

    • 并发相关代码有自己的开发、修改和调优生命周期

    • 开发相关代码有自己要对付的挑战,和并发相关代码不同,而且往往更为困难

    • 并发防御原则

      • 限制数据作用域

      • 单一权责

      • 使用数据副本

      • 线程尽可能独立

    • 执行模型

      • 基础定义

        • 限定资源

        • 互斥

        • 线程饥饿

        • 死锁

        • 活锁

      • 生产者-消费者模型

      • 读者-作者模型

      • 宴席哲学家

测试

  • 足够的测试

  • 使用覆盖率工具

  • 别略过小测试

  • 被忽略的测试就是对不确定事物的疑问

  • 测试边界条件

  • 全面测试相近的缺陷

  • 测试失败的模式有启发性

  • 测试覆盖率的模式有启发性

  • 测试应该快速