敏捷开发的必要技巧:移除重复代码
2015-05-13 21:15
316 查看
本文作者介绍了重复代码的出现场景, 以及如何消除重复代码.
作者:Wingel 来源:http://www.matrix.org.cn/
请观察下面的代码,我们已经有一个根据出租记录的id取出租用客户姓名的方法:getCustomerName。
假定现在你要增加一个新的方法,该方法是根据出租记录的id删除该记录,你把这方法命名为deleteRental(String rentalId)。现在你已经考虑到,就像getCustomerName这个方法一样,也要一个一个遍历出租记录。所以你就将getCustomerName这个方法里面的一些代码拷出来,然后稍微修改一下:
现在这样的代码看起来怎么样?不怎么样,两个方法有大多的同样的代码了。
移除重复代码吧!
要移除所有的重复代码,你可以将BookRentals这个类修成如下的样子(也就是“重构”了):
为什么我们要移除重复代码?
我来向各位程序员同学稍微说一下,在BookRentals这个类中,rentals这个属性的类型是Ventor,如果我们需要将它改为数组,那我们就必须将所有的"rentals.size()"改为"rentals.length". 在重构以后的版本中,我们只需要在getRentalIdxById这个方法中修改一次,而在原来的版本,我们就得在getCustomerName跟deleteRental两个方法中都改一次。类似的,我们还要将所有的"rentals.elementAt(i)" 改为 "rentals[i]". 又是改一次跟改两次的比较!
大多数情况中,如果类似这样的代码在10个地方重复,当我们修改代码的时候,就要修改10个地方,我们并不能保证能把这10个地方都记住了,而一旦漏掉了几个地方,等待我们的,是一处一处的错误去修复。而最致命的是,当我们修改的是业务逻辑时,这时候,不管我们漏掉了几个地方,IDE都不会报错,那么,等待我们的,将是一堆Bug去检查,而造成的一些bug中,很可能是短时间内还发现不了的. 惨-_-!!
资源:
pdf下载
敏捷开发的必要技巧:移除重复代码
Wingel 发表于 2006-12-18 10:37:25作者:Wingel 来源:http://www.matrix.org.cn/
摘要:
本文作者介绍了重复代码的出现场景, 以及如何消除重复代码. 重复代码是怎么产生的?请观察下面的代码,我们已经有一个根据出租记录的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中,很可能是短时间内还发现不了的. 惨-_-!!
资源:
pdf下载
相关文章推荐
- 敏捷开发的必要技巧:移除重复代码
- 敏捷开发的必要技巧:移除重复代码
- 敏捷开发的必要技巧:将注释转为代码
- 敏捷开发的必要技巧:保持代码简洁
- 敏捷开发的必要技巧
- android 开发技巧(2)--使用延迟加载以及避免代码重复
- 敏捷开发的必要技巧(转)
- 敏捷开发的必要技巧
- 50个Android开发技巧(2,使用延迟加载以及避免代码重复,include和viewstub)
- 敏捷开发技巧-消除代码异味
- 敏捷开发技巧-消除代码异味
- 敏捷开发的必要技巧:处理不合适的依赖[转载]
- 敏捷开发“松结对编程”系列之十二:L型代码结构(质量篇之一)
- 敏捷开发之产品日日新,一步通之---自动化代码构建->自动化打包->自动化安装部署
- 敏捷开发“松结对编程”实践之五:代码检查篇(大型研发团队,学习型团队,139团队,师徒制度,代码审查)
- 敏捷开发中编写高质量Java代码(转)
- 敏捷开发“松结对编程”实践之四:日常工作篇(大型研发团队,学习型团队,139团队,师徒制度,检查点,代码审查,每日立会)
- 学习老外用webstorm开发nodejs的技巧--代码提示DefinitelyTyped
- 敏捷开发中编写高质量Java代码
- jQuery代码开发技巧收集,jquery常用的开发代码