熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

JBuilder2005實現重構之類內部提煉

2013-11-23 18:50:04  來源: Java核心技術 

  提煉方法
  
  對於一個方法體龐大的方法可以使用Extract Method將其一部分代碼提煉到一個小方法中並在原處添加提煉方法的調用如果方法中存在重復的代碼段則這個代碼段很有必須提煉為一個單獨的方法以便復用
  
  要將一塊代碼提煉為一個單獨的方法只需要選中這塊代碼並通過Ctrl+Shift+R>Extract Method調出提煉方法的重構對話框來進行操作JBuilder會分析選中代碼塊中所引用的上下文變量目標方法定義相應的參數通過方法入參來傳遞這些變量如下面的drive()方法在Horsejava中定義其代碼如下
  
  代碼清單 未提煉方法前的drive()方法
  
   public void printQuotation(int amount)
  
   {
  
   printBanner();
  
   Systemoutprintln(單價+price);
  
   Systemoutprintln(購買只數+amount);
  
   Systemoutprintln(總價:+(price * amount));
  
   }
  
  我們希望將第~行代碼塊抽取到一個稱為printDetail()的方法中選中第~行的代碼>Ctrl+Shift+R>Extract Method調出提煉方法對話框如下圖所示
   educitycn/img_///jpg>
  
  在Method name中鍵入printDetail按OK後JBuilder將選中的代碼塊提煉到新的方法中並在原方法處插入提煉方法的調用
  
  代碼清單 進行方法提煉後的代碼
  
   public void printQuotation(int amount)
  
   {
  
   printBanner();
  
   printDetail(amount);//在源處插入對抽取出方法的引用
  
   }
  
   //抽取出來的方法
  
   private void printDetail(int amount) {
  
   Systemoutprintln(單價+price);
  
   Systemoutprintln(購買只數+amount);
  
   Systemoutprintln(總價:+(price * amount));
  
   }
  
  printDetail()方法有一個入參用於傳遞代碼塊所引用的上下文變量在第行的調用處將變量通過printDetail()的amount入參傳入
  
  內聯方法
  
  內聯方法是提煉方法的反操作即用方法體替換方法調用當方法是private且再沒有其他地方調用該方法時JBuilder在內聯方法後一並刪除這個被內聯的方法如我們將光標放置代碼清單 的第行printDetail()處Ctrl+Shift+R>Inline MethodJBuilder直接將printDetail()方法體內聯到第行處因為在Horsejava中沒有其他地方調用printDetail()所以該函數內在聯後將從Horsejava中刪除內聯後代碼如代碼清單 所示
  
  如果系統中所有函數都似乎只是對另一個函數的簡單委托形成過多的間接層過多的委托將使程序的關系變得不易理解此時可以使用內聯方法去除這些無用的委托方法
  
  提煉變量
  
  我們曾經說過不同的方法有重復的代碼塊時須考慮將其抽取為一個獨立的方法不同的類有重復的方法時須考慮抽取到一個新的類中相似的如果一個方法中多次重復出現同一個表達式此時你可以考慮將這些相同的表達式提煉為一個局域變量請看下面的代碼 代碼清單 重復的表達式
  
   public void printAccountPrice(int amount)
  
   {
  
   if(amount <= ) {
  
   Systemoutprintln(總價 + (amount * price)) ;
  
   }
  
   else if(amount <= ) {
  
   Systemoutprintln(總價(打折) + (amount * price) * ) ;
  
   }
  
   else {
  
   Systemoutprintln(總價(打折) + (amount * price) * ) ;
  
   }
  
   }
  
  在printAccount()方法中表達式amount*price重復出現我們可以在函數開始處引入一個局域變量用這個變量替換這個表達式Ctrl+Shift+R>Introduce Variable調出引入變量的對話框如下圖所示
   educitycn/img_///jpg>
  
  引入變量對話框
  
  NametotalPrice 引入的變量名
  
  Type變量類型不可變JBuilder自動斷定
  
  Expression你所選中的計算表達式
  
  Include all read expressions如果此選項勾選則JBuilder將在方法范圍內查找所有重復的表達式一並替換你沒有什麼理由不選擇這個設置項
  
  按OK後完成重構重構後代碼如下所示
  
  代碼清單 引入局域變量去除重復表達式
  
   public void printAccountPrice(int amount)
  
   {
  
   double totalPrice = (amount * price);
  
   if(amount <= ) {
  
   Systemoutprintln(總價 + totalPrice) ;
  
   }
  
   else if(amount <= ) {
  
   Systemoutprintln(總價(打折) + totalPrice * ) ;
  
   }
  
   else {
  
   Systemoutprintln(總價(打折) + totalPrice * ) ;
  
   }
  
   }
  
  特別的如果一個表達式過於復雜應當按特定意義劃分成多個部分每個部分抽取成一個獨立的局域變量以提高程序的可讀性如下面是計算n個圓錐的造價
  
  n*MathPI*r*r*h/*price
  
  可以將其重構為以下的形式
  
  double s = MathPI*r*r*h/;//圓錐體積
  
  totalPrice = n * s * price;//n個圓錐造價
  
  內聯變量
  
  和內聯方法一樣內聯變量是提煉變量的反操作有兩種內聯變量的方法如果你將光標放置在變量的定義處進行內聯變量重構所有引用該變量的地方都被替換變量定義語句被刪除如果你將光標置於引用變量處進行內聯變量操作則可以有兩種選擇只對當前的位置進行變量內聯或內聯變量的所有引用處 我們使用代碼清單 演示第二種內聯變量的方法將光標置於第行代碼的totalPrice處Ctrl+Shift+R>Inline Variable調出內聯變量的重構對話框如下圖所示
  educitycn/img_///jpg>
  內聯變量對話框
  
  Variable選擇內聯的變量
  
  Expression內聯的表達式
  
  Replace all occurrences內聯所有引用totalPrice變量的地方否則只內聯當前引用處
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25824.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.