ivaneeo's blog

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

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

          常用鏈接

          留言簿(34)

          我參與的團(tuán)隊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          范例(Examples)
          下面范例中我要計算一個蘇格蘭布丁(haggis)運(yùn)動的距離。在起點處,靜止的蘇格蘭布丁會受到一個初始力的作用而開始運(yùn)動。一段時機(jī)后,第二個力作用于布丁,讓它再次加速。根據(jù)牛頓第二定律,我可以這樣計算布丁運(yùn)動的距離:

          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變量有兩個責(zé)任:第一是保存第一個力造成的初始加速度;第二是保存兩個力共同造成的加速度。這就是我想要剖解的東西。

          首先,我在函數(shù)開始處修改這個臨時變量的名稱,并將新的臨時變量聲明為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;
          }

          新的臨時變量的名稱指出,它只承擔(dān)原先acc變量的第一責(zé)任。我將它聲明為final,確保它只被賦值一次。然后,我在原先acc變量第二次被賦值處重新聲明acc。現(xiàn)在,重新編譯并測試,一切都應(yīng)該沒有問題。

          然后,我繼續(xù)處理acc臨時變量的第二次賦值。這次我把原先的臨時變量完全刪掉,代之以一個新的臨時變量。新變量的名稱指出,它只承擔(dān)原先acc變量的第二個責(zé)任:

          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;
          }
          posted on 2005-08-29 14:56 ivaneeo 閱讀(187) 評論(0)  編輯  收藏 所屬分類: refactoring-從地獄中重生
          主站蜘蛛池模板: 曲沃县| 金寨县| 武穴市| 天峻县| 勃利县| 左云县| 威海市| 赤水市| 邓州市| 三原县| 和林格尔县| 阜宁县| 项城市| 梁平县| 乃东县| 腾冲县| 松潘县| 灵武市| 贺州市| 沙洋县| 蛟河市| 肥乡县| 汉沽区| 庆阳市| 新和县| 宜宾市| 龙岩市| 兰坪| 自贡市| 白玉县| 阳高县| 易门县| 北辰区| 益阳市| 甘泉县| 石楼县| 阜宁县| 松滋市| 宣恩县| 绵阳市| 余庆县|