成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

重構(gòu)-改善既有代碼的設(shè)計(jì)(六)--重新組織函數(shù)

CoyPan / 2164人閱讀

摘要:函數(shù)重構(gòu)重構(gòu)有很大一部分都是在重構(gòu)函數(shù)。這條也要具體情況具體使用函數(shù)對象取代函數(shù)函數(shù)對象代替函數(shù)大函數(shù)變成類你有一個(gè)大型函數(shù),其中對局部變量的使用使你無法采用提煉函數(shù)。將這個(gè)大型函數(shù)放進(jìn)一個(gè)多帶帶對象中,如此一來局部變量就成了對象內(nèi)的字段。

函數(shù)重構(gòu)

重構(gòu)有很大一部分都是在重構(gòu)函數(shù)。尤其是長函數(shù)。這是問題的根源。以下是重構(gòu)方法

Extract Method 提煉函數(shù)

提煉函數(shù):(由復(fù)雜的函數(shù)提煉出獨(dú)立的函數(shù)或者說大函數(shù)分解成由小函數(shù)組成)你有一段代碼可以被組織在一起并獨(dú)立出來。將這段代碼放進(jìn)一個(gè)獨(dú)立函數(shù),并讓函數(shù)名稱解釋該函數(shù)的用途。

重構(gòu)前

void printOwing() {   
    //print banner  
    System.out.println(“*********”);  
    System.out.println(“Banner”);  
    System.out.println(“*********”);  
    //print details  
    System.out.println ("name: " + _name);   
        System.out.println ("amount " + getOutstanding());   
}  

重構(gòu)后

                                           
void printOwing()  {  
    printBanner();   
    printDetails(getOutstanding());   
}   
  
Void printBanner()  {  
    //print banner  
    System.out.println(“*********”);  
    System.out.println(“Banner”);  
    System.out.println(“*********”);  
}  
void printDetails (double outstanding)   {   
    System.out.println ("name: " + _name);   
    System.out.println ("amount " + outstanding);   
}

Inline Method 內(nèi)聯(lián)函數(shù)

內(nèi)聯(lián)函數(shù):(直接使用函數(shù)體代替函數(shù)調(diào)用 ) 一個(gè)函數(shù)調(diào)用的本體與名稱同樣清楚易懂。在函數(shù)調(diào)用點(diǎn)插入函數(shù)體,然后移除該函數(shù)
重構(gòu)前

int getRating() {  
    return moreThanfiveLateDeliverise() ? 2 : 1;  
}  
bool moreThanfiveLateDeliverise() {  
    return _numberOfLateLiveries > 5;  
}  

                                                       

重構(gòu)后

int getRating(){  
     return _numberOfLateLiveries > 5 ? 2 : 1;  
}  
Inline Temp 內(nèi)聯(lián)臨時(shí)變量

內(nèi)聯(lián)臨時(shí)變量:(表達(dá)式代替臨時(shí)變量)你有一個(gè)臨時(shí)變量,只被一個(gè)簡單表達(dá)式賦值一次,而它妨礙了其他重構(gòu)手法。將所有對該變量的引用動(dòng)作,替換為對它賦值的那個(gè)表達(dá)式自身
重構(gòu)前

double basePrice = anOrder.BasePrice();  
return basePrice(>1000);  
     

                                                  

重構(gòu)后

return (anOrder.BasePrice() >1000);
Replace Temp with Query 以查詢代替臨時(shí)變量

以查詢代替臨時(shí)變量:(獨(dú)立函數(shù)代替表達(dá)式)你的程序以一個(gè)臨時(shí)變量保存某一個(gè)表達(dá)式的運(yùn)算效果。將這個(gè)表達(dá)式提煉到一個(gè)獨(dú)立函數(shù)中。將這個(gè)臨時(shí)變量的所有引用點(diǎn)替換為對新函數(shù)的調(diào)用。此后,新函數(shù)就可以被其他函數(shù)調(diào)用。

重構(gòu)前

double basePrice = _quantity*_itemPrice;  
if (basePrice > 1000) {  
    return basePrice * 0.95;  
else   
    return basePrice * 0.98;  
                                                         

重構(gòu)后

if (basePrice() > 1000)  
    return basePrice() * 0.95;   
else   
    return basePrice() * 0.98;   
……  
double basePrice() {   
    return _quantity * _itemPrice;   
}    

注:這一條我始終不覺得合理。如果從性能上看。明顯重構(gòu)前的性能會(huì)比第二種更好。而且更容易理解

Introduce Explaining Variable 引入解釋性變量

引入解釋性變量:(復(fù)雜表達(dá)式分解為臨時(shí)解釋性變量)你有一個(gè)復(fù)雜的表達(dá)式。將該復(fù)雜表達(dá)式(或其中一部分)的結(jié)果放進(jìn)一個(gè)臨時(shí)變量,以此變量名稱來解釋表達(dá)式用途。
重構(gòu)前

if (Platform.ToUpperCass().indexOf("MAC") > -1 && (Browser.ToUpperCass().indexOf("Ie") > -1) && WasInitalized() ) {  
    //do something  
 }  

重構(gòu)后
const bool imMacOs = Platform.ToUpperCass().indexOf("MAC") > -1;
const bool isIeBrowser = Browser.ToUpperCass().indexOf("Ie") > -1;
const bool wasInitalized = WasInitalized();
if (imMacOs && isIeBrowser && wasInitalized)
{

//do something  

}
注:這一條和上上條并沒有沖突。上上條指的是單純地取值函數(shù),如get方法。這一條針對無法理解的方法鏈

Split Temporary Variable 分解臨時(shí)變量

分解臨時(shí)變量:(臨時(shí)變量不應(yīng)該被賦值超過一次)你的程序有某個(gè)臨時(shí)變量被賦值超過一次,它既不是循環(huán)變量,也不被用于收集計(jì)算結(jié)果。針對每次賦值,創(chuàng)造一個(gè)獨(dú)立、對應(yīng)的臨時(shí)變量
重構(gòu)前

double temp = 2 + (_height + _width);  
Console.WriteLine(temp);  
temp = _height * _width;  
Console.WriteLine(temp);  

                                                        

重構(gòu)后

const double perimeter = 2 + (_height + _width);  
Console.WriteLine(perimeter);  
const double area = _height * _width;  
Console.WriteLine(area);

 
Remove Assigments to Parameters 移除對參數(shù)的賦值

移除對參數(shù)的賦值:(不要對參數(shù)賦值)代碼對一個(gè) 參數(shù)賦值。以一個(gè)臨時(shí)變量取代該參數(shù)的位置。
重構(gòu)前

int discount (int inputVal, int quantity, int yearToDate){   
    if (inputVal > 50) inputVal -= 2;   
}  
     

重構(gòu)后

int discount (int inputVal, int quantity, int yearToDate) {   
     int result = inputVal;   
     if (inputVal > 50) result -= 2;   
}  

注:如果傳的是對象。除非你想要操作對象。否則就留下了bug的風(fēng)險(xiǎn)。因?yàn)閷ο髠魅敕椒ū桓淖兞?。(這條也要具體情況具體使用)

Replace Method with Method object 函數(shù)對象取代函數(shù)

函數(shù)對象代替函數(shù):(大函數(shù)變成類)你有一個(gè)大型函數(shù),其中對局部變量的使用使你無法采用 Extract Method (提煉函數(shù))。將這個(gè)大型函數(shù)放進(jìn)一個(gè)多帶帶對象中,如此一來局部變量就成了對象內(nèi)的字段。然后你可以在同一個(gè)對象中將這個(gè)大型函數(shù)分解為多個(gè)小型函數(shù)。
重構(gòu)前

class Order...  
double price() {   
    double primaryBasePrice;  
    double secondaryBasePrice;   
    double tertiaryBasePrice;   
    // long computation; ...   
}   

重構(gòu)后

 class Price {   
        double primaryBasePrice;  
        double secondaryBasePrice;   
        double tertiaryBasePrice;   
        public void price(){
        // long computation; ...   
   

或者可以采用static method
Substitute Algorithm 替換算法

替換算法:(函數(shù)本體替換為另一個(gè)算法)你想要把某個(gè)算法替換為另一個(gè)更清晰地算法。將函數(shù)本體替換為另一個(gè)算法。
重構(gòu)前

String foundPerson(String[] people){   
    for (int i = 0; i < people.length; i++)  {   
        if (people[i].equals ("Don")){  
             return "Don";   
         }  
         if (people[i].equals ("John")) {  
           return "John";   
         }   
         if (people[i].equals ("Kent")){   
                return "Kent";   
         }   
     }  
     return "";   
}
                                            

重構(gòu)后

String foundPerson(String[] people){   
    List candidates   
             = Arrays.asList(new String[] {"Don",   "John", "Kent"});   
    for (int i=0; i

注:如果可以使用更簡單并清晰的方式。就果斷換方式

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/69704.html

相關(guān)文章

  • Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強(qiáng))

    摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...

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

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

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

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

    davidac 評論0 收藏0
  • 重構(gòu)-改善既有代碼設(shè)計(jì)(七)-- 在代碼之間搬移特性

    摘要:前言決定把責(zé)任放在哪對于對象設(shè)計(jì)是最重要的之一。重構(gòu)可以很好的解決這個(gè)問題。方法建立一個(gè)新類,將相關(guān)的字段和函數(shù)從舊類搬移到新類。方法將這個(gè)類的所有特性搬移到另一個(gè)類中,然后移除原類。讓這個(gè)擴(kuò)展品成為源類的子類或包裝類。 前言 決定把責(zé)任放在哪對于對象設(shè)計(jì)是最重要的之一。重構(gòu)可以很好的解決這個(gè)問題。以下是筆者的重構(gòu)方法注:客戶:調(diào)用接口客戶類:使用了接口的類服務(wù)類:提供服務(wù)的類 Mov...

    solocoder 評論0 收藏0
  • 重構(gòu)-改善既有代碼設(shè)計(jì)(一)--重構(gòu),第一個(gè)案例

    摘要:并根據(jù)目錄選讀第章重構(gòu),第一個(gè)案例這是只是一個(gè)方法。絕大多數(shù)情況下,函數(shù)應(yīng)該放在它所使用的數(shù)據(jù)的所屬對象內(nèi)最好不要在另一個(gè)對象的屬性基礎(chǔ)上運(yùn)用語句。 什么是重構(gòu) 在不改變代碼外在行為的前提下,對代碼做出修改以改進(jìn)程序內(nèi)部的結(jié)構(gòu)簡單地說就是在代碼寫好后改進(jìn)它的設(shè)計(jì) 誰該閱讀這本書 專業(yè)程序員(能夠提高你的代碼質(zhì)量) 資深設(shè)計(jì)師和架構(gòu)規(guī)劃師(理解為什么需要重構(gòu),哪里需要重構(gòu)) 閱讀技巧...

    acrazing 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<