1.有意义的命名
避免误导
eg: accoutList 如果代表一系列帐号, 除非真是List容器, 不然就会误导其他开发者
不要把类型或者作用域编进名称里面;
eg: String phoneString
做有意义的区分
Product, ProductInfo 和 ProductData, AccoutManager和AccountControl之类的这种名称, 意义没什么区别, 没太大区别, 要避免;
不过一套代码中, 风格要保持统一, 如果选择ProductInfo, 其他类似的应该都命名为 xxxInfo;
类名和方法名
- 类名应该是一个名词或者名词短语
- 接口与实现, 使用前导字母 I 还不如让实现类使用后缀 Impl; 接口是抽象给外部使用的, 不应该告诉用户这个是接口;
- 方法名应该是动词或者动词短语;
- 方法中, 可增加局部变量, 以增加代码的可读性
2.函数
得墨忒耳律: 模块不应该了解它所操作对象的内部情形;
一个类 C 的方法 f 只应该调用如下对象的方法
- C
- 由 f 创建的局部变量对象
- 作为参数传递给 f 的对象
- 类 C 持有的对象
不应该调用上述任何函数返回对象的方法;
短小, 只做一件事情, 只做同一层级的事情, 无副作用
每个函数都是一个抽象层级;
每个函数应该只包含同一层级的代码; eg: 不能包含其某一流程的子步骤
switch if 语句只包含一行代码
if switch 之类的语句, 理论上就是满足一个条件, 做一个功能; 而所做的功能, 就是一件事, 要提成一个单独的函数;
参数不能超过3个
参数不能过多, 参数过多就应该考虑合并参数;
如果无法合并, 要考虑是否该用一个类封装起来;
不能含有布尔值的参数
含有布尔值, 及说明该函数含有条件判断语句, 有2个逻辑, 做了两件不同的事情, 应该拆分成2个不同的函数;
分隔指令与询问
做什么事, 和回答是什么事, 要分开;
使用异常代替错误码
抽离 try-catch 语句
try-catch在正常的逻辑中, 会把错误处理和正常流程混为一谈;
应该把正常流程封装成一个函数, 错误处理封装另外的函数中, 然后用函数整合正常流程和错误流程;
别重复, 不要有重复的代码
3.注释
4.错误处理
常规流程和错误流程分开
返回特例对象, 别返回null
遇到异常时,如果要返回, 应该是返回特例对象, 千万别返回null