文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>敏捷技巧之一:移除重复代码

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

时间:2010-12-03  来源:Jayce AuYeung

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.

重构一下变成:

重构后的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();
        }
}
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 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;
        ...
        }

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

重构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;
}

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

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


 

记住:万物皆对象!!!

相关阅读 更多 +
排行榜 更多 +
翌日波奇狗的历险记手机版下载

翌日波奇狗的历险记手机版下载

休闲益智 下载
怪兽远征安卓版下载

怪兽远征安卓版下载

角色扮演 下载
谷歌卫星地图免费版下载

谷歌卫星地图免费版下载

生活实用 下载