敏捷技巧之一:移除重复代码

最近看了一下《essential skills for agile development》边看边做点笔记。先看看下面这个类:

BookRentals 类public class BookRentals{
    private Vector rentals;
    public String getCustomerName(String rentalId){
    	
    	    BookRental rental = (BookRental) rentals.elementAt(i);
    	    if (rental.getId().equals(rentalId)){
    	    	return rental.getCustomerName();
    	    }    	    
    	}
    	throw new RentalNotFoundException();
    }  
    public void deleteRental(String rentalId){
    	
    	    BookRental rental = (BookRental) rentals.elementAt(i);
    	    if (rental.getId().equals(rentalId)){
    	    	rentals.remove(i);
    	    	return;
    	    }    	    
    	}
    	throw new RentalNotFoundException();
    }         
}

代码中两个成员函数getCustomerName和deleteRental中,for循环代码重复,试想一下,BookRental类中,rentals为Vector类型,如果将它改为数组,就必须所有包含rentals.size()改为rentals.length.

重构一下变成:

重构后的BookRentals 类public class BookRentals {
	private Vector rentals;
	
	public String getCustomerName(String rentalId) {
	  int rentalIdx = (rentalId);
	  return ((BookRental) rentals.elementAt(rentalIdx)).getCustomerName();
	}
	
	public void deleteRental(String rentalId) {
	  rentals.remove((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();
	}
}
RentalNotFoundException 类public class RentalNotFoundException extends Exception{
	
}


我们可以看到,重构后,即使rentals改为数组,只需要在getRentalIdxById中把 rentals.elementAt(i)改为 rentals[i]即可。

 

看看下面几个例子:

1. Organization类

Organization 类class Organization {
	String id;
	String eName; //English name
	String cName; //Chinese name
	String tel;
	String tel;
	String tel;
	String fax;
	String fax;
	String fax;
	String EFirstName; //First name and last name in English
	String ELastName;
	String contactPersonCFirstName; //First name and last name in Chinese
	String contactPersonCLastName;
	String contactPersonTel;
	String contactPersonTel;
	String contactPersonTelNumber;
	String contactPersonFaxCountryCode;
	String contactPersonFaxAreaCode;
	String contactPersonFaxLocalNumber;
	String contactPersonMobileCountryCode;
	String contactPersonMobileAreaCode;
	String contactPersonMobileLocalNumber;
	...
	}

显然这不是一个有效的设计,这个类只封装了一些基本的属性,而且这些属性中,存在大多的重复代码,我们可以将它剥离出来,变成如下形式:

重构Organization 类class Organization {
	String id;
	String ;
	String ;
	 telNo;
	TelNo faxNo;
	 contactPerson;
	...
	}

class ContactPerson{
	String ;
	String ;
	String cFirstName;
	String cLastName;
	TelNo tel;
	TelNo fax;
	TelNo mobile;
}

class TelNo {
	String countryCode;
	String areaCode;
	String localNumber;
}

如果还觉得不爽,可以将名字封装成一个类:

重构姓名类class ContactPerson{
	FullName eFullName;
	FullName cFullName;
	TelNo tel;
	TelNo fax;
	TelNo mobile;
} 
class FullName {
	String firstName;
	String lastName;
}


 

记住:万物皆对象!!!

转载于:https://www.cnblogs.com/jayceauyeung/archive/2010/12/03/1895781.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值