重要
XML标记书写是否完整,字符串的拼写是否正确?
重要
对于流操作代码的异常捕获是否有finally操作以关闭流对象?
关闭前需要判断?
流对象是否为空?
提示
退出代码段时是否对临时对象做了释放处理?
重要
对浮点数值的相等判断是否是恰当的?
严禁使用==直接判断浮点数值?
。
提供通用方法
重要
是否对象比较都使用了equals?
对象(包括包装类)比较必须使用equals,
而不是使用==或!
=操作
重要
使用equals进行比较时是否确保比较的两个对象类型一致?
equals方法比较的对象在对象类型确定的前提下,
建议是同一类型的,例如Integer和""使用equals
是不提倡的
一般
操作Map或Properties结构对象,用于传值时是否将Key定义为常量?
Session,Request等对象的setAttribute,
getAttribute方法的key建议使用常量,
不得手工输入字符串
重要
是否在类型转换前确保了类型的兼容?
除非明确保证对象类型
重要
包装类做简单预算前是否保证非空?
?
建议都使用包装类。
包装类进行操作前,建议进行非空(null?
!
=?
xx)判断,
防止发生空指针异常
重要
对象属性在使用前是否确保被准确赋值?
只读属性(只提供get方法的成员变量)
除非特意返回固定值,否则必须提供set方法
或在其他方法调用时将其赋值
重要
方法调用前是否有非空判断?
对参数的非空判断必须出现在方法调用之前,
否则说明前面可能导致空指针或者后者判断是没有必要的,
非空判断,默认由调用者提供
重要
非线程安全的对象是否被正确保证线程安全?
DateFormat实例的format方法调用不是线程安全,
类似的情况不适合使用static定义
,建议使用ThreadLocal方式实现,
参看UnifiedCodeGenerator
一般
相同用意的成员变量是否使用了相同的命名?
不同实体Entity、VO、BO之间表示同一含义的成员变量,
建议使用相同的名称,尽量不要出现,
有的地方用username,
有的地方用userName这样的情况
可靠性(函数)
重要
入口对象是否都被进行了判断不为空?
重要
入口数据的合法范围是否都被进行了判断?
重要
是否对有异常抛出的方法都执行了try...catch保护?
重要
是否函数的所有分支都有返回值?
重要
int的返回值是否合理?
(负值为失败,非负值成功)
一般
对于反复进行了int返回值判断是否定义了函数来处理?
一般
关键代码是否做了捕获异常处理?
一般
字典表定义是否用枚举,或者有一个统一的定义?
重要
是否对方法返回值对象做了null检查,该返回值定义时是否被初始化?
重要
是否对同步对象的遍历访问做了代码同步?
重要
是否确认在对Map对象使用迭代遍历过程中没有做增减元素操作?
Map遍历时执行增减元素操作将抛出
ConcurrentModificationException,
对集合对象遍历时建议都不要进行增减元素操作。
重要
线程处理函数循环内部是否有异常捕获处理,防止线程抛出异常而退出?
重要
原子操作代码异常中断,使用的相关外部变量是否恢复先前状态?
重要
函数对错误的处理是恰当的?
重要
异常捕获后是否进行了日志记录或异常继续抛出?
异常捕获后如果无法处理需要继续抛出,
如果可以处理,建议将异常日志进行记录
重要
是否构造方法中不调用当前对象的构造方法
严禁在构造方法中new一个当前对象
可维护性
重要
实现代码中是否消除了直接常数?
(用于计数起点的简单常数例外)
重要
是否消除了导致结构模糊的连续赋值?
(如a=?
(b=d+c?
))
重要
是否正确使用了日志记录?
一般
是否有冗余判断语句?
(如:
if?
(b)?
return?
true;?
else?
return?
false;)
“if?
(b)?
return?
true;?
else?
return?
false;”==》“return?
b;”;
禁止使用类似“if/while(表达式?
==?
true)
或if/while(表达式?
==?
false)”的判断
重要
是否把方法中的重复代码抽象成私有函数?
代码警告
一般
是否清除了多余导入的包或类?
重要
是否清除了只定义未使用的局部变量?
严禁局部变量被定义或者初始化而未被使用,
这种情况需要删除该局部变量
一般
是否将魔鬼数字修改为常量使用?
不允许直接使用除-2,-1,0,1,2,3,4,5,6,7,8,9,10外的
数字,除此外的数字需要定义常量使用
提示
常量定义是否为static?
final格式?
常量定义格式为public/protected//private?
static?
final?
Type?
TYPE,static和final顺序要保持一致
提示
实现序列化的对象是否定义了serialVersionUID?
建议实现Serializable的类需要增加
“private?
static?
final?
long?
serialVersionUID?
=?
1L;”
可读性
一般
是否用if?
else结构替换了三元运算符?
表达式复杂情况下?
不要使用(flag?
exp1:
exp2)语句,
该语句需要修改为if?
else结构
一般
代码注释率是否结余30%~60%之间?
代码注释率应落在30%~60%之间
性能
重要
日志记录的Log,Logger对象是否定义为常量?
用于记录日志的Log,Logger对象在类中
定义必须是static?
final的,建议定义为private的,
因为这类对象初始化比较耗时,不利系统运行
日志
重要
打印信息是否都用日志管理?
代码中建议不要使用打印信息,
只有在系统启动或系统即将退出时使用,
其余部分全部用日志记录
圈复杂度
重要
单个类行数是否不大于500行?
单个类建议行数小于500行,最多不超过1000行
重要
方法参数个数是否在7个以内?
方法参数个数建议不大于5个,最多不超过7个
重要
单个方法函数是否不大于30行?
单个方法建议函数不大于30行,做多不超过60行
重要
单方法中try/for/while/switch/if最深深度是否不大于5?
单方法中try/for/while/switch/if最深深度不允许大于5
重要
方法调用最深深度是否不大于15?
方法内部+内部调用累计深度不允许大于15
SQL空格
一般
连接符or、in、and、以及=、<=、>=等前后加上一个空格。
一般
逗号之后必须接一个空格。
一般
关键字、保留字和左括号之间必须有一个空格。
SQL注释
重要
对较为复杂的SQL语句加上注释,说明算法、功能。
注释风格:
注释单独成行、放在语句前面。
重要
对重要的计算应说明其功能。
SQL中尽量少涉及业务逻辑
一般
可采用单行/多行注释。
(--?
或?
/*?
*/方式)。
SQL优化性能建议
1?
书写SQL语句优化细则
重要
?
?
?
1)?
尽量避免相同语句由于书写格式的不同,而导致多次语法分析。
重要
?
?
?
2)?
多表连接时,使用表的别名来引用列。
建议最多5个连接
重要
?
?
?
3)?
不要在任何代码中使用?
SELECT?
*。
重要
?
?
?
4)?
where条件中尽量减少使用常量比较,改用参数变量。
重要
?
?
?
5)?
尽量少用嵌套查询。
如必须,请用not?
exist代替not?
in子句。
重要
?
?
?
6)?
用多表连接代替EXISTS子句。
重要
?
?
?
7)?
使用UNION?
ALL提高性能?
。
重要
?
?
?
8)?
in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。
2?
排序注意事项
重要
?
?
?
1)?
大量的排序操作影响系统性能,所以尽量减少orderby和group?
by排序操作。
如必须使用排序操作,请遵循如下规则:
重要
?
?
?
?
?
a.?
排序尽量建立在有索引的列上。
重要
?
?
?
?
?
b.?
如结果集不需唯一,使用union?
all代替union。
3?
选用索引注意事项
重要
?
?
?
1)?
对于复合索引,SQL语句必须使用主索引列。
重要
?
?
?
2)?
索引中,尽量避免使用NULL。
重要
?
?
?
3)?
对于索引的比较,尽量避免使用NOT=(!
=)。
重要
?
?
?
4)?
查询列和排序列与索引列次序保持一致。
4?
其他经验性规则
重要
?
?
?
1)?
任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。