`
Wingel
  • 浏览: 116505 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

敏捷开发的必要技巧1-2:移除重复代码,将注释转为代码

阅读更多
pdf的下载地址:
http://www.blogjava.net/Files/Wingel/敏捷开发的必要技巧第1,2章.rar
或者

http://wingel.iteye.com/topics/download/0f826a59-905d-4392-8667-7d7bfc935973


                                                                                                                   
                第1章 移除重复代码
                                                                                
重复代码是怎么产生的?

请观察下面的代码,我们已经有一个根据出租记录的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中,很可能是短时间内还发现不了了.惨-_-!!

完整的pdf下载:
http://www.blogjava.net/Files/Wingel/敏捷开发的必要技巧第1,2章.rar
或者

http://wingel.iteye.com/topics/download/0f826a59-905d-4392-8667-7d7bfc935973



 

分享到:
评论

相关推荐

    CSS -webkit-box-orient: vertical属性编译后丢失问题详解

    后来发现代码里写的好好的,一到页面上居然没有反应,和没写一个样,f12看了下,原来是-webkit-box-orient: vertical;这个属性丢失,导致了不生效,在Styles里把这个属性加上就好了,于是断定是编译过程导致这个属性...

    Java快捷键

    13. **Ctrl+Shift+J:代码模板(扩展)** - 作用:提供更复杂的代码模板选择。 - 场景:生成复杂的代码结构。 14. **Ctrl+Shift+F4:关闭所有编辑器标签** - 作用:关闭所有打开的编辑器标签页。 - 场景:清理...

    eclipse快捷键

    - 描述:将重复的表达式赋值给变量,简化代码。 30. **Alt+Shift+F** - 用途:将局部变量提升为字段。 - 描述:有助于提高代码的封装性和可维护性。 31. **Alt+Shift+I** - 用途:内联变量。 - 描述:将变量...

    Myeclipse的一些快捷键可以加快你的开发速度

    在进行软件开发时,使用高效的工具和掌握恰当的技巧对于提升工作效率至关重要。MyEclipse作为一款流行的Java集成开发环境(IDE),提供了丰富的功能来帮助开发者更快速、更轻松地完成项目。本文将详细介绍一些...

    知识共享-eclipse快捷键(雷惊风).

    - 应用场景:代码优化,提高代码可读性和安全性。 #### 二、搜索与替换快捷键 **1. 全局查找并替换:Ctrl+F** - 功能:在当前项目或整个工作区进行文本搜索和替换。 - 应用场景:查找特定字符串或模式,进行...

    cad必须知道的快捷键命令.docx

    - B:定义块,将选定的对象组合成一个可重复使用的块。 - C:画圆,创建圆形对象。 - D:尺寸资源管理器,管理与编辑尺寸标注。 - L:直线,绘制直线段。 - M:移动,移动选定的对象到新位置。 - O:偏移,...

    studio的快捷键

    - 应用场景:优化代码结构,减少重复代码。 14. **Ctrl+Alt+L:格式化代码** - 功能:自动格式化当前文件或选中的代码段。 - 应用场景:确保代码风格一致,提高可读性。 15. **Ctrl+Shift+Enter:智能完成语句*...

    MyEclipse快捷键集合

    - 实例:当需要暂时禁用某段代码时,选中该段代码并按Ctrl+/即可将其注释掉;再次按Ctrl+/则取消注释。 4. **Ctrl+D - 删除当前行** - 描述:删除当前光标所在行的代码,适用于快速删除不必要的代码行。 - 实例...

    (3.6.2)--扩展阅读:CSS清除默认样式1

    - `address, cite, dfn, em, var`:这些元素默认具有斜体样式,此代码将其字体样式重置为正常。 - `code, kbd, pre, samp, tt`:这些元素默认为等宽字体,这里指定了具体的等宽字体家族。 - `small`:默认情况下,`...

    myeclipse快捷方式大全

    - 功能:为当前行添加或移除注释。 - 使用场景:临时禁用某行代码的执行。 ##### 50. **Ctrl+Shift+M**: 导入包 - 功能:手动添加包导入语句。 - 使用场景:添加特定的包导入。 ##### 51. **Ctrl+Shift+O**: ...

    jQuery 方法大全方便学习参考

    在使用jQuery进行开发时,理解这些方法和概念对于高效编写JavaScript代码至关重要。这些方法不仅在日常开发中广泛使用,也大大提升了前端开发的效率。通过结合CSS选择器、事件处理、AJAX调用和动画效果,开发者能够...

    proteus7.10支持cortex-m3软件开发环境TSstudio说明书

    ### Proteus 7.10 支持 Cortex-M3 软件开发环境 TKStudio 说明书解析 #### 第1章 TKStudio 简介 **1.1 概述** TKStudio 是一款专为嵌入式系统设计的集成开发环境(IDE),特别适用于基于 ARM Cortex-M3 微控制器的...

    API-REST:Criaçãode uma API REST

    workbench 2-bash: sudo snap install insomnia安装必要的服务程序:移除VERSUEES ANTORIORES DO DOCKER 1 -庆典: sudo apt-get remove \ docker \ docker-engine \ docker.io \ containerd runc -yATRAALIZAR ...

    eclipse常用快捷键

    - 场景:当项目中有大量的导入语句时,使用该快捷键可以自动整理和移除未使用的导入,保持代码整洁。 11. **Ctrl+Shift+F (Format Source Code)** - 功能:格式化源代码。 - 场景:统一代码风格,提高代码可读性...

    敏捷软件开发的必要技巧

    ### 敏捷软件开发的必要技巧 #### 一、引言 随着信息技术的快速发展,软件开发的方法论也在不断地进步和完善。传统的瀑布模型等线性开发流程逐渐被更加灵活高效的敏捷开发所取代。敏捷开发强调快速迭代、持续交付...

Global site tag (gtag.js) - Google Analytics