最近看了一下《essential skills for agile development》边看边做点笔记。先看看下面这个类:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
BookRentals 类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();
}
}
代码中两个成员函数getCustomerName和deleteRental中,for循环代码重复,试想一下,BookRental类中,rentals为Vector类型,如果将它改为数组,就必须所有包含rentals.size()改为rentals.length.
重构一下变成:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
重构后的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();
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
RentalNotFoundException 类public class RentalNotFoundException extends Exception{
}
我们可以看到,重构后,即使rentals改为数组,只需要在getRentalIdxById中把
rentals.elementAt(i)改为
rentals[i]即可。
看看下面几个例子:
1. Organization类
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Organization 类class Organization {
String id;
String eName; //English name
String cName; //Chinese name
String telCountryCode;
String telAreaCode;
String telLocalNumber;
String faxCountryCode;
String faxAreaCode;
String faxLocalNumber;
String contactPersonEFirstName; //First name and last name in English
String contactPersonELastName;
String contactPersonCFirstName; //First name and last name in Chinese
String contactPersonCLastName;
String contactPersonTelCountryCode;
String contactPersonTelAreaCode;
String contactPersonTelNumber;
String contactPersonFaxCountryCode;
String contactPersonFaxAreaCode;
String contactPersonFaxLocalNumber;
String contactPersonMobileCountryCode;
String contactPersonMobileAreaCode;
String contactPersonMobileLocalNumber;
...
}
显然这不是一个有效的设计,这个类只封装了一些基本的属性,而且这些属性中,存在大多的重复代码,我们可以将它剥离出来,变成如下形式:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
重构Organization 类class Organization {
String id;
String eName;
String cName;
TelNo telNo;
TelNo faxNo;
ContactPerson contactPerson;
...
}
class ContactPerson{
String eFirstName;
String eLastName;
String cFirstName;
String cLastName;
TelNo tel;
TelNo fax;
TelNo mobile;
}
class TelNo {
String countryCode;
String areaCode;
String localNumber;
}
如果还觉得不爽,可以将名字封装成一个类:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
重构姓名类class ContactPerson{
FullName eFullName;
FullName cFullName;
TelNo tel;
TelNo fax;
TelNo mobile;
}
class FullName {
String firstName;
String lastName;
}
记住:万物皆对象!!!