国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

重構-改善既有代碼的設計(一)--重構,第一個案例

acrazing / 2923人閱讀

摘要:并根據目錄選讀第章重構,第一個案例這是只是一個方法。絕大多數情況下,函數應該放在它所使用的數據的所屬對象內最好不要在另一個對象的屬性基礎上運用語句。

什么是重構

在不改變代碼外在行為的前提下,對代碼做出修改以改進程序內部的結構
簡單地說就是在代碼寫好后改進它的設計

誰該閱讀這本書

專業程序員(能夠提高你的代碼質量)

資深設計師和架構規劃師(理解為什么需要重構,哪里需要重構)

閱讀技巧

帶著疑問去讀:

如果你想要知道重構是什么。第1章夠了

如果你想要知道為什么要重構,第1,2章

如果你想知道該在什么地方重構,第3章

如果你想進行重構,第1,2,3,4章。并根據目錄選讀

第1章 重構,第一個案例
public String statement(){

        double totalAmount=0;
        int frequentRenterPoints=0;
        Enumeration rentals = _rentals.elements();

        String result = "Rental Record for "+getName()+"
";
        while(rentals.hasMoreElements()){

            double thisAmount=0;
            Rental each = (Rental)rentals.nextElement();

            switch (each.getMovie().getPriceCode()) {
            case Movie.CHILDRENS:

                thisAmount += 1.5;
                if(each.getDaysRented()>3){
                    thisAmount += (each.getDaysRented()-3)*1.5;
                }
                break;
            case Movie.NEW_RELEASE:

                thisAmount += each.getDaysRented()*3;
                break;
            case Movie.REGULAR:

                thisAmount += 2;
                if(each.getDaysRented()>2){
                    thisAmount += (each.getDaysRented()-2)*1.5;
                }
                break;

            default:
                break;
            }

            frequentRenterPoints++;

            if(each.getMovie().getPriceCode()==Movie.NEW_RELEASE && each.getDaysRented()>1)frequentRenterPoints++;

            result += "	"+each.getMovie().getTitle()+"	"+String.valueOf(thisAmount)+"
";
            totalAmount +=thisAmount;

        }

        result += "Amount owed is " + String.valueOf(totalAmount) + "
";

        result += "You earned " + String.valueOf(frequentRenterPoints) + " frequent renter points ";

        return result;
    }

這是只是一個方法。直接評價:太復雜,復用率低

解決方法 分解并重組

將代碼按照功能拆分。每個功能只做一件事。

拆除switch并封裝為方法
private double amountFor(Rental each, double result) {
    switch (each.getMovie().getPriceCode()) {
    case Movie.CHILDRENS:

        result += 1.5;
        if(each.getDaysRented()>3){
            result += (each.getDaysRented()-3)*1.5;
        }
        break;
    case Movie.NEW_RELEASE:

        result += each.getDaysRented()*3;
        break;
    case Movie.REGULAR:

        result += 2;
        if(each.getDaysRented()>2){
            result += (each.getDaysRented()-2)*1.5;
        }
        break;

    default:
        break;
    }
    return result;
}



重設變量名

變量名必須保證簡單清楚,不產生歧義。比如上方代碼的each就是可修改的變量名。因為each到底指的是什么

搬移代碼

因為這個方法只使用了rental的信息。所以需要放在rental類下

去除臨時變量

statement方法中有兩個臨時變量totalAmount和frequentRenterPoints。 做成getTotalAmount和getFrequentRenterPoints方法

public String statement() {
        double totalAmount = 0;
        int frequentRenterPoints = 0;
        // Enumeration接口定義了從一個數據結構得到連續數據的手段
        Enumeration rentals = _rentals.elements();

        String result = "Rental Record for" + getName() + "
";
        while (rentals.hasMoreElements()) {
            Rental each = (Rental) rentals.nextElement();

            result += "	" + each.getMovie().getTitle() + "	" + String.valueOf(each.getMovie().getPrice().getCharge(each.getDayRented())) + "
";


        }
        result += "Amount owed is " + String.valueOf(getTotalCharge()) + "
";
        result += "You earned " + String.valueOf(getTotalFrequentRenterPoints()) + "frequent renter points";

        return result;

    }
private int getTotalFrequentRenterPoints(){
    int result=0;
    Enumeration rentals=_rentals.elements();
    while(rentals.hasMoreElements()){
        Rental each=(Rental)rentals.nextElement();
        result+=each.getMovie().getFrequentRenterPoints(each.getDayRented());
    }
    return result;
}
private double getTotalCharge(){
    double result =0;
    Enumeration rentals=_rentals.elements();
    while(rentals.hasMoreElements()){
        Rental each=(Rental)rentals.nextElement();
        result+=each.getMovie().getPrice().getCharge(each.getDayRented());
    }
    return result;
}
測試重構后的方法

保證重構后的方法能夠滿足所有的需求

總結

代碼塊俞小,代碼的功能就俞容易管理,代碼的處理和移動也就俞輕松

任何不會被修改的變量都可以被當成參數傳入新的函數,至于會被修改的變量需要慎重。如果只有一個變量會被修改,可以把它當做返回值。

絕大多數情況下,函數應該放在它所使用的數據的所屬對象內

最好不要在另一個對象的屬性基礎上運用switch語句。如果不得不使用,也應該在對象自己的數據上使用,而不是在別人的數據上使用。

使用繼承來適當組織類關系后,可以用多態取代switch語句。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69675.html

相關文章

  • 讀書筆記《重構 改善既有代碼設計

    摘要:重構在不改變代碼的外在的行為的前提下對代碼進行修改最大限度的減少錯誤的幾率本質上,就是代碼寫好之后修改它的設計。重構可以深入理解代碼并且幫助找到。同時重構可以減少引入的機率,方便日后擴展。平行繼承目的在于消除類之間的重復代碼。 重構 (refactoring) 在不改變代碼的外在的行為的前提下 對代碼進行修改最大限度的減少錯誤的幾率 本質上, 就是代碼寫好之后 修改它的設計。 1,書中...

    mdluo 評論0 收藏0
  • 重構-改善既有代碼設計(五)--重構列表

    摘要:什么是重構列表重構方法需要以一種特定的格式記錄下來。這些重構手法到底有多成熟本書中提到的重構手法第章。做法創造新函數,以用途命名提煉代碼到函數中檢查變量名是否符合規范在源函數中,將被提煉代碼替換為函數引用測試范例重構前重構后 什么是重構列表 重構方法需要以一種特定的格式記錄下來。按照格式記錄下來的重構方法的集合叫重構列表 重構的記錄格式 每個重構手法可分為5個部分: 名稱 構建重構詞匯...

    davidac 評論0 收藏0
  • 重構-改善既有代碼設計》讀書筆記-重構

    摘要:重構改善既有代碼設計動詞使用一系列重構手法,在不改變軟件可觀察行為的前提下,調整其結構。修補錯誤時重構代碼時重構怎么重構關于代碼的重構技巧參考重構改善既有代碼設計讀書筆記代碼篇個人博客 重構定義 名詞 對軟件內部結構的一種調整,目的是在不改變軟件可觀察行為的前提下,提高其可理解性,降低其修改成本。——《重構-改善既有代碼設計》 動詞 使用一系列重構手法,在不改變軟件可觀察行為的前提下,...

    ermaoL 評論0 收藏0
  • 重構-改善既有代碼設計(二) --重構原則

    摘要:改進代碼設計的一個重要原則就是消除重復代碼使軟件更容易被理解優秀的代碼能夠讓接收你代碼的付出更少的學習成本。重構更容易找到重構能加深對代碼的理解。可以重構的情況添加功能時可以重構。說明你沒有發現代碼的錯誤。需要重構復審代碼時可以重構。 為何重構 重構不是銀彈,但是幫助你達到以下幾個目的 改進軟件設計 不良的程序需要更多的代碼。而代碼越多,正確的修改就越困難。改進代碼設計的一個重要原則就...

    myshell 評論0 收藏0
  • 重構---改善既有代碼設計》之簡化條件表達式

    那有什么天生如此,只是我們天天堅持。 本篇文章主要講解 《重構---改善既有代碼的設計》 這本書中的 第九章簡化條件表達式中 的知識點, Decompose Conditional(分解條件表達式) 問題:你有一個復雜的條件(if、then、else) 語句 解決:從if、then、else三個段落中分別提煉出獨立函數 //重構前 if (date.before(SUMMER_START) |...

    Cheng_Gang 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<