linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > JAVA >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·Ajax实现在textbox中模糊查询显
·Ajax实现分页查询
·java定时执行的三种方法
·读取数码照片中的Exif信息
·基于Spring+Hibernate+Eclip
·JAVA反编译工具jad的简单用法
·Java编程基础
·Java调用Oracle的过程和函数
·JSP获取客户端的浏览器和操作系
·java.lang包概述
·Java中利用通讯API编写短信软件
·利用Java实现网页浏览器
·Java文件操作大全
·JAVA技术:上传图片的缩放处理
·基于JSF和DAO模式的大型设备采
最新文章
·实例解析:Linux操作系统下Jav
·JAVA得到网卡物理地址(Windows
·Ajax实现在textbox中模糊查询显
·Ajax简单示例之改变下拉框动态
·AJAX如何与后台交互
·Ajax实现分页查询
·Ajax核心:XMLHTTP组件相关技术
·面向Java程序员的Ajax:构建动态
·JSP获取客户端的浏览器和操作系
·提高Java技能的几种简单有效的
·敏捷开发中需掌握移除重复代码
·Java中利用通讯API编写短信软件
·关于String和StringBuffer
·用Java得到硬盘空间
·如何优化JAVA程序设计和编码,
Google
 
敏捷开发中需掌握移除重复代码的技巧
[ 作者:  加入时间:2007-10-25 13:57:26  来自:51CTO ]

重复代码是怎么产生的?qTuLinux联盟
请观察下面的代码,我们已经有一个根据出租记录的id取出租用客户姓名的方法:getCustomerName。

public class BookRental { //该类描述出租记录qTuLinux联盟
String id; qTuLinux联盟
String customerName; qTuLinux联盟
... qTuLinux联盟
} qTuLinux联盟
public class BookRentals { qTuLinux联盟
private Vector rentals; qTuLinux联盟
public String getCustomerName(String rentalId) { 根据出租id取出客户姓名qTuLinux联盟
for (int i = 0; i < rentals.size(); i++) { qTuLinux联盟
BookRental rental = (BookRental) rentals.elementAt(i); qTuLinux联盟
if (rental.getId().equals(rentalId)) { qTuLinux联盟
return rental.getCustomerName(); qTuLinux联盟
} qTuLinux联盟
} qTuLinux联盟
throw new RentalNotFoundException(); qTuLinux联盟
} qTuLinux联盟
} qTuLinux联盟
public class RentalNotFoundException extends Exception { qTuLinux联盟
... qTuLinux联盟
}

假定现在你要增加一个新的方法,该方法是根据出租记录的id删除该记录,你把这方法命名为deleteRental(String rentalId)。现在你已经考虑到,就像getCustomerName这个方法一样,也要一个一个遍历出租记录。所以你就将getCustomerName这个方法里面的一些代码拷出来,然后稍微修改一下:

public class BookRentals { qTuLinux联盟
private Vector rentals; qTuLinux联盟
public String getCustomerName(String rentalId) { qTuLinux联盟
for (int i = 0; i < rentals.size(); i++) { qTuLinux联盟
BookRental rental = (BookRental) rentals.elementAt(i); qTuLinux联盟
if (rental.getId().equals(rentalId)) { qTuLinux联盟
return rental.getCustomerName(); qTuLinux联盟
} qTuLinux联盟
} qTuLinux联盟
throw new RentalNotFoundException(); qTuLinux联盟
} qTuLinux联盟
public void deleteRental(String rentalId) { qTuLinux联盟
for (int i = 0; i < rentals.size(); i++) { qTuLinux联盟
BookRental rental = (BookRental) rentals.elementAt(i); qTuLinux联盟
if (rental.getId().equals(rentalId)) { qTuLinux联盟
rentals.remove(i); qTuLinux联盟
return; qTuLinux联盟
} qTuLinux联盟
} qTuLinux联盟
throw new RentalNotFoundException(); qTuLinux联盟
} qTuLinux联盟
}

现在这样的代码看起来怎么样?不怎么样,两个方法有大多的同样的代码了。qTuLinux联盟
移除重复代码吧!qTuLinux联盟
要移除所有的重复代码,你可以将BookRentals这个类修成如下的样子(也就是“重构”了):

public class BookRentals { qTuLinux联盟
private Vector rentals; qTuLinux联盟
public String getCustomerName(String rentalId) { qTuLinux联盟
int rentalIdx = getRentalIdxById(rentalId); qTuLinux联盟
return ((BookRental) rentals.elementAt(rentalIdx)).getCustomerName(); qTuLinux联盟
} qTuLinux联盟
public void deleteRental(String rentalId) { qTuLinux联盟
rentals.remove(getRentalIdxById(rentalId)); qTuLinux联盟
} qTuLinux联盟
private int getRentalIdxById(String rentalId) { //新增加的一个方法qTuLinux联盟
for (int i = 0; i < rentals.size(); i++) { qTuLinux联盟
BookRental rental = (BookRental) rentals.elementAt(i); qTuLinux联盟
if (rental.getId().equals(rentalId)) { qTuLinux联盟
return i; qTuLinux联盟
} qTuLinux联盟
} qTuLinux联盟
throw new RentalNotFoundException(); qTuLinux联盟
} qTuLinux联盟
}

为什么我们要移除重复代码? qTuLinux联盟
我来向各位程序员同学稍微说一下,在BookRentals这个类中,rentals这个属性的类型是Ventor,如果我们需要将它改为数组,那我们就必须将所有的“rentals.size()”改为“rentals.length”。在重构以后的版本中,我们只需要在getRentalIdxById这个方法中修改一次,而在原来的版本,我们就得在getCustomerName跟deleteRental两个方法中都改一次。类似的,我们还要将所有的“rentals.elementAt(i)”改为“rentals[i]”。又是改一次跟改两次的比较!qTuLinux联盟
大多数情况中,如果类似这样的代码在10个地方重复,当我们修改代码的时候,就要修改10个地方,我们并不能保证能把这10个地方都记住了,而一旦漏掉了几个地方,等待我们的,是一处一处的错误去修复。而最致命的是,当我们修改的是业务逻辑时,这时候,不管我们漏掉了几个地方,IDE都不会报错,那么,等待我们的,将是一堆Bug去检查,而造成的一些bug中,很可能是短时间内还发现不了的. 惨-_-!!

Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·通过JAVAScript实现页面自适应  (2007-10-30 14:27:43)
 ·如何优化JavaScript脚本的性能  (2007-10-30 14:25:25)
 ·几个有用的Javascript验证脚本  (2007-10-30 14:24:47)
 ·Javascript+ASP打造无刷新新闻列表  (2007-10-30 14:23:38)
 ·如何用javascript防止双击  (2007-10-30 14:19:44)
 ·JavaScript 访问 JSF 组件的方法  (2007-10-30 14:18:21)
 ·JavaScript实现仿Windows关机效果  (2007-10-30 14:14:42)
 ·JavaScript去除空格的三种方法  (2007-10-30 14:07:32)
 ·用Javascript评估用户输入密码的强度  (2007-10-30 14:06:19)
 ·JavaScript处理事件:单击事件onClick  (2007-10-30 14:01:38)