<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### Introduce Explaining Variable(引入解釋性變量) 你有一個復雜的表達式。 將該表達式(或其中一部分)的結果放進一個臨時變量,以此變量名稱來解釋表達式用途。 ~~~ if ( (platform.toUpperCase().indexOf("MAC") > -1) && (browser.toUpperCase().indexOf("IE") > -1) && wasInitialized() && resize > 0 ) { // do something } ~~~ => ~~~ final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1; final boolean isIEBrowser = browser.toUpperCase().indexOf("IE") > -1; final boolean wasResized = resize > 0; if (isMacOs && isIEBrowser && wasInitialized() && wasResized) { // do something } ~~~ **動機(Motivation)** 表達式有可能非常復雜而難以閱讀。這種情況下,臨時變量可以幫助你將表達式分解為比較容易管理的形式。 在條件邏輯(conditional logic )中,Introduce Explaining Variable特別有價值:你可以用這項重構將每個條件子句提煉出來,以一個良好命名的臨時變量來解釋對應條件子句的意義。使用這項重構的另一種情況是,在較長算法中,可以運用臨時變量來解釋每一步運算的意義。 Introduce Explaining Variable是一個很常見的重構手法,但我得承認,我并不常用它。我幾乎總是盡量使用 Extract Method 來解釋一段代碼的意義。畢竟臨時變量只在它所處的那個函數中才有意義,局限性較大,函數則可以在對象的整個生命中都有用,并且可被其他對象使用。但有時候,當局部變量使 Extract Method 難以進行時,我就使用Introduce Explaining Variable。 **作法(Mechanics)** - 聲明一個final臨時變量,將待分解之復雜表達式中的一部分動作的運算結果賦值給它。 - 將表達式中的「運算結果」這一部分,替換為上述臨時變量。 - 如果被替換的這一部分在代碼中重復出現,你可以每次一個,逐一替換。 - 編譯,測試。 - 重復上述過程,處理表達式的其他部分。 **范例(Example)** 我們從一個簡單計算開始: ~~~ double price() { // price is base price - quantity discount + shipping return _quantity * _itemPrice - Math.max(0, _quantity - 500) * _itemPrice * 0.05 + Math.min(_quantity * _itemPrice * 0.1, 100.0); } ~~~ 這段代碼還算簡單,不過我可以讓它變得更容易理解。首先我發現,底價(base price)等于數量(quantity)乘以單價(item price)。于是我把這一部分計算的結果放進 一個臨時變量中: ~~~ double price() { // price is base price - quantity discount + shipping final double basePrice = _quantity * _itemPrice; return basePrice - Math.max(0, _quantity - 500) * _itemPrice * 0.05 + Math.min(_quantity * _itemPrice * 0.1, 100.0); } ~~~ 稍后也用上了「數量乘以單價」運算結果,所以我同樣將它替換為basePrice臨時變量: ~~~ double price() { // price is base price - quantity discount + shipping final double basePrice = _quantity * _itemPrice; return basePrice - Math.max(0, _quantity - 500) * _itemPrice * 0.05 + Math.min(basePrice * 0.1, 100.0); } ~~~ 然后,我將批發折扣(quantity discount)的計算提煉出來,將結果賦予臨時變量 quantityDiscount: ~~~ double price() { // price is base price - quantity discount + shipping final double basePrice = _quantity * _itemPrice; final double quantityDiscount = Math.max(0, _quantity - 500) * _itemPrice * 0.05; return basePrice - quantityDiscount + Math.min(basePrice * 0.1, 100.0); } ~~~ 最后,我再把運費(shipping)計算提煉出來,將運算結果賦予臨時變量shipping。 同時我還可以刪掉代碼中的注釋,因為現在代碼已經可以完美表達自己的意義了: ~~~ double price() { final double basePrice = _quantity * _itemPrice; final double quantityDiscount = Math.max(0, _quantity - 500) * _itemPrice * 0.05; final double shipping = Math.min(basePrice * 0.1, 100.0); return basePrice - quantityDiscount + shipping; } ~~~ **運用 Extract Method處理上述范例** 面對上述代碼,我通常不會以臨時變量來解釋其動作意圖,我更喜歡使用 Extract Method。讓我們回到起點: ~~~ double price() { // price is base price - quantity discount + shipping return _quantity * _itemPrice - Math.max(0, _quantity - 500) * _itemPrice * 0.05 + Math.min(_quantity * _itemPrice * 0.1, 100.0); } ~~~ 這一次我把底價計算提煉到一個獨立函數中: ~~~ double price() { // price is base price - quantity discount + shipping return basePrice() - Math.max(0, _quantity - 500) * _itemPrice * 0.05 + Math.min(basePrice() * 0.1, 100.0); } private double basePrice() { return _quantity * _itemPrice; } ~~~ 我繼續我的提煉,每次提煉出一個新函數。最后得到下列代碼: ~~~ double price() { return basePrice() - quantityDiscount() + shipping(); } private double quantityDiscount() { return Math.max(0, _quantity - 500) * _itemPrice * 0.05; } private double shipping() { return Math.min(basePrice() * 0.1, 100.0); } private double basePrice() { return _quantity * _itemPrice; } ~~~ 我比較喜歡使用 Extract Method,因為同一對象中的任何部分,都可以根據自己的需要去取用這些提煉出來的函數。一開始我會把這些新函數聲明為private; 如果其他對象也需要它們,我可以輕易釋放這些函數的訪問限制。我還發現, Extract Method的工作量通常并不比Introduce Explaining Variable 來得大。 那么,應該在什么時候使用Introduce Explaining Variable 呢?答案是:在 Extract Method 需要花費更大工作量時。如果我要處理的是一個擁有大量局部變量的算法,那么使用 Extract Method 絕非易事。這種情況下我會使用Introduce Explaining Variable 幫助我理清代碼,然后再考慮下一步該怎么辦。搞清楚代碼邏輯之后,我總是可以運用 Replace Temp with Query 把被我引入的那些解釋性臨時變量去掉。況且,如果我最終使用Replace Method with Method Object,那么被我引入的那些解釋性臨時變量也有其價值。
                  <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>

                              哎呀哎呀视频在线观看