<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之旅 廣告
                ### Split Temporary Variable(剖解臨時變量) 你的程序有某個臨時變量被賦值超過一次,它既不是循環變量,也不是一個集用臨時變量(collecting temporary variable)。 針對每次賦值,創造一個獨立的、對應的臨時變量。 ~~~ double temp = 2 * (_height + _width); System.out.println (temp); temp = _height * _width; System.out.println (temp); ~~~ => ~~~ final double perimeter = 2 * (_height + _width); System.out.println (perimeter); final double area = _height * _width; System.out.println (area); ~~~ **動機(Motivation)** 臨時變量有各種不同用途,其中某些用途會很自然地導致臨時變量被多次賦值。「循環變量」和「集用臨時變量」就是兩個典型例子:循環變量(loop variables )[Beck]會隨循環的每次運行而改變〔例如for (int i=0; i<10; i++)語句中的i〕;集用臨時變量(collecting temporary variable)[Beck]負責將「通過整個函數的運算」而構成的某個值收集起來。 除了這兩種情況,還有很多臨時變量用于保存一段冗長代碼的運算結果,以便稍后使用。這種臨時變量應該只被賦值一次。如果它們被賦值超過一次,就意味它們在函數中承擔了一個以上的責任。如果臨時變量承擔多個責任,它就應該被替換(剖 解)為多個臨時變量,每個變量只承擔一個責任。同一個臨時變量承擔兩件不同的 事情,會令代碼閱讀者糊涂。 **作法(Mechanics)** - 在「待剖解」之臨時變量的聲明式及其第一次被賦值處,修改其名稱。 - 如果稍后之賦值語句是「i = i +某表達式」形式,就意味這是個集用臨時變量,那么就不要剖解它。集用臨時變量的作用通常是累加、字符串接合、寫入stream或者向群集(collection)添加元素。 - 將新的臨時變量聲明為final。 - 以該臨時變量之第二次賦值動作為界,修改此前對該臨時變量的所有引用點,讓它們引用新的臨時變量。 - 在第二次賦值處,重新聲明原先那個臨時變量。 - 編譯,測試。 - 逐次重復上述過程。每次都在聲明處對臨時變量易名,并修改下次賦值之前的引用點。 **范例(Example)** 下面范例中我要計算一個蘇格蘭布丁(haggis)運動的距離。在起點處,靜止的蘇格蘭布丁會受到一個初始力的作用而開始運動。一段時間后,第二個力作用于布丁,讓它再次加速。根據牛頓第二定律,我可以這樣計算布丁運動的距離: ~~~ double getDistanceTravelled (int time) { double result; double acc = _primaryForce / _mass; //譯注:第一次賦值處 int primaryTime = Math.min(time, _delay); result = 0.5 * acc * primaryTime * primaryTime; int secondaryTime = time - _delay; if (secondaryTime > 0) { double primaryVel = acc * _delay; //以下是第二次賦值處 acc = (_primaryForce + _secondaryForce) / _mass; result += primaryVel * secondaryTime + 0.5 * acc * secondaryTime * secondaryTime; } return result; } ~~~ 真是個絕佳的丑陋小東西。注意觀察此例中的acc變量如何被賦值兩次。acc變量有兩個責任:第一是保存第一個力造成的初始加速度;第二是保存兩個力共同造成的加速度。這就是我想要剖解的東西。 首先,我在函數開始處修改這個臨時變量的名稱,并將新的臨時變量聲明為final。 接下來我把第二次賦值之前對acc變量的所有引用點,全部改用新的臨時變量。最后,我在第二次賦值處重新聲明acc變量: ~~~ double getDistanceTravelled (int time) { double result; final double primaryAcc = _primaryForce / _mass; int primaryTime = Math.min(time, _delay); result = 0.5 * primaryAcc * primaryTime * primaryTime; int secondaryTime = time - _delay; if (secondaryTime > 0) { double primaryVel = primaryAcc * _delay; double acc = (_primaryForce + _secondaryForce) / _mass; result += primaryVel * secondaryTime + 0.5 * acc * secondaryTime * secondaryTime; } return result; } ~~~ 新的臨時變量的名稱指出,它只承擔原先acc變量的第一個責任。我將它聲明為final,確保它只被賦值一次。然后,我在原先變量第二次被賦值處重新聲明acc。現在,重新編譯并測試,一切都應該沒有問題。 然后,我繼續處理臨時變量的第二次賦值。這次我把原先的臨時變量完全刪掉,代之以一個新的臨時變量。新變量的名稱指出,它只承擔原先變量的第二個責任: ~~~ double getDistanceTravelled (int time) { double result; final double primaryAcc = _primaryForce / _mass; int primaryTime = Math.min(time, _delay); result = 0.5 * primaryAcc * primaryTime * primaryTime; int secondaryTime = time - _delay; if (secondaryTime > 0) { double primaryVel = primaryAcc * _delay; final double secondaryAcc = (_primaryForce + _secondaryForce) / _mass; result += primaryVel * secondaryTime + 0.5 * secondaryAcc * secondaryTime * secondaryTime; } return result; } ~~~ 現在,這段代碼肯定可以讓你想起更多其他重構手法。盡情享受吧。(我敢保證, 這比吃蘇格蘭布丁強多了 ——你知道他們都在里面放了些什么東西嗎?[4]) [4]譯注:蘇格蘭布丁(haggis)是一種蘇格蘭菜,把羊心等內臟裝在羊胃里煮成。由于 它被羊胃包成一個球體,因此可以像球一樣踢來踢去,這就是本例的由來。「把羊心裝在羊胃里煮成…」,呃,有些人難免對這道菜惡心,Martin Fowler想必是其中之一。
                  <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>

                              哎呀哎呀视频在线观看