这本书要求经验比较丰富的Java经验。
整洁代码
- 知道许多关于代码的事了
 - 好代码和坏代码之间的差异
 
要有代码
特性越加越多,代码也越来越烂,最后再也没法管理这些代码了。
稍后等于永不
混乱的代价
- 新设计会导致两套不同的方式,造成混乱
 - 保持这样的态度:我最懂,你给的压力不对,我不会听从
 - 消除重复和提高表达力
 - 让营地比你来时更干净
 
有意义的命名
名副其实
- 需要用注释来补充的变量名不算名副其实
1
int d; // 消逝的时间,以日计
 
可以更改为1
int elapsedTimeInDays;
做有意义的区分
- a1, a2等命名方式没有提供正确或导向作者意图的线索
 - Product/ProductInfo/ProductData等名称虽然不同,但是意思却无分别
 - 废话都是冗余。如nameString可以改成name
 - 不要自造词汇,使用英语词汇进行命名(可以读出来)
 - 名字可搜索,数字5,单个单词等都不好搜索
 - 类名应该为名词,方法名应该为动词
 
#函数
短小
- 长度为20-100行最佳
 - if-else,while语句内的代码块应该尽量用函数包括,因为函数具有说明性的名称
 - 函数只做一件事,做好这件事
 - 函数无副作用
 - 使用异常代替错误码
 - 别重复自己
 
注释
不好的注释
- 注释并不一定就是好的,注释的恰当用法是弥补我们在用代码表达意图时遭遇到的失败,当必须要用注释时,看是否能用代码来表达
 - 注释会撒谎,修改代码时并不一定会修改注释
 - 不准确的注释不如不注释
 
好的注释
- 法律信息
 - 信息的注释
 - 对意图的注释
 - 阐释,对晦涩难明的参数或返回值的意义翻译为某种可读的形式
 - 警示
 - TODO注释
 
对象和数据结构
得墨耳定律:模块不应该了解它所操作的对象的内部情况
错误处理
- 别返回null值
 - 别传入null值(除非函数要求),但是,检查null值的责任应该由调用者负责还是函数负责呢?
 
边界
学习性测试的好处不止是免费,还在投资上有正面的回报;
依靠能控制的东西好过依靠不能控制的东西;
单元测试
- 没有测试之前不要写任何功能代码
 - 只编写恰好能够体现一个失败情况的测试代码
 - 只编写恰好能通过测试的功能代码
 
整洁的测试只有一个要求:可读性
F.I.R.S.T原则
- Fast:快速运行才会让人想运行它
 - Independent:每个测试用例之间应该独立
 - Repeatable:可重复的
 - Self-Validating:测试用例自己可验证自己是否得到正确的结果
 - Timely:测试用例应该及时编写
 
类
放松封装总是下策
类的组织
- 类应该短小
 - 单一原则,只有一个理由去修改它
 - 内聚
 
系统
复杂要人命,消磨开发者的生命,让产品难以规划、构建和测试
略
跌进
紧耦合的代码难以测试,所以运行所有的测试可以解耦
并发编程
略