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

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

JBuilder 2005 代码审查 (3)

摘要: JBuilder 2005 代码审查 (3) • 规避各种画蛇添足 • 将布尔变量和布尔值比较 on error resume next ShockMode = (IsObje...
JBuilder 2005 代码审查 (3)
•  规避各种画蛇添足
•  将布尔变量和布尔值比较
<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>

没有必要将布尔变量和布尔值进行比较,应该确保在逻辑表达式中不出现“ true ”或“ false ”这两个布尔字面值:

代码清单 18 避免在逻辑表达式中出现布尔字面值

•  boolean success = init();

•  if (success == true) // 应该更正为 if(success)

•  {

•  ...

•  }

该审查内容对应于“ Superfluous Content ”下的“ Equality Operations on Boolean Arguments ”设置项。

•  无用的成员

类中 private 的成员方法和成员变量不可能在外部类中调用, JBuilder 2005 如果发现 private 的成员变量或方法并没有在内部的 protect 或 public 方法中使用,即这个成员永远不会在运行期得到引用,而成为一个无用的成员变量和方法。审查机制将其标识为未使用的成员,并予以报警。

代码清单 19 无用的成员

•  public class Unuse

•  {

•  private String name;

•  public Object value;

•   

•  private Object getValue()

•  {

•  return value;

•  }

•   

•  private void print()

•  {

•  System.out.println(getValue() + " = " + value);

•  }

•  }

代码清单 19 中 name 变量, getValue() 及 print() 方法都是无用的方法,因为不可能通过外面的类访问到这些成员, Unuse 也没有提供调用这些成员的接口,所以这些成员都可以从类中清除。

该审查内容对应于“ Superfluous Content ”下的“ Member is Not Used ”设置项。

•  多余的接口修饰符

接口都是抽象的,接口中定义的方法都是抽象且公有,即 public abstract ;接口中的常量都是 public static final 的。所以如果在接口定义、接口成员方法及接口常量声明时使用了这些修饰符则是多余的, JBuilder 2005 对此作出审查,并报告这些多余的修饰。

代码清单 20 多余的接口修饰符

•  interface Colors {

•  public static final int RED = 1;

•  public abstract void getColorName(int color);

•  }

代码清单 20 中粗体的修饰符都是多余的,应该去掉。

这些审查内容可以通过“ Superfluous Content ”下的“ Obsolete Interface Modifiers ”和 “ Unnecessary Member Modifier ”审查项来设置。

•  不必要的强制类型转换

<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 检查出这些不必要的类型转换。

代码清单 21 不必要的类型转换

•  class Animal {}

•  class Elephant extends Animal {

•  void func () {

•  int i;

•  float f = (float) i;

•   

•  Elephant e1;

•  Elephant e2 = (Elephant) e1;

•   

•  Animal a;

•  Elephant e;

•  a = (Animal) e;

•  }

•  }

代码清单 21 中粗体的强制类型转换语句都是没有必要的,应该取消强制类型转换。

该审查内容对应“ Superfluous Content ”下的“ Unnecessary type Cast ”审查项。

•  多余的 import 包引入

该审查项帮助你构建优化的 import 语句段,当程序文件中通过 import 语句引用 java.lang.* (编译器自动引入)、当前类所在的包、以及未使用的包或者重复引入包时, JBuilder2005 都将进行警告。

优先 import 包引入语句最方便方法即是在编辑器中点击右键,在弹出的菜单中选择“ Format All ”菜单项,自动优化 import 包引入程序段的代码。可以通过 Project->Project Properties...->Java Formating->Import 代码格式化设置项完成优化包引入的设置。

该审查内容对应“ Superfluous Content ”下的“ Import List Construction ”审查项。

•  其他
•  无作为的表达式

无作为的表达式表现在以下两个方面:

•  比较表达式总是返回相同的值。

代码清单 22 表达式产生恒值

•  void handleEvent(Event e){

•  if (e != null) {

•  ...

•  if (e = = null) { // 该表达式的值永远都是 false ,因为进入这个代码段的 e 恒为非空

•  ...

•  }

•  }

•  }

•   

•  void putChar(char c, boolean isLetter, boolean isDigit) {

•  if (isDigit) {

•  boolean isLetterOrDigit = isLetter || isDigit;// 该表达式的值永远都是 true

•  ...

•  }

•  }

该审查内容对应“ Expressions ”下的“ Comparison always produces the Same Result ”和“ Expression Value is Constant ”两审查项。

•  无效的算术运算。

•  当进行加法和减法运算时,有一个操作数是 0 。

•  当进行乘法运算时,乘法或被被乘数为 1 。

•  当进行除法运算时,除数为 1 。

•  当进行取模运算时,左边的操作数的绝对值比右边操作数的绝对值小,此时 x % y=x 。

•  属性赋值时,将本身的值赋给自己。

代码清单 23 无效的算术运算

•  public class NoEffect

•  {

•  private String name;

•  private int index;

•   

•  NoEffect(String n, int index)

•  {

•  this.name = name; // 将属性值赋给本身

•  this.index = index;

•  }

•   

•  int getPosition()

•  {

•  int base = 0;

•  return index + base; // 和 0 相同

•  }

•   

•  int getModule()

•  {

•  int x = 1, y = 2;

•  return x % y;// 左边操作数绝对值比右边操作数的小

•  }

•  }

该审查内容对应“ Expressions ”下的“ Operation has No Effect ”审查项。

•  流程控制中存在不可到达的语句

<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>

有些流程控制由于测试条件恒为 false ,则流程中的程序无法到达。

代码清单 24 不可至的语句

•  int[] arr = new int[size];

•  if (arr == null) // 由于 arr 不为空,则该测试逻辑不可能通过,程序无法进入该程序块中

•  {

•  return null;

•  }

该审查内容对应“ Branches and Loops ”下的“ Statement is Unreachable ” 审查项。

•  无用的流程标签

循环中标注了语句标签,则没用任何地方使用这个标签,即该标签为无用标签,应予以去除。

代码清单 25 无用的流程标签

•  int findItem(Object[] list, Object item) {

•  loop: // 程序中没有任何地方使用该标签

•  for (int i = 0; i < list.length; i++) {

•  if (list[i].equals(item)) {

•  return i;

•  }

•  }

•  return -1;

•  }

该审查内容对应“ Branches and Loops ”下的“ Label is Not Used ” 审查项。

•  总结

JBuilder 2005 提供了语法之上的代码审查功能,使用好代码审查功能不但可以增强程序代码的简洁性、可读性,还可以尽早发现潜在的编码错误,防患于未然。

JBuilder 2005 代码审查功能无疑是一项开创性的工作,将对程序开发产生深远的影响,也是智能开发工具的一个发展方向。




↑返回目录
前一篇: 利用JBuilder2005开发Web应用程序
后一篇: JBuilder 2005 代码审查 (2)