Eclipse中自动重构实现探索

2016-01-29 12:50 11 1 收藏

Eclipse中自动重构实现探索,Eclipse中自动重构实现探索

【 tulaoshi.com - Java 】

  本文用eclipse的自动重构功能对一个程序实例进行重构,目的是探索Eclipse自动重构可以在多大程度上辅助重构这个过程。程序实例使用《Refactoring:Improving the Design of Existing Code》一书中的例子。

  Eclipse的自动重构功能能够很好地支持各种程序元素的重命名,并自动更新相关的引用。Eclipse能够支持方法、字段在类之间移动,并自动更新引用。Eclipse较好地支持内联字段、函数的更新替换。Eclipse较好地支持抽取方法、变量等程序元素。

  重构的过程是一个不断尝试和探索的过程。Eclipse的重构支持撤销和重做,并且能够预览重构结果,这些是很实用的功能。

  Eclipse的重命名、抽取方法、移动、内联功能、更改方法特征符等代码结构级别的重构方法,是比较成熟同时也值得使用的功能。至于设计结构上的重构,eclipse还不能很好地支持。但是作者相信,自动重构的理念应该是"工具辅助下的重构工作",人仍然承担大部分重构工作。

  一、预备工作

  本文使用《Refactoring:Improving the Design of Existing Code》一书第一章的例子。重构前的代码及每一步重构后的代码见附件。读者最好配合《Refactoring:Improving the Design of Existing Code》一书阅读本文。

  Eclipse使用如下版本:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/java/)


  同时安装了中文语言包。

  二、重构第一步:分解并重组statement()

  目的:

  1、 把statement()函数中的swich语句提炼到独立的函数amountFor()中。

  2、 修改amountFor()参数命名

  重构方法:

  Extract Method
  Rename Method

  方法:

  1、选中swich语句的代码块,在右键菜单中选择"重构/抽取方法",出现参数对话框。Eclipse自动分析代码块中的局部变量,找到了两个局部变量:each和thisAmount。其中,each只是在代码块中被读取,但thisAmount会在代码块中被修改。按照重构Extract Method总结出来的规则,应该把each当作抽取函数的参数、thisAmount当作抽取函数的返回值。然而Eclipse并不做区分,直接把这两个变量当作抽取新方法的参数,如图。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/java/)

  我们的目的是把在抽取函数中不会被修改的each作为参数;会被修改的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;
  }

  选中这段代码,在右键菜单中选择"重构/抽取方法",eclipse这次变得聪明点了,如图。

  选择"预览"按钮预先查看重构后的结果,符合我们最初的目的。


  选择"确定"按钮,重构后的代码片断如下:

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

  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 += " " + each.getMovie().getTitle() + " " +String.valueOf(thisAmount) + " ";
   totalAmount += thisAmount;
  }

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

来源:https://www.tulaoshi.com/n/20160129/1487743.html

延伸阅读
大多数程序设计的爱好者选择并使用Delphi来编写软件,都是被其中丰富而功能强大的VCL控件所吸引。Delphi自带的数据感知(Data-Aware)控件,更是成为开发MIS软件的程序员之首选。在那么多数据感知控件中,TDBGrid由于其使用方便、显示信息量大成为最引人注目的一员,大量的国内外软件中都出现了它的身影。或许是由于使用的人多了,对于它的期...
标签: word
自动套用格式在Word2013中怎样实现   第1步,打开Word20103文档窗口,选中需要应用自动套用格式的文本(如果不选中文本,自动套用格式将作用于整篇Word文档)。然后在快速访问工具栏单击自动套用格式按钮 第2步,在打开的自动套用格式对话框中选中自动套用格式并逐项审阅修订单选框,然后在文档类型下拉列表中选中常规文档、信...
标签: word
设置在Word2007中实现自动卷动   有些老式的两键鼠标是没有滚轮的,因此在使用Word时往往要移到窗口右边拖动垂直滚动条来实现文章翻页,十分不便。那么有没有较好的方法可以用来滚动页面查看文件呢? 其实,从Word 2002版本开始,Word程序就开始提供文件自动滚动功能,无论电脑鼠标是否有滚轮都可以使用,方便用户轻松地将文件内...
在JBuilder中通过重构将值域、方法在类的继续体系中上推下移,是非常轻易的操作。这了说明这种重构功能,我们先来看下面的类继续体系: 图 15 类的继续类图 Animal类是Cat和Horse和父类,Animal中包含了两个值域和一个方法。可以将Animal中的值域有选择地下移到某个子类中。此外,还可以为Animal提炼超类和接口。 ...
标签: 聊天软件
有些老式的两键鼠标是没有滚轮的,因此在使用Word时往往要移到窗口右边拖动垂直滚动条来实现文章翻页,十分不便。那么有没有较好的方法可以用来滚动页面查看文件呢? 其实,从Word 2002版本开始,Word程序就开始提供文件自动滚动功能,无论电脑鼠标是否有滚轮都可以使用,方便用户轻松地将文件内容上下拖动观看,下面笔者就以Word2007...

经验教程

396

收藏

49
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部