代码审查作为JBuilder 2005强大的新特性闪亮登场,直指编码中的软肋,力争将编码中的错误或隐患扼杀于萌芽态,强力提升开发人员的编码质量。
JBuilder 2005根据Sun的编码规范及软件开发界总结出的一套行之有效的编码习惯,对Java开发中的编码风格、声明风格、Javadoc文档注释、EJB规范、命名风格、潜在错误、编码中的画蛇添足等诸多方面进行代码审查并给出警示,以便开发人员发现这些不足和隐患予以及时更正。
代码审查和语法错误检查是两个不同层次的概念。语法错误是低层次、强制性的检查,任何违反语法的程序都是无法通过编译的,也就是说可运行的程序必须是语法正确的。而代码审查是高级别,非强制性的检查,它对语法正确的程序施加了更高更严格的要求,从而提升程序的可读性、降低因变量命名、方法定义、程序逻辑的不完整性等问题而导致程序的潜在出错机率,增加程序的可维护性和健壮性。
林林总总的Java编程规范、编程范式以及编程经验都致力于提升代码质量,程序性能,软件维护性等非语法方法的课题,JBuilder 2005代码审查即是将各种行之有效的编程规范、范式、经验施加于你的程序中,以使你的程序遵守这些业已被大量的实践证明是成功的编程准则。
JBuilder 2005在默认的情况下设置的代码审查机制即是Sun的代码编程规范,此外还提供了大量可供选择的审查规则,你可以根据需要激活或关闭这些审查的规则。
对于初学者来说,代码审查无疑是学习和工作的良师益友,JBulder 2005通过即时的代码审查达到了对开发人员"监督匡正、笃行扶弱"的作用。开发人员也可以通过代码审查所反馈的问题,学习有关语法之外更多的编程要求和经验。
一、使用代码审查
在默认情况下,JBuilde 2005未激活代码审查的功能,可以通过Project-Project Properties...-Code Audits调用代码审查的设置页。
二、代码风格审查
往往有些程序员热衷于将Java的语法发挥到极致,以资其对Java语法精通的凭据。但在需要充分协作沟通的软件项目中,简洁明了,清晰易懂将会受到推崇,晦涩难懂的语句将会受到奚落。故大部分的软件公司的规范都对语句的精简明了提出了要求。JBuilder 2005代码审查可以在一定程度上帮助公司落实和贯彻这一要求。
三、声明审查
成员变量和局部变量的隐藏,常常会使开发人员张冠李戴,犯一些不经意的错误,而子类隐藏父类的成员和静态变量常常是由于没有注意到父类中已经具有相同的名字而引起的,由此而生产的程序Bug由于其隐身性强,是很难被发现,JBuilder 2005提供几个对声明进行审查的工具。
四、命名风格
良好的命名风格在遵守Java命名语法之上,对命名提出了更高的要求,良好的命名风格必须遵守Java的命名规则
五、潜在错误审查
由于流程控制语句语法的特殊性,编写程序时需要特别注意,否则将会埋下祸根,JBuilder从多个方面对这些语句进行审查。
六、规避各种画蛇添足
JBuilder 2005代码审查功能的强大还在于能够判断多余的import包引入、不必要的强制类型转换、无用成员、多余的接口修饰符等。
七、其他
在程序中,由于种种原因存在无效表达式,或者程序永远不能使用的程序段,对于这些无用的代码,JBuilder 2005提供的代码审查功能也能查出来,并提醒程序员。
总结
JBuilder 2005提供了语法之上的代码审查功能,使用好代码审查功能不但可以增强程序代码的简洁性、可读性,还可以尽早发现潜在的编码错误,防患于未然。
JBuilder 2005代码审查功能无疑是一项开创性的工作,将对程序开发产生深远的影响,也是智能开发工具的一个发展方向。
使用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 = 2