网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  敏捷开发的必要技巧:移除重复代码     
  文章作者:未知  文章来源:水木森林  
  查看:69次  录入:管理员--2007-11-17  
  重复代码是怎么产生的?

请观察下面的代码,我们已经有一个根据出租记录的id取出租用客户姓名的方法:getcustomername。

   public class bookrental { //该类描述出租记录
        string id;
        string customername;

        ...

    }
    public class bookrentals {
       private vector rentals;
       public string getcustomername(string rentalid) { 根据出租id取出客户姓名
           for (int i = 0; i < rentals.size(); i++) {
              bookrental rental = (bookrental) rentals.elementat(i);
              if (rental.getid().equals(rentalid)) {
                  return rental.getcustomername();
               }
           }
           throw new rentalnotfoundexception();
        }
    }
    public class rentalnotfoundexception extends exception {

        ...

    }


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

    public class bookrentals { 
        private vector rentals;
       public string getcustomername(string rentalid) {
           for (int i = 0; i < rentals.size(); i++) {
              bookrental rental = (bookrental) rentals.elementat(i);
              if (rental.getid().equals(rentalid)) {
                  return rental.getcustomername();
               }
           }
           throw new rentalnotfoundexception();
        }
        public void deleterental(string rentalid) {
             for (int i = 0; i < rentals.size(); i++) {
                 bookrental rental = (bookrental) rentals.elementat(i);
                 if (rental.getid().equals(rentalid)) {
                     rentals.remove(i);
                     return;
                  }
              }
             throw new rentalnotfoundexception();
         }
     }


现在这样的代码看起来怎么样?不怎么样,两个方法有大多的同样的代码了。

移除重复代码吧!

要移除所有的重复代码,你可以将bookrentals这个类修成如下的样子(也就是“重构”了):

    public class bookrentals { 
        private vector rentals;
        public string getcustomername(string rentalid) {
           int rentalidx = getrentalidxbyid(rentalid);
           return ((bookrental) rentals.elementat(rentalidx)).getcustomername();
        }
        public void deleterental(string rentalid) {
           rentals.remove(getrentalidxbyid(rentalid));
        }
        private int getrentalidxbyid(string rentalid) { //新增加的一个方法
            for (int i = 0; i < rentals.size(); i++) {
               bookrental rental = (bookrental) rentals.elementat(i);
               if (rental.getid().equals(rentalid)) {
                   return i;
               }
            }
           throw new rentalnotfoundexception();
        }
     }


为什么我们要移除重复代码?

    我来向各位程序员同学稍微说一下,在bookrentals这个类中,rentals这个属性的类型是ventor,如果我们需要将它改为数组,那我们就必须将所有的"rentals.size()"改为"rentals.length". 在重构以后的版本中,我们只需要在getrentalidxbyid这个方法中修改一次,而在原来的版本,我们就得在getcustomername跟deleterental两个方法中都改一次。类似的,我们还要将所有的"rentals.elementat(i)" 改为 "rentals[i]". 又是改一次跟改两次的比较!

    大多数情况中,如果类似这样的代码在10个地方重复,当我们修改代码的时候,就要修改10个地方,我们并不能保证能把这10个地方都记住了,而一旦漏掉了几个地方,等待我们的,是一处一处的错误去修复。而最致命的是,当我们修改的是业务逻辑时,这时候,不管我们漏掉了几个地方,ide都不会报错,那么,等待我们的,将是一堆bug去检查,而造成的一些bug中,很可能是短时间内还发现不了的. 惨-_-!!
 
 
上一篇: jdk6.0新特性:desktop和systemtray类    下一篇: string.split()用法的一点经验
  相关文档
用 jsp 创建可重用的模板和数据库脚本 11-17
实例说明java中的方法重载机制 11-17
从数据库中读出图片并显示的示例代码 11-17
网络数据流的java处理(2) 11-17
软件项目开发之 软件过程rup初探(图) 11-17
使用decorator模式 翻译者:disneytiger 11-17
详细讲述java中的克隆 11-17
java中的构建器 11-17
midlet生命周期的理解及游戏死机问题 11-17
在solairs字符界面下,支持多虚拟操作台 11-17
web services&xml:xml和j2ee的完美结合 01-11
面向方面编程aop和jboss(二) 11-17
java入门学习指导之最佳方向(下) 11-16
用java实现简单的email正则表达式判断 11-17
visual basic串口通讯调试方法 11-16
字符串分割的两种方法 11-17
j2ee综合--总结java编程中的经验教训 01-23
java中在程序中设置代理服务器 11-17
用 validator 简化 struts 的开发过程 11-17
tomcat配置技巧精华详解分析 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息