站内搜索: 请输入搜索关键词

当前页面: 开发资料首页JBuilder 专题JBuilder 2005 代码审查 (1)

JBuilder 2005 代码审查 (1)

摘要: JBuilder 2005 代码审查 (1) • 概述 on error resume next ShockMode = (IsObject(CreateObject('Shockwave...
JBuilder 2005 代码审查 (1)
•  概述
<a href="http://ad.cn.doubleclick.net/click%3Bh=v5|32b3|3|0|%2a|g%3B18281736%3B0-0%3B0%3B6694709%3B31-1|1%3B11148086|11165982|1%3B%3B%7Esscs%3D%3fhttp%3a%2f%2fwww.site.com" target="_blank"></a>

代码审查作为 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 文件夹中清除。

•  代码风格审查
•  “ switch ”必须带一个 default 语句

<a href="http://ad.cn.doubleclick.net/click%3Bh=v5|32b3|3|0|%2a|g%3B18281736%3B0-0%3B0%3B6694709%3B31-1|1%3B11148086|11165982|1%3B%3B%7Esscs%3D%3fhttp%3a%2f%2fwww.site.com" target="_blank"></a>

根据 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 ”。

•  避免复杂晦涩代码

<a href="http://ad.cn.doubleclick.net/click%3Bh=v5|32b3|3|0|%2a|g%3B18281736%3B0-0%3B0%3B6694709%3B31-1|1%3B11148086|11165982|1%3B%3B%7Esscs%3D%3fhttp%3a%2f%2fwww.site.com" target="_blank"></a>

往往有些程序员热衷于将 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 ”设置项。

•  尽量使用赋值运算符

<a href="http://ad.cn.doubleclick.net/click%3Bh=v5|32b3|3|0|%2a|g%3B18281736%3B0-0%3B0%3B6694709%3B31-1|1%3B11148086|11165982|1%3B%3B%7Esscs%3D%3fhttp%3a%2f%2fwww.site.com" target="_blank"></a>

在可能的情况下使用赋值运行符( =, /=, %=, +=, -=, <<=, >>=, >>>=, &=, ^=, 和 |= ),因为这些语句能够提高编码录入的速度,增强代码的简洁性,同时赋值运行符使某些编辑器运行得更快。

代码清单 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 ”的设置项。

其他代码风格的审查

<a href="http://ad.cn.doubleclick.net/click%3Bh=v5|32b3|3|0|%2a|g%3B18281736%3B0-0%3B0%3B6694709%3B31-1|1%3B11148086|11165982|1%3B%3B%7Esscs%3D%3fhttp%3a%2f%2fwww.site.com" target="_blank"></a>

不应将多行语句写在同一行代码中。该审查内容对应“ 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 还提供了众多的代码风格审查项,读者需要根据实际需要出发,自决取舍。




↑返回目录
前一篇: JBuilder 2005 代码审查 (2)
后一篇: 在JBUILDER中进行对类名进行大小写重构