当前页面: 开发资料首页 → JBuilder 专题 → JBuilder 2005 代码审查 (1)
摘要: JBuilder 2005 代码审查 (1) • 概述 on error resume next ShockMode = (IsObject(CreateObject('Shockwave...
|
代码审查作为 JBuilder 2005 强大的新特性闪亮登场,直指编码中的软肋,力争将编码中的错误或隐患扼杀于萌芽态,强力提升开发人员的编码质量。
JBuilder 2005 根据 Sun 的编码规范及软件开发界总结出的一套行之有效的编码习惯,对 Java 开发中的编码风格、声明风格、 Javadoc 文档注释、 EJB 规范、命名风格、潜在错误、编码中的画蛇添足等诸多方面进行代码审查并给出警示,以便开发人员发现这些不足和隐患予以及时更正。
代码审查和语法错误检查是两个不同层次的概念。语法错误是低层次、强制性的检查,任何违反语法的程序都无法通过编译,也就是说可运行的程序必须是语法正确的。而代码审查是高级别,非强制性的检查,它对语法正确的程序施加了更高更严格的要求,从而提升程序的可读性、降低因变量命名、方法定义、程序逻辑的不完整性等问题而导致程序的潜在出错机率,增加程序的可维护性和健壮性。
各种各样 的 Java 编程规范、编程范式以及编程经验都致力于提升代码质量,程序性能,软件维护性等非语法方法的课题, JBuilder 2005 代码审查即是将各种行之有效的编程规范、范式、经验施加于你的程序中,以使你的程序遵守这些业已被大量的实践证明是成功的编程准则。
JBuilder 2005 在默认的情况下设置的代码审查机制即是 Sun 的代码编程规范,此外还提供了大量可供选择的审查规则,你可以根据需要激活或关闭这些审查的规则。
对于初学者来说,代码审查无疑是学习和工作的良师益友, JBulder 2005 通过即时的代码审查达到了对开发人员“监督匡正、笃行扶弱”的作用。开发人员也可以通过代码审查所反馈的问题,学习有关语法之外更多的编程要求和经验。
在默认情况下, JBuilde 2005 未激活代码审查的功能,可以通过 Project->Project Properties...->Code Audits 调用代码审查的设置页,如图 1 所示:
图 1 代码审查设置
勾选 Code Audits 设置页中的“ Enable Code Audits ”激活当前工程的代码审查功能。 Code Audits 设置页的左边是一棵代码审查规则项的树,分为两级,第一级为审查规则项的归类,点开第一级的节点,第二级的各节点为具体的一个规则项,可以根据需要勾选可取消这些审查的规则。
点击规则项,在 Code Audits 设置页的右边显示出了该规则的详细描述信息并提供了实例,方便开发人员学习和理解。
在激活代码审查规则后, JBuilder 2005 实时地审查编辑器中当前编写的程序文件,并在违反审查规则代码附近的控制槽上标注 ,违反规则代码的关键处将以一条粉红色的下划波浪线标识出来,此外在结构窗格的 Warning 文件夹下列出当前程序所有违反审查规则的代码,如图 2 所示:
图 2 结构窗格中代码审查结果汇总
审查结果项描述了代码中存在的问题的简要描述,通过这个提示和编译器控制槽上的 标识,点选审查结果项时,编辑器中相应的代码内容将以下划虚线形式显示,通过查看相应的代码,开发人员将能够快速发现问题所在。更正问题后,对应的审查警告将自动从 Warning 文件夹中清除。
|
根据 Sun 的编码规范,每个 switch 流程控制语句都必须带一个 default 分支,以保证逻辑分支的完整性。在默认情况下该审查项未激活,对应的设置项是“ Coding Style ” 下的“ 'switch' Statement Should Include a Default Case ”。
代码清单 1 所有 switch 必须带 default 分支
1 switch (formatType)
2{
3 case 1:
4formatStr = "yyyyMMddHHmmss";
5 break;
6case 2:
7formatStr = "yyyy'-'MM'-'dd HH:mm:ss";
8break;
9case 3:
10formatStr = "yyyy.MM.dd HH:mm:ss";
11break;
12case 4:
13formatStr = "yyyy' 年 'MM' 月 'dd HH:mm:ss";
14break;
15default:
16formatStr = "yyyy'-'MM'-'dd HH:mm:ss";
17 }
如果没有第 15~16 行的 default 代码,代码审查将给出警告。
提示:
可以通过 Ctrl+J 调用 switch 代码模板录入的 switch 流程控制语句代码块将带一个 default 分支,这样,不但加速了编码的录入效率还保证了代码块的规范性。
类中所有的静态方法或变量都应该通过类名来引用,如果通过类的实例来引用这些静态的成员将影响到程序的可读性。如果通过类名来引用静态变量,将容易分辨出这些成员的静态属性。因为类静态成员变量在 JVM 中仅存在一份,而非每个对象实例各自一份,因此静态成员变量可以看成类的成员。
代码清单 2 关于静态成员的引用
1 public class ASMO1
2{
3 void func()
4{
5ASMO1 obj1 = new ASMO1();
6ASMO2 obj2 = new ASMO2();
7obj1.attr = 10; // 应更正为 ASMO1.attr
8 obj2.attr = 20; // 应更正为 ASMO2.attr
9obj1.oper(); // 应更正为 ASMO1. oper();
10obj2.oper(); // 应更正为 ASMO2. oper();
11this.attr++; // 应更正为 ASMO2. attr++;
12 this.oper(); // 应更正为 ASMO2 oper();
13 }
14static int attr;
15 static void oper()
16 {}
17}
18 class ASMO2
19 {
20static int attr;
21static void oper()
22 {}
23 }
该审查规则对应的设置项是“ Coding Style ” 下的“ Accessing Static Members by the Descendant Class Name ”。
|
往往有些程序员热衷于将 Java 的语法发挥到极致,以资其对 Java 语法精通的凭据。如果是为了练习语法、理解语法,无可厚非。但如果在需要充分协作沟通的软件项目中,简洁明了,清晰易懂将会受到推崇,晦涩难懂的语句将会受到奚落,毕竟水静流深、重剑无锋,大师级鬼斧神工的设计常常蕴于简洁明了的代码之中。
故此,大部分的软件公司的规范都对语句的精简明了提出了要求。 JBuilder 2005 代码审查可以在一定程度上帮助公司落实和贯彻这一要求。
代码清单 3 演示了晦涩的赋值语句及替代的写法:
代码清单 3 复杂晦涩的赋值语句
1int i = 0;
2int j = 0;
3int k = 0;
4 int l = 0;
5i *= ++j;
6// 应更改为:
7//++j;
8//i *= j;
9 k = j = 10;
10// 应更改为:
11//k = 10;
12//j = 10;
13l = j += 15;
14// 应更改为:
15 //j += 15;
16 //l = j;
17i = j++ +20;
18 // 应更改为:
19//i = j + 20;
20//j++;
21i = (j = 25) + 30;
22 // 应更改为:
23//j = 25;
24 //i = j + 30;
25 i = j++ + 20;
26// 应更改为:
27//i = j + 20;
28//j++;
29 i = (j = 25) + 30;
30 // 应更改为:
31 //j = 25;
32 //i = j + 30;
JBuilder 2005 初始状态下没有激活对复杂的赋值语句的审查,该审查内容对应“ Coding Style ”下的“ Complex Assignment ”设置项。
除需要注意赋值语句外,由于 for 循环控制语句的高度灵活性,所以 for() 中的代码往往是复杂晦涩代码的乐园,在 for 语句中以逗号分隔的赋值语句最多不应超过 3 个:
代码清单 4 复杂的 for 语句
1for (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 ”设置项。
|
在可能的情况下使用赋值运行符( =, /=, %=, +=, -=, <<=, >>=, >>>=, &=, ^=, 和 |= ),因为这些语句能够提高编码录入的速度,增强代码的简洁性,同时赋值运行符使某些编辑器运行得更快。
代码清单 5 使用赋值运行符
1void oper () {
2int i = 0;
3i = i + 20;
4i = 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 ”的设置项。
|
不应将多行语句写在同一行代码中。该审查内容对应“ Coding Style ”下的“ Multiple Statements on One Line ”设置项。
代码块应以“ {} ”框起来,虽然增长了代码,但代码结构性更强。该审查内容对应“ Coding Style ”下的“ Place Statement in Block ” 设置项。
声明长整型使用大写的“ L ”,而非小写的“ l ”,因为后者和数字 1 相似。该审查内容对应“ Coding Style ”下的“ Use 'L' instead of 'l' at the End of Integer Constants ”设置项。
代码清单 6 说明了上述的审查项:
代码清单 6 其他代码风格的审查
1 i++;
2j++;
3 // 应更改为
4 // i++;
5// j++;
6 if (val < 0)
7return;
8while (val >= 10)
9val /= 10;
10 // 应更改为
11 //if (val < 0)
12 //{
13 // return;
14//}
15 //while (val >= 10)
16//{
17 // val /= 10;
18//}
19 void func () {
20 long var = 0x0001111l;
21 }
22 // 应更改为
23 void func () {
24long var = 0x0001111L;
25 }
此外, JBuilder 2005 还提供了众多的代码风格审查项,读者需要根据实际需要出发,自决取舍。