Eclipse中自动重构实现探索

三分有半

三分有半

2016-01-29 12:50

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

  本文用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://m.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://m.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
展开更多 50%)
分享

猜你喜欢

Eclipse中自动重构实现探索

Java JAVA基础
Eclipse中自动重构实现探索

用JBuilder 2005实现重构之认识重构

编程语言 网络编程
用JBuilder 2005实现重构之认识重构

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

JBuilder2005实现重构之杂项重构

编程语言 网络编程
JBuilder2005实现重构之杂项重构

JBuilder2005实现重构

Web开发
JBuilder2005实现重构

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

oracle中实现自动增长列

电脑网络
oracle中实现自动增长列

Eclipse插件开发中实现刷新和重编译介绍

编程语言 网络编程
Eclipse插件开发中实现刷新和重编译介绍

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Tomcat中文手册(2)

Tomcat中文手册(2)

JBuilder2005单元测试体验之测试配置

JBuilder2005单元测试体验之测试配置
下拉加载更多内容 ↓