国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Eclipse中自動(dòng)重構(gòu)實(shí)現(xiàn)探索

2019-11-18 11:04:59
字體:
供稿:網(wǎng)友
 本文用eclipse的自動(dòng)重構(gòu)功能對(duì)一個(gè)程序?qū)嵗M(jìn)行重構(gòu),目的是探索Eclipse自動(dòng)重構(gòu)可以在多大程度上輔助重構(gòu)這個(gè)過程。程序?qū)嵗褂谩禦efactoring:ImPRoving the Design of Existing Code》一書中的例子。

   Eclipse的自動(dòng)重構(gòu)功能能夠很好地支持各種程序元素的重命名,并自動(dòng)更新相關(guān)的引用。Eclipse能夠支持方法、字段在類之間移動(dòng),并自動(dòng)更新引用。Eclipse較好地支持內(nèi)聯(lián)字段、函數(shù)的更新替換。Eclipse較好地支持抽取方法、變量等程序元素。

   重構(gòu)的過程是一個(gè)不斷嘗試和探索的過程。Eclipse的重構(gòu)支持撤銷和重做,并且能夠預(yù)覽重構(gòu)結(jié)果,這些是很實(shí)用的功能。

   Eclipse的重命名、抽取方法、移動(dòng)、內(nèi)聯(lián)功能、更改方法特征符等代碼結(jié)構(gòu)級(jí)別的重構(gòu)方法,是比較成熟同時(shí)也值得使用的功能。至于設(shè)計(jì)結(jié)構(gòu)上的重構(gòu),eclipse還不能很好地支持。但是作者相信,自動(dòng)重構(gòu)的理念應(yīng)該是"工具輔助下的重構(gòu)工作",人仍然承擔(dān)大部分重構(gòu)工作。

   一、預(yù)備工作

   本文使用《Refactoring:Improving the Design of Existing Code》一書第一章的例子。重構(gòu)前的代碼及每一步重構(gòu)后的代碼見附件。讀者最好配合《Refactoring:Improving the Design of Existing Code》一書閱讀本文。

   Eclipse使用如下版本:

Eclipse中自動(dòng)重構(gòu)實(shí)現(xiàn)探索
   同時(shí)安裝了中文語言包。

   二、重構(gòu)第一步:分解并重組statement()

   目的:

   1、 把statement()函數(shù)中的swich語句提煉到獨(dú)立的函數(shù)amountFor()中。

   2、 修改amountFor()參數(shù)命名

   重構(gòu)方法:

   Extract Method
   Rename Method

   方法:

   1、選中swich語句的代碼塊,在右鍵菜單中選擇"重構(gòu)/抽取方法",出現(xiàn)參數(shù)對(duì)話框。Eclipse自動(dòng)分析代碼塊中的局部變量,找到了兩個(gè)局部變量:each和thisAmount。其中,each只是在代碼塊中被讀取,但thisAmount會(huì)在代碼塊中被修改。按照重構(gòu)Extract Method總結(jié)出來的規(guī)則,應(yīng)該把each當(dāng)作抽取函數(shù)的參數(shù)、thisAmount當(dāng)作抽取函數(shù)的返回值。然而Eclipse并不做區(qū)分,直接把這兩個(gè)變量當(dāng)作抽取新方法的參數(shù),如圖。

Eclipse中自動(dòng)重構(gòu)實(shí)現(xiàn)探索
   我們的目的是把在抽取函數(shù)中不會(huì)被修改的each作為參數(shù);會(huì)被修改的thisAmount作為返回值。解決的辦法是,把 double thisAmount = 0; 這行代碼移到switch語句的上面,變成這樣:

double thisAmount = 0;
switch(each.getMovie().getPriceCode()){
  case Movie.REGULAR:
   thisAmount += 2;
   if(each.getDaysRented()>2)
   thisAmount += (each.getDaysRented()-2)*1.5;
   break;

  case Movie.NEW_RELEASE:
   thisAmount += each.getDaysRented()*3;
   break;

  case Movie.CHILDRENS:
   thisAmount += 1.5;
   if(each.getDaysRented()>3)
    thisAmount += (each.getDaysRented()-3)*1.5;
   break;
}

   選中這段代碼,在右鍵菜單中選擇"重構(gòu)/抽取方法",eclipse這次變得聰明點(diǎn)了,如圖。

Eclipse中自動(dòng)重構(gòu)實(shí)現(xiàn)探索
   選擇"預(yù)覽"按鈕預(yù)先查看重構(gòu)后的結(jié)果,符合我們最初的目的。

Eclipse中自動(dòng)重構(gòu)實(shí)現(xiàn)探索
   選擇"確定"按鈕,重構(gòu)后的代碼片斷如下:

public String statement() {
  double totalAmount = 0;
  int frequentRenterPoints = 0;
  Enumeration rentals = _rentals.elements();
  String result = "Rental Record for " + getName() + "/n";

  while(rentals.hasMoreElements()){
   Rental each = (Rental)rentals.nextElement();

  double thisAmount = amountFor(each);

   frequentRenterPoints ++;
   if((each.getMovie().getPriceCode())==Movie.NEW_RELEASE &&each.getDaysRented()>1)
    frequentRenterPoints ++;

    result += "/t" + each.getMovie().getTitle() + "/t" +String.valueOf(thisAmount) + "/n";
    totalAmount += thisAmount;
  }

  result += "Amount owed is " + String.valueOf(totalAmount) + "/n";
  result += "You earned " + String.valueOf(frequentRenterPoints) + " frequent renter points";

  return result;
}

/**
* @param each
* @return
*/
private double amountFor(Rental each) {
  double thisAmount = 0;
  switch(each.getMovie().getPriceCode()){
   case Movie.REGULAR:
    thisAmount += 2;
    if(each.getDaysRented()>2)
     thisAmount += (each.getDaysRented()-2)*1.5;
    break;

   case Movie.NEW_RELEASE:
    thisAmount += each.getDaysRented()*3;
    break;

   case Movie.CHILDRENS:
    thisAmount += 1.5;
    if(each.getDaysRented()>3)
     thisAmount += (each.getDaysRented()-3)*1.5;
    break;
  }
  return thisAmount;
}

   2、選中amountFor()的參數(shù)each,在右鍵菜單中選擇"重構(gòu)/重命名",在對(duì)話框中輸入新的名稱:aRental,選擇確定,amountFor()中所有each的引用全部被替換成新的名稱。用同樣的辦法修改amountFor()中的局部變量thisAmount為result。重構(gòu)后的amountFor()代碼如下:

/**
* @param aRental
* @return
*/
private double amountFor(Rental aRental) {
  double result = 0;
  switch(aRental.getMovie().getPriceCode()){
   case Movie.REGULAR:
   result += 2;
    if(aRental.getDaysRented()>2)
    result += (aRental.getDaysRented()-2)*1.5;
    break;

   case Movie.NEW_RELEASE:
   result += aRental.getDaysRented()*3;
    break;

   case Movie.CHILDRENS:
   result += 1.5;
    if(aRental.getDaysRented()>3)
     result += (aRental.getDaysRented()-3)*1.5;
    break;
  }
  return result;
}


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 北川| 万盛区| 文安县| 无极县| 星座| 壶关县| 阿克苏市| 涡阳县| 汉川市| 阿克苏市| 岫岩| 华池县| 托克逊县| 南充市| 大田县| 屯门区| 贵阳市| 象山县| 乐业县| 红河县| 黄浦区| 东丰县| 黎平县| 左贡县| 蕉岭县| 阆中市| 铜山县| 临潭县| 宜城市| 泰安市| 夏邑县| 阿鲁科尔沁旗| 大名县| 灵川县| 班玛县| 花莲市| 岚皋县| 许昌县| 和田县| 醴陵市| 新邵县|