- 代码尽量简洁。
- 函数参数尽量少
- 命名尽量规范,动词名词尽量合理专业术语命名少一些奇葩命名和变量命名
- 抽离try catch 代码块
第五章 格式
5.1 垂直分布 调用者函数方法应该尽量在被调用者函数方法之上,挨着比较好。 注意缩进。
第六章 对象和数据结构
6.1 尽量封装对象传参,
第七章 错误处理
7.1 上游try catch finally 下游throw 会使得代码整洁,根据情况而定 尽量不让null进入程序
第八章 边界
8.1 集合尽量使用泛型
8.2 使用API可以多写测试用例,方便新版本发布的时候运行下看看新旧版本的差异做出更新,使用新API的能力。
8.3 善于利用桥接模式在不给API文档的时候写好接口,实现类可以等给了接口写。
第九章 单元测试
9.1 快速 独立 可重复 自足验证 及时
第十章 类
10.1 单一职责 内聚 对修改封闭,对添加开放
第十一章 系统
11.1 最好的集成方法是无侵入式集成,可插拔式集成。springaop切面就做的很好。 最好的系统就是代码尽量简洁。
第十二章 跌进
12.1 单一职责很重要。 类尽量小聚合,保持类方法尽量少
第十三章 并发编程
13.1 对象是过程的抽象,线程是调度的抽象。
13.2 单一权责原则 分离并发和和其他代码; 限制数据作用域 如:synchronized关键字; 使用数据副本; 线程应尽可能的独立
13.3 线程执行模型:
13.4 锁的使用:
警惕同步方法之间的依赖
13.5 保持同步区域微小
13.6 很难编写正确的关闭代码
第十四章 逐步改进
14.1 代码整洁
代码重构,在于一直更新自己不好的代码趋向于自己认为的完美。 时刻保持自己代码的整洁。
第十五章 JUnit内幕
所有代码都能重构的比之前更好,要推翻之前的不断试错,不断更新才能更好。
第十六章 重构 SerialDate
代码不合理的需要迁移。
第十七章 味道与启发
17.1 注释简洁明了,没用的注释别写,过期的删除,多些一些代码中没有的但是需要注意的细节。
17.2 把多部才能实现的构建最好整成一歩,多步才能做到的测试整成一步。
17.3 函数 参数超过3个就需要考虑是否该改造方法了,最好是没有参数的方法,输出参数最好不要有,比如可以用改对象的状态来做替代,标识参数也很让人迷惑,违反了单一职责原则,应当消灭它,死函数就要删除,代码管理工具可以做找回。
17.4 一般性问题 一个文件中最好语言统一、不能忽视安全、避免重复、 抽象层级注意正确性、基类不能依赖于派生类、信息不能过多、死代码记得删除、垂直分隔关联代码少于100行代码、前后一致、混淆视听避免、人为耦合注意、特性依赖不该有、选择算子参数、晦涩的意图需要注释、位置放对地方、恰当的静态方法、使用解释性变量、函数名称应该表达其行为、理解算法、把逻辑依赖改为物理依赖、用多态替代if/else 或 switch/case、遵循标准约定、用命名常量替代魔法值、准确、结构甚于约定、封装条件、避免否定性条件、函数只该做一件事、掩蔽时序耦合、别随意、封装边界条件、函数应该只在一个抽象层级上、在较高层级放置可配置数据、避免传递浏览、合理使用通配符、不要集成常量、而是该导入常量类、采用描述性名称、名称应该与抽象层级相符、尽可能使用标准命名法、无歧义的名称、为较大作用范围选用较长名称 、避免编码、名称应该说明副作用。
17.5 测试 别略过小测试、使用覆盖率工具、被忽略的测试就是对不确定事物的疑问、测试边界条件、全面测试相近的条件、测试失败的模式有启发性、测试覆盖率的模式有启发性、测试应该快速。
附录A 并发编程 II
死锁:1. 互斥 2. 上锁及等待 3. 无抢先机制 4. 循环等待
避免死锁: 1. 不互斥 几乎不可能,大多数资源都有上限 2. 不上锁及等待,可能会引起线程饥饿或者活锁。 3. 满足抢先机制,管理请求复杂。 4. 不做循环等待,如果获取资源的顺序和使用资源的顺序不匹配也就无法满足,或者无法获取资源顺序那么这个条件也无法满足。