代码整洁之道
有意义的命名
取个好名字:名称应该告诉你,它为什么会存在,做了什么事,应该怎么用
应当避免使用与本意相悖的词,
以同样的方式拼写同样的概念才是信息,拼写前后不一致就是误导
误导性名称真正可怕的例子,是用小写字母l和大写字母O,因为看起来完全是一和零
以数字命名(a1,a2,a3)完全没有提供正确信息
废话是另一种没有意义的区分,比如:product类,productInfo类,productData类。废话就是冗余
使用读的出来的词,不要生造,比如genymdhms(生成日期,年月日时分秒)
使用可搜索的名称
类名和对象名应该是名词或名词短语
方法名应该是动词或动词短语
每个抽象概念对应一个词,并一以贯之
别用双关语
只有程序员才会读代码,所以尽量使用计算机术语
添加有意义的语境,就是添加前缀
实践
函数
函数应该短小
if,else,while语句,其代码块应该只有一行,应该是一个函数的调用语句
函数的缩进层级不该多于两层
只做一件事,做好一件事
要确保函数只做一件事,函数中的语句都要在同一抽象层级上
每个函数后面都跟着位于下一抽象层级的函数
使用多态替换switch
使用描述性的名称,别害怕长名字,长而具有描述性的名称,比长注释好,
参数数量应该尽量少
不要使用输出参数
不要使用标识参数
超过2个参数就应该封装为类
副作用,函数承诺只做一件事,但是会做其他被藏起来的事
使用异常替代返回错误码
抽离try/catch代码块
别重复代码
实践再优化
注释
应当负责将注释保持在可维护,有关联,精确的高度
不准确的注释比没有注释坏的多
尽量减少注释量
注释不能美化糟糕的代码
提供信息的注释
对意图的解释
警告
//TODO
良好描述的JavaDoc
拒绝多余的,描述不清的,误导的注释
拒绝循规式注释
拒绝日志式注释
拒绝废话式注释
拒绝归属与署名,由源代码控制系统代替
拒绝注释掉的代码,由源代码控制系统代替
无用信息过多
格式
好的软件系统是由一系列读起来不错的代码文件组成的,它们需要一致和顺畅的风格
对象和数据结构
隐藏实现并非在变量之上放一个函数层那么简单,类并不简单的用取值器和赋值器将变量推向外部,而是暴露抽象接口,以便用户无需了解细节就能操作数据本体
错误处理
错误处理不应搞乱代码逻辑
使用异常代替错误码
尽量别返回null值
尽量别传递null值
边界
单元测试
测试应该足够快
互相独立
可重复
自身可验证
及时
类
类应该是一组变量列表开始,先是公共静态常量,然后是私有静态变量,私有实体变量
公共函数应跟在变量列表之后,公共函数调用的私有工具函数紧跟在公共函数后面
类名应当描述其权责
类或模块应该有且只有一条加以修改的理由
让软件能工作和让软降保持整洁,是两种不同的工作
系统应该是由许多短小的类而不是巨大的类组成
超过3个变量就应该改为实体对象
隔离修改
系统
迭进
1 运行所有的测试
2 不可重复
3 表达了程序员的意图
4 减少类和方法的数量
并发编程
分离并发代码与业务代码
数据封装,严格限制对可能共享数据的访问
单线程收集多线程的副本,并合并这些结果
线程尽可能独立
编写可调整的线程代码
逐步改进
重构SerialDate
味道与启发
注释:
1 不恰当的信息,注释只应该描述有关代码和设计的技术性信息
2 废弃的注释,过时、无关或不正确的注释
3 冗余注释
4 糟糕注释
5 注释掉的代码
函数
1 过多的参数
2 输出参数违反直觉
3 标识参数
4 死函数,不被调用的方法
一般性问题
1 一个源文件存在多种语言
2 明显的行为未被实现
3 不正确的边界行为
4 忽视安全
5 重复
6 错误抽象层级,抽象类一般较高级的概念,派生类较低级
7 基类依赖派生类
8 信息过多
9 死代码
10 垂直分隔,变量和函数应该靠近被使用的地方
11 前后不一致
12 混淆视听
13 人为耦合
14 特性依赖
15 选择算子参数,使用多个函数,通常优于向单个函数传递某些代码来选择函数行为
16 晦涩的意图
17 位置错误的权责
18 不恰当的静态方法
19 使用解释性变量
20 函数名称应该表达其行为
21 理解算法
23用多态代替if/else或switch
24 遵循标准约定
25 用命名常量代替魔术数
28 封装条件
29 避免否定性条件
30 函数只做一件事
31 掩盖时序耦合
33 封装边界条件
java
2 不要继承常量
3 多用枚举
名称
1 采用描述性名称
2 名称应与抽象层级相符
3 尽可能使用标准命名法
4 无歧义的名称

浙公网安备 33010602011771号