成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

重構(gòu)-改善既有代碼的設(shè)計(jì)(一)--重構(gòu),第一個(gè)案例

acrazing / 2934人閱讀

摘要:并根據(jù)目錄選讀第章重構(gòu),第一個(gè)案例這是只是一個(gè)方法。絕大多數(shù)情況下,函數(shù)應(yīng)該放在它所使用的數(shù)據(jù)的所屬對(duì)象內(nèi)最好不要在另一個(gè)對(duì)象的屬性基礎(chǔ)上運(yùn)用語(yǔ)句。

什么是重構(gòu)

在不改變代碼外在行為的前提下,對(duì)代碼做出修改以改進(jìn)程序內(nèi)部的結(jié)構(gòu)
簡(jiǎn)單地說(shuō)就是在代碼寫好后改進(jìn)它的設(shè)計(jì)

誰(shuí)該閱讀這本書

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

資深設(shè)計(jì)師和架構(gòu)規(guī)劃師(理解為什么需要重構(gòu),哪里需要重構(gòu))

閱讀技巧

帶著疑問(wèn)去讀:

如果你想要知道重構(gòu)是什么。第1章夠了

如果你想要知道為什么要重構(gòu),第1,2章

如果你想知道該在什么地方重構(gòu),第3章

如果你想進(jìn)行重構(gòu),第1,2,3,4章。并根據(jù)目錄選讀

第1章 重構(gòu),第一個(gè)案例
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;
    }

這是只是一個(gè)方法。直接評(píng)價(jià):太復(fù)雜,復(fù)用率低

解決方法 分解并重組

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

拆除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;
}



重設(shè)變量名

變量名必須保證簡(jiǎn)單清楚,不產(chǎn)生歧義。比如上方代碼的each就是可修改的變量名。因?yàn)閑ach到底指的是什么

搬移代碼

因?yàn)檫@個(gè)方法只使用了rental的信息。所以需要放在rental類下

去除臨時(shí)變量

statement方法中有兩個(gè)臨時(shí)變量totalAmount和frequentRenterPoints。 做成getTotalAmount和getFrequentRenterPoints方法

public String statement() {
        double totalAmount = 0;
        int frequentRenterPoints = 0;
        // Enumeration接口定義了從一個(gè)數(shù)據(jù)結(jié)構(gòu)得到連續(xù)數(shù)據(jù)的手段
        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;
}
測(cè)試重構(gòu)后的方法

保證重構(gòu)后的方法能夠滿足所有的需求

總結(jié)

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

任何不會(huì)被修改的變量都可以被當(dāng)成參數(shù)傳入新的函數(shù),至于會(huì)被修改的變量需要慎重。如果只有一個(gè)變量會(huì)被修改,可以把它當(dāng)做返回值。

絕大多數(shù)情況下,函數(shù)應(yīng)該放在它所使用的數(shù)據(jù)的所屬對(duì)象內(nèi)

最好不要在另一個(gè)對(duì)象的屬性基礎(chǔ)上運(yùn)用switch語(yǔ)句。如果不得不使用,也應(yīng)該在對(duì)象自己的數(shù)據(jù)上使用,而不是在別人的數(shù)據(jù)上使用。

使用繼承來(lái)適當(dāng)組織類關(guān)系后,可以用多態(tài)取代switch語(yǔ)句。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69675.html

相關(guān)文章

  • 讀書筆記《重構(gòu) 改善既有代碼設(shè)計(jì)

    摘要:重構(gòu)在不改變代碼的外在的行為的前提下對(duì)代碼進(jìn)行修改最大限度的減少錯(cuò)誤的幾率本質(zhì)上,就是代碼寫好之后修改它的設(shè)計(jì)。重構(gòu)可以深入理解代碼并且?guī)椭业?。同時(shí)重構(gòu)可以減少引入的機(jī)率,方便日后擴(kuò)展。平行繼承目的在于消除類之間的重復(fù)代碼。 重構(gòu) (refactoring) 在不改變代碼的外在的行為的前提下 對(duì)代碼進(jìn)行修改最大限度的減少錯(cuò)誤的幾率 本質(zhì)上, 就是代碼寫好之后 修改它的設(shè)計(jì)。 1,書中...

    mdluo 評(píng)論0 收藏0
  • 重構(gòu)-改善既有代碼設(shè)計(jì)(五)--重構(gòu)列表

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

    davidac 評(píng)論0 收藏0
  • 重構(gòu)-改善既有代碼設(shè)計(jì)》讀書筆記-重構(gòu)

    摘要:重構(gòu)改善既有代碼設(shè)計(jì)動(dòng)詞使用一系列重構(gòu)手法,在不改變軟件可觀察行為的前提下,調(diào)整其結(jié)構(gòu)。修補(bǔ)錯(cuò)誤時(shí)重構(gòu)代碼時(shí)重構(gòu)怎么重構(gòu)關(guān)于代碼的重構(gòu)技巧參考重構(gòu)改善既有代碼設(shè)計(jì)讀書筆記代碼篇個(gè)人博客 重構(gòu)定義 名詞 對(duì)軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整,目的是在不改變軟件可觀察行為的前提下,提高其可理解性,降低其修改成本?!吨貥?gòu)-改善既有代碼設(shè)計(jì)》 動(dòng)詞 使用一系列重構(gòu)手法,在不改變軟件可觀察行為的前提下,...

    ermaoL 評(píng)論0 收藏0
  • 重構(gòu)-改善既有代碼設(shè)計(jì)(二) --重構(gòu)原則

    摘要:改進(jìn)代碼設(shè)計(jì)的一個(gè)重要原則就是消除重復(fù)代碼使軟件更容易被理解優(yōu)秀的代碼能夠讓接收你代碼的付出更少的學(xué)習(xí)成本。重構(gòu)更容易找到重構(gòu)能加深對(duì)代碼的理解??梢灾貥?gòu)的情況添加功能時(shí)可以重構(gòu)。說(shuō)明你沒(méi)有發(fā)現(xiàn)代碼的錯(cuò)誤。需要重構(gòu)復(fù)審代碼時(shí)可以重構(gòu)。 為何重構(gòu) 重構(gòu)不是銀彈,但是幫助你達(dá)到以下幾個(gè)目的 改進(jìn)軟件設(shè)計(jì) 不良的程序需要更多的代碼。而代碼越多,正確的修改就越困難。改進(jìn)代碼設(shè)計(jì)的一個(gè)重要原則就...

    myshell 評(píng)論0 收藏0
  • 重構(gòu)---改善既有代碼設(shè)計(jì)》之簡(jiǎn)化條件表達(dá)式

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

    Cheng_Gang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<