<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ivaneeo's blog

    自由的力量,自由的生活。

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
    范例(Examples):局部變量再賦值(Reassigning)
    如果被提煉碼對局部變量賦值,問題就變得復雜了.這里我們只討論臨時變量的問題.如果你發現源函數的參數被賦值,應該馬上使用Remove Assignments to Parameters(131).

    被賦值的臨時變量也分兩種情況.較簡單的情況是:這個變量只在被提煉碼區段中使用.果真如此,你可以將這個臨時變量的聲明式移到被提煉碼中,然后一起提煉出去.另一種情況是:被提煉碼之外的代碼也使用了這個變量.這又分為兩種情況:如果這個變量在被提煉碼之后未再被使用,你只需直接在目標函數中修改它就可以了;如果被提煉碼之后的代碼還使用了這個變量,你就需要讓目標函數返回該變量改變后的指.我以下列代碼說明這幾種不同情況:
    void printOwing() {
        Enumeration e = _orders.elements();
        double outstanding = 0.0;

       printBanner();

        // calculate outstanding
        while(e.hasMoreElements()) {
           Order each = (Order) e.nextElement();
           outstanding += each.getAmount();
        }

       printDetails(outstanding);
    }

    現在我把[計算]代碼提煉出來:

    void printOwing() {
       printBanner();
       double outstanding = getOutstanding();
       printDetails(outstanding);
    }

    double getOutstanding() {
           Enumeration e = _orders.elements();
           double outstanding = 0.0;

           while(e.hasMoreElements()) {
              Order each = (Order) e.nextElement();
              outstanding += each.getAmount();
           }
          return outstanding;
    }

    Enumeration變量e只在被提煉碼中用到,所以我可以將它整個搬到新函數中.double變量outstanding在被提煉碼內外都被用到,所以我必須讓提煉出來的新函數返回它.編譯測試完成后,我就把傳值改名,遵循我的一貫命名原則:

    double getOutstanding() {
           Enumeration e = _orders.elements();
           double result = 0.0;

           while(e.hasMoreElements()) {
              Order each = (Order) e.nextElement();
              result += each.getAmount();
           }
          return result;
    }

    本例中的outstanding變量只是很單純地被初始化為一個明確初值,所以我可以只在新函數中對它初始化.如果代碼還對這個變量做了其他處理,我就必須將它的值作為參數傳給目標函數.對于這種變化,最初代碼可能是這樣:

    void printOwing(double previousAmount) {
        Enumeration e = _orders.elements();
        double outstanding = previousAmount * 1.2;

       printBanner();

        // calculate outstanding
        while(e.hasMoreElements()) {
           Order each = (Order) e.nextElement();
           outstanding += each.getAmount();
        }

       printDetails(outstanding);
    }

    提煉后的代碼可能是這樣:

    void printOwing(double previousAmount) {
       double outstanding = previousAmount * 1.2;

       printBanner();
       double outstanding = getOutstanding(outstanding);
       printDetails(outstanding);
    }
    double getOutstanding(double initialValue) {
           double result = initialValue;
           Enumeration e = _orders.elements();
           

           while(e.hasMoreElements()) {
              Order each = (Order) e.nextElement();
              result += each.getAmount();
           }
          return result;
    }
    編譯并測試后,我再將變量outstanding的初始化過程整理一下:
    void printOwing(double previousAmount) {
       printBanner();
       double outstanding = getOutstanding(previousAmount * 1.2);
       printDetails(outstanding);
    }

    這時候,你可能會問:[如果需要返回的變量不止一個,又該怎么辦?]

    你有數種選擇.最好的選擇通常是:挑選另一塊代碼來提煉.我比較喜歡讓每個函數都只返回一個值,所以我會安排多個函數,用以返回多個值.如果你使用的語言支持[輸出式參數](output parameters),你可以使用它們帶回多個回傳值.但我還是盡可能選擇單一返回值.

    臨時變量往往為數眾多,甚至會使提煉工作舉步維艱.這種情況下,我會嘗試先運用Replace Temp with Query(120)減少臨時變量.如果即使這么做了提煉依舊困難重重,我就會動用Replace Method with Method Object(135),這個重構手法不在乎代碼中有多少臨時變量,也不在乎你如何使用它們.

    posted on 2005-08-24 16:14 ivaneeo 閱讀(220) 評論(0)  編輯  收藏 所屬分類: refactoring-從地獄中重生
    主站蜘蛛池模板: 国产亚洲精品高清在线| 5555在线播放免费播放| 日本特黄a级高清免费大片| 久久精品国产99国产精品亚洲| 91精品免费不卡在线观看| 老色鬼久久亚洲AV综合| 日韩免费的视频在线观看香蕉| 亚洲女久久久噜噜噜熟女| 黄色网址在线免费| 久久久久久亚洲AV无码专区| h在线观看视频免费网站| 国产精品亚洲精品青青青| 在线精品免费视频| 黄页网址大全免费观看12网站| 亚洲乱码国产一区网址| 嫩草在线视频www免费看| 18gay台湾男同亚洲男同| 一二三四免费观看在线电影 | 永久久久免费浮力影院| 国产亚洲精品91| 亚洲男同帅GAY片在线观看| 91在线手机精品免费观看| 亚洲中文无码a∨在线观看| 最好免费观看韩国+日本| 一级午夜免费视频| 亚洲宅男精品一区在线观看| 黄页网站免费观看| 无码天堂va亚洲va在线va| 亚洲中文字幕久久精品无码喷水 | 中文字幕免费观看视频| 亚洲黄色免费网址| 日韩成全视频观看免费观看高清 | 精品成在人线AV无码免费看| 亚洲av片在线观看| 亚洲成AV人片在线观看无| 久久久久免费看黄A片APP| 中国精品一级毛片免费播放| 亚洲一区二区三区久久| 久久久久亚洲?V成人无码| 黄色片在线免费观看| 在线观看人成视频免费无遮挡 |