国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

敏捷開發的必要技巧:移除重復代碼

2019-11-18 15:29:43
字體:
來源:轉載
供稿:網友
重復代碼是怎么產生的?

請觀察下面的代碼,我們已經有一個根據出租記錄的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中,很可能是短時間內還發現不了的. 慘-_-!!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 五指山市| 广汉市| 东乡族自治县| 泗水县| 叶城县| 凭祥市| 兴义市| 波密县| 屯留县| 平顺县| 呼伦贝尔市| 天长市| 东源县| 阿拉善盟| 普宁市| 惠来县| 安多县| 平阴县| 城市| 民丰县| 新昌县| 贵州省| 顺义区| 林西县| 枣庄市| 新化县| 浪卡子县| 桦甸市| 北安市| 高邮市| 社旗县| 衡阳县| 大田县| 通河县| 巴马| 河南省| 南漳县| 固原市| 讷河市| 长沙县| 金门县|