<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### Replace Temp with Query(以查詢取代臨時變量) 你的程序以一個臨時變量(temp)保存某一表達式的運算結果。 將這個表達式提煉到一個獨立函數(譯注:所謂查詢式,query)中。將這個臨時變量的所有「被引用點」替換為「對新函數的調用」。新函數可被其他函數使用。 ~~~ double basePrice = _quantity * _itemPrice; if (basePrice > 1000) return basePrice * 0.95; else return basePrice * 0.98; ~~~ => ~~~ if (basePrice() > 1000) return basePrice() * 0.95; else return basePrice() * 0.98; ... double basePrice() { return _quantity * _itemPrice; } ~~~ **動機(Motivation)** 臨時變量的問題在于:它們是暫時的,而且只能在所屬函數內使用。由于臨時變量只有在所屬函數內才可見,所以它們會驅使你寫出更長的函數,因為只有這樣你才能訪問到想要訪問的臨時變量。如果把臨時變量替換為一個查詢式(query method),那么同一個class中的所有函數都將可以獲得這份信息。這將帶給你極大幫助,使你能夠為這個編寫更清晰的代碼。 Replace Temp with Query往往是你運用Extract Method 之前必不可少的一個步驟。局部變量會使代碼難以被提煉,所以你應該盡可能把它們替換為查詢式。 這個重構手法較為直率的情況就是:臨時變量只被賦值一次,或者賦值給臨時變量的表達式不受其他條件影響。其他情況比較棘手,但也有可能發生。你可能需要先運用 Split Temporary Variable 或Separate Query from Modifier 使情況變得簡單一些,然后再替換臨時變量。如果你想替換的臨時變量是用來收集結果的(例如循環中的累加值),你就需要將某些程序邏輯(例如循環)拷貝到查詢式(query method)去。 **作法(Mechanics)** 首先是簡單情況: - 找出只被賦值一次的臨時變量。 - 如果某個臨時變量被賦值超過一次,考慮使用Split Temporary Variable 將它分割成多個變量。 - 將該臨時變量聲明為final。 - 編譯。 - 這可確保該臨時變量的確只被賦值一次。 - 將「對該臨時變量賦值」之語句的等號右側部分提煉到一個獨立函數中。 - 首先將函數聲明為private。日后你可能會發現有更多class需要使用 它,彼時你可輕易放松對它的保護。 - 確保提煉出來的函數無任何連帶影響(副作用),也就是說該函數并不修改任何對象內容。如果它有連帶影響,就對它進行Separate Query from Modifier。 - 編譯,測試。 - 在該臨時變量身上實施Replace Temp with Query。 我們常常使用臨時變量保存循環中的累加信息。在這種情況下,整個循環都可以被提為一個獨立函數,這也使原本的函數可以少掉幾行擾人的循環碼。有時候,你可能會用單一循環累加好幾個值,就像本書p.26的例子那樣。這種情況下你應該針對每個累加值重復一遍循環,這樣就可以將所有臨時變量都替換為查詢式(query)。當然,循環應該很簡單,復制這些代碼時才不會帶來危險。 運用此手法,你可能會擔心性能問題。和其他性能問題一樣,我們現在不管它,因 為它十有八九根本不會造成任何影響。如果性能真的出了問題,你也可以在優化時期解決它。如果代碼組織良好,那么你往往能夠發現更有效的優化方案;如果你沒有進行重構,好的優化方案就可能與你失之交臂。如果性能實在太糟糕,要把臨時變量放回去也是很容易的。 **范例(Example)** 首先,我從一個簡單函數開始: ~~~ double getPrice() { int basePrice = _quantity * _itemPrice; double discountFactor; if (basePrice > 1000) discountFactor = 0.95; else discountFactor = 0.98; return basePrice * discountFactor; } ~~~ 我希望將兩個臨時變量都替換掉。當然,每次一個。 盡管這里的代碼十分清楚,我還是先把臨時變量聲明為final,檢查他們是否的確只被賦值一次: ~~~ double getPrice() { final int basePrice = _quantity * _itemPrice; final double discountFactor; if (basePrice > 1000) discountFactor = 0.95; else discountFactor = 0.98; return basePrice * discountFactor; } ~~~ 這樣一來,如果有任何問題,編譯器就會警告我。之所以先做這件事,因為如果臨時變量不只被賦值一次,我就不該進行該項重構。接下來我開始替換臨時變量,每次一個。首先我把賦值(assignment)動作的右側表達式提煉出來: ~~~ double getPrice() { final int basePrice = basePrice(); final double discountFactor; if (basePrice > 1000) discountFactor = 0.95; else discountFactor = 0.98; return basePrice * discountFactor; } private int basePrice() { return _quantity * _itemPrice; } ~~~ 編譯并測試,然后開始使用Replace Temp with Query。首先把臨時變量basePrice的第一個引用點替換掉: ~~~ double getPrice() { final int basePrice = basePrice(); final double discountFactor; if (basePrice() > 1000) discountFactor = 0.95; else discountFactor = 0.98; return basePrice * discountFactor; } ~~~ 編譯、測試、下一個(聽起來像在指揮人們跳鄉村舞蹈一樣)。由于「下一個」已經是basePrice的最后一個引用點,所以我把basePrice臨時變量的聲明式一并摘除: ~~~ double getPrice() { final double discountFactor; if (basePrice() > 1000) discountFactor = 0.95; else discountFactor = 0.98; return basePrice() * discountFactor; } ~~~ 搞定basePrice之后,我再以類似辦法提煉出一個discountFactor(): ~~~ double getPrice() { final double discountFactor = discountFactor(); return basePrice() * discountFactor; } private double discountFactor() { if (basePrice() > 1000) return 0.95; else return 0.98; } ~~~ 你看,如果我沒有把臨時變量basePrice替換為一個查詢式,將多么難以提煉discountFactor()! 最終,getPrice()變成了這樣: ~~~ double getPrice() { return basePrice() * discountFactor(); } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看