笔记:代码整洁之道

这本书要求经验比较丰富的Java经验。

整洁代码

  1. 知道许多关于代码的事了
  2. 好代码和坏代码之间的差异

要有代码

特性越加越多,代码也越来越烂,最后再也没法管理这些代码了。
稍后等于永不

混乱的代价

  1. 新设计会导致两套不同的方式,造成混乱
  2. 保持这样的态度:我最懂,你给的压力不对,我不会听从
  3. 消除重复和提高表达力
  4. 让营地比你来时更干净

有意义的命名

名副其实

  1. 需要用注释来补充的变量名不算名副其实
    1
    int d; // 消逝的时间,以日计

可以更改为

1
int elapsedTimeInDays;

做有意义的区分

  1. a1, a2等命名方式没有提供正确或导向作者意图的线索
  2. Product/ProductInfo/ProductData等名称虽然不同,但是意思却无分别
  3. 废话都是冗余。如nameString可以改成name
  4. 不要自造词汇,使用英语词汇进行命名(可以读出来)
  5. 名字可搜索,数字5,单个单词等都不好搜索
  6. 类名应该为名词,方法名应该为动词

#函数

短小

  • 长度为20-100行最佳
  • if-else,while语句内的代码块应该尽量用函数包括,因为函数具有说明性的名称
  • 函数只做一件事,做好这件事
  • 函数无副作用
  • 使用异常代替错误码
  • 别重复自己

注释

不好的注释

  • 注释并不一定就是好的,注释的恰当用法是弥补我们在用代码表达意图时遭遇到的失败,当必须要用注释时,看是否能用代码来表达
  • 注释会撒谎,修改代码时并不一定会修改注释
  • 不准确的注释不如不注释

好的注释

  1. 法律信息
  2. 信息的注释
  3. 对意图的注释
  4. 阐释,对晦涩难明的参数或返回值的意义翻译为某种可读的形式
  5. 警示
  6. TODO注释

对象和数据结构

得墨耳定律:模块不应该了解它所操作的对象的内部情况

错误处理

  • 别返回null值
  • 别传入null值(除非函数要求),但是,检查null值的责任应该由调用者负责还是函数负责呢?

边界

学习性测试的好处不止是免费,还在投资上有正面的回报;
依靠能控制的东西好过依靠不能控制的东西;

单元测试

TDD三定律

  1. 没有测试之前不要写任何功能代码
  2. 只编写恰好能够体现一个失败情况的测试代码
  3. 只编写恰好能通过测试的功能代码

整洁的测试只有一个要求:可读性

F.I.R.S.T原则

  1. Fast:快速运行才会让人想运行它
  2. Independent:每个测试用例之间应该独立
  3. Repeatable:可重复的
  4. Self-Validating:测试用例自己可验证自己是否得到正确的结果
  5. Timely:测试用例应该及时编写

放松封装总是下策

类的组织

  • 类应该短小
  • 单一原则,只有一个理由去修改它
  • 内聚

系统

复杂要人命,消磨开发者的生命,让产品难以规划、构建和测试

跌进

紧耦合的代码难以测试,所以运行所有的测试可以解耦

并发编程

逐步改进

0%