最近看了一下《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; }
记住:万物皆对象!!!