使用Jbuilder 2005代码审查
在默认情况下,JBuilde 2005未激活代码审查的功能,可以通过Project->Project Properties...->Code Audits调用代码审查的设置页,如图1所示:
 图代码审查设置 | 勾选Code Audits设置页中的"Enable Code Audits"激活当前工程的代码审查功能。Code Audits设置页的左边是一棵代码审查规则项的树,分为两级,第一级为审查规则项的归类,点开第一级的节点,第二级的各节点为具体的一个规则项,可以根据需要勾选可取消这些审查的规则。
点击规则项,在Code Audits设置页的右边显示出了该规则的详细描述信息并提供了实例,方便开发人员学习和理解。
在激活代码审查规则后,JBuilder 2005实时地审查编辑器中当前编写的程序文件,并在违反审查规则代码附近的控制槽上标注 ,违反规则代码的关键处将以一条粉红色的下划波浪线标识出来,此外在结构窗格的Warning文件夹下列出当前程序所有违反审查规则的代码,如图2所示:
 图结构窗格中代码审查结果汇总 | 审查结果项描述了代码中存在的问题的简要描述,通过这个提示和编译器控制槽上的 标识,点选审查结果项时,编辑器中相应的代码内容将以下划虚线形式显示,通过查看相应的代码,开发人员将能够快速发现问题所在。更正问题后,对应的审查警告将自动从Warning文件夹中清除。
代码风格审查
1、"switch"必须带一个default语句
根据Sun的编码规范,每个switch流程控制语句都必须带一个default分支,以保证逻辑分支的完整性。在默认情况下该审查项未激活,对应的设置项是"Coding Style" 下的"'switch' Statement Should Include a Default Case"。
代码清单 1 所有switch必须带default分支
1. switch (formatType) 2. { 3. case 1: 4. formatStr = "yyyyMMddHHmmss"; 5. break; 6. case 2: 7. formatStr = "yyyy'-'MM'-'dd HH:mm:ss"; 8. break; 9. case 3: 10. formatStr = "yyyy.MM.dd HH:mm:ss"; 11. break; 12. case 4: 13. formatStr = "yyyy'年'MM'月'dd HH:mm:ss"; 14. break; 15. default: 16. formatStr = "yyyy'-'MM'-'dd HH:mm:ss"; 17. } |
如果没有第15~16行的default代码,代码审查将给出警告。
提示:
可以通过Ctrl+J 调用switch代码模板录入的switch流程控制语句代码块将带一个default分支,这样,不但加速了编码的录入效率还保证了代码块的规范性。
2、应通过类名引用静态成员
类中所有的静态方法或变量都应该通过类名来引用,如果通过类的实例来引用这些静态的成员将影响到程序的可读性。如果通过类名来引用静态变量,将容易分辨出这些成员的静态属性。因为类静态成员变量在JVM中仅存在一份,而非每个对象实例各自一份,因此静态成员变量可以看成类的成员。
代码清单 2 关于静态成员的引用
1. public class ASMO1 2. { 3. void func() 4. { 5. ASMO1 obj1 = new ASMO1(); 6. ASMO2 obj2 = new ASMO2(); 7. obj1.attr = 10; //应更正为ASMO1.attr 8. obj2.attr = 20; //应更正为ASMO2.attr 9. obj1.oper(); //应更正为ASMO1. oper(); 10. obj2.oper(); //应更正为ASMO2. oper(); 11. this.attr++; //应更正为ASMO2. attr++; 12. this.oper(); //应更正为ASMO2 oper(); 13. } 14. 15. static int attr; 16. static void oper() 17. {} 18. } 19. 20. class ASMO2 21. { 22. static int attr; 23. static void oper() 24. {} 25. } | 该审查规则对应的设置项是"Coding Style" 下的"Accessing Static Members by the Descendant Class Name"。
3、避免复杂晦涩代码
往往有些程序员热衷于将Java的语法发挥到极致,以资其对Java语法精通的凭据。如果是为了练习语法、理解语法,无可厚非。但如果在需要充分协作沟通的软件项目中,简洁明了,清晰易懂将会受到推崇,晦涩难懂的语句将会受到奚落。
故此,大部分的软件公司的规范都对语句的精简明了提出了要求。JBuilder 2005代码审查可以在一定程度上帮助公司落实和贯彻这一要求。
代码清单3演示了晦涩的赋值语句及替代的写法:
代码清单 3 复杂晦涩的赋值语句
1. int i = 0; 2. int j = 0; 3. int k = 0; 4. int l = 0; 5. i *= ++j; 6. //应更改为: 7. //++j; 8. //i *= j; 9. 10. k = j = 10; 11. //应更改为: 12. //k = 10; 13. //j = 10; 14. 15. l = j += 15; 16. //应更改为: 17. //j += 15; 18. //l = j; 19. 20. i = j++ +20; 21. //应更改为: 22. //i = j + 20; 23. //j++; 24. 25. i = (j = 25) + 30; 26. //应更改为: 27. //j = 25; 28. //i = j + 30; 29. 30. i = j++ + 20; 31. //应更改为: 32. //i = j + 20; 33. //j++; 34. 35. i = (j = 25) + 30; 36. //应更改为: 37. //j = 25; 38. //i = j + 30; | JBuilder 2005 初始状态下没有激活对复杂的赋值语句的审查,该审查内容对应"Coding Style"下的"Complex Assignment"设置项。
除需要注意赋值语句外,由于for循环控制语句的高度灵活性,所以for()中的代码往往是复杂晦涩代码的乐园,在for语句中以逗号分隔的赋值语句最多不应超过3个:
代码清单 4 复杂的for语句
1. for (i = 0, j = 0, k = 10, l = -1; i < 10; i++, j++, k--, l += 2) 2. { 3. //do something 4. } 5. //应改写成下面的样式 6. //l = -1; 7. //for (i = 0, j = 0, k = 10; i < cnt; i++, j++, k--) 8. //{ 9. // //do something 10. // l += 2; 11. //} | 该审查内容对应对应"Coding Style"下的"Complex Initialization or Update Clauses in 'for' Loops"设置项。
4、尽量使用赋值运算符
在可能的情况下使用赋值运行符(=, /=, %=, +=, -=, <<=, >>=, >>>=, &=, ^=, 和|=),因为这些语句能够提高编码录入的速度,增强代码的简洁性,同时赋值运行符使某些编辑器运行得更快。
代码清单 5 使用赋值运行符
1. void oper () { 2. int i = 0; 3. i = i + 20; 4. i = 30 * i; 5. } 6. //应改写成 7. //void oper () 8. //{ 9. // int i = 0; 10. // i += 20; 11. // i *= 30; 12. //} | 该审查内容对应"Coding Style"下的"Use Abbreviated Assignment Operator"的设置项。
5、其他代码风格的审查
1) 不应将多行语句写在同一行代码中。该审查内容对应"Coding Style"下的"Multiple Statements on One Line"设置项。
2) 代码块应以"{}"框起来,虽然增长了代码,但代码结构性更强。该审查内容对应"Coding Style"下的"Place Statement in Block" 设置项。
3) 声明长整型使用大写的"L",而非小写的"l",因为后者和数字1相似。该审查内容对应"Coding Style"下的"Use 'L' instead of 'l' at the End of Integer Constants"设置项。
代码清单6说明了上述的审查项:
代码清单 6 其他代码风格的审查
1. i++; 2. j++; 3. //应更改为 4. // i++; 5. // j++; 6. 7. if (val < 0) 8. return; 9. while (val >= 10) 10. val /= 10; 11. //应更改为 12. //if (val < 0) 13. //{ 14. // return; 15. //} 16. //while (val >= 10) 17. //{ 18. // val /= 10; 19. //} 20. 21. void func () { 22. long var = 0x0001111l; 23. } 24. //应更改为 25. void func () { 26. long var = 0x0001111L; 27. } | 此外,JBuilder 2005还提供了众多的代码风格审查项,读者需要根据实际需要出发,自决取舍。
|
|