知识大全 Eclipse中自动重构实现探索
Posted 函数
篇首语:知识的价值不在于占有,而在于使用。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Eclipse中自动重构实现探索相关的知识,希望对你有一定的参考价值。
Eclipse中自动重构实现探索 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
本文用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使用如下版本 同时安装了中文语言包 二 重构第一步 分解并重组statement() 目的 把statement()函数中的swich语句提炼到独立的函数amountFor()中 修改amountFor()参数命名 重构方法 Extract Method Rename Method 方法 选中swich语句的代码块 在右键菜单中选择 重构/抽取方法 出现参数对话框 Eclipse自动分析代码块中的局部变量 找到了两个局部变量 each和thisAmount 其中 each只是在代码块中被读取 但thisAmount会在代码块中被修改 按照重构Extract Method总结出来的规则 应该把each当作抽取函数的参数 thisAmount当作抽取函数的返回值 然而Eclipse并不做区分 直接把这两个变量当作抽取新方法的参数 如图 我们的目的是把在抽取函数中不会被修改的each作为参数 会被修改的thisAmount作为返回值 解决的办法是 把 double thisAmount = ; 这行代码移到switch语句的上面 变成这样 double thisAmount = ; switch(each getMovie() getPriceCode()) case Movie REGULAR: thisAmount += ; if(each getDaysRented()> ) thisAmount += (each getDaysRented() )* ; break; case Movie NEW_RELEASE: thisAmount += each getDaysRented()* ; break; case Movie CHILDRENS: thisAmount += ; if(each getDaysRented()> ) thisAmount += (each getDaysRented() )* ; break; 选中这段代码 在右键菜单中选择 重构/抽取方法 eclipse这次变得聪明点了 如图 educity cn/img_ / / / jpg> 选择 预览 按钮预先查看重构后的结果 符合我们最初的目的 educity cn/img_ / / / jpg> 选择 确定 按钮 重构后的代码片断如下 public String statement() double totalAmount = ; int frequentRenterPoints = ; 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()> ) 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 = ; switch(each getMovie() getPriceCode()) case Movie REGULAR: thisAmount += ; if(each getDaysRented()> ) thisAmount += (each getDaysRented() )* ; break; case Movie NEW_RELEASE: thisAmount += each getDaysRented()* ; break; case Movie CHILDRENS: thisAmount += ; if(each getDaysRented()> ) thisAmount += (each getDaysRented() )* ; break; return thisAmount; 选中amountFor()的参数each 在右键菜单中选择 重构/重命名 在对话框中输入新的名称 aRental 选择确定 amountFor()中所有each的引用全部被替换成新的名称 用同样的办法修改amountFor()中的局部变量thisAmount为result 重构后的amountFor()代码如下 /** * @param aRental * @return */ private double amountFor(Rental aRental) double result = ; switch(aRental getMovie() getPriceCode()) case Movie REGULAR: result += ; if(aRental getDaysRented()> ) result += (aRental getDaysRented() )* ; break; case Movie NEW_RELEASE: result += aRental getDaysRented()* ; break; case Movie CHILDRENS: result += ; if(aRental getDaysRented()> ) result += (aRental getDaysRented() )* ; break; return result; 三 重构第二步 搬移 金额计算 代码 目的 将函数amountFor()转移到Rental类中 并更名为getCharge() 更新并替换所有对amountFor()的引用 重构方法 Move Method Change Method signatrue Inline Method Inline Temp 方法 选中函数amountFor()的定义 在右键菜单中选择 重构/移动 显示参数设置对话框 把新方法名改成getCharge 按下 确定 按钮 Customer Class中的amountFor()函数被移动到Rental Class中 并更名为 getCharge() educity cn/img_ / / / jpg> 同时eclipse自动在Customer的amountFor()函数中添加一行对新函数的 委托 代码 private double amountFor(Rental aRental) return aRental getCharge(); 这行代码会产生编译错误 原因是amountFor()的private型被传递到了新的方法中 /** * @param this * @return */ private double getCharge() …… 继续重构!选中getCharge()方法 在右键菜单中选择 重构/更改方法特征符 弹出参数选择对话框 把访问修饰符从private改成public Eclipse的编译错误提示自动消失 educity cn/img_ / / / jpg> 回到Customer类 把所有对amountFor()引用的地方替换成直接对getCharge()的引用 选中Customer类的函数amountFor(Rental aRental) 在右键菜单中选择 重构/内联 出现参数选择对话框 educity cn/img_ / / / jpg> 选择 确认 按钮 引用amountFor()的地方被替换成对getCharge()的引用 public String statement() …… double thisAmount = each getCharge(); …… 除去临时变量thisAmount 选中变量thisAmount 在右键菜单中选择 重构/内联 重构预览窗口如下 可见达到了重构的目的 按下 确认 按钮重构代码 educity cn/img_ / / / jpg> statement()代码 public String statement() double totalAmount = ; // 总消费金额 int frequentRenterPoints = ; // 常客积点 Enumeration rentals = _rentals elements(); String result = Rental Record for + getName() + \\n ; while(rentals hasMoreElements()) Rental each = (Rental)rentals nextElement(); //取得一笔租借记录 // add frequent renter points(累加 常客积点) frequentRenterPoints ++; // add bouns for a o day new release rental if((each getMovie() getPriceCode())==Movie NEW_RELEASE && each getDaysRented()> ) frequentRenterPoints ++; // show figures for this cha138/Article/program/Java/ky/201311/11170相关参考
知识大全 在Eclipse中使用Ant来自动编译J2me程序
在Eclipse中使用Ant来自动编译J2me程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 在Eclipse中使用Ant来自动编译J2me程序[1]
在Eclipse中使用Ant来自动编译J2me程序[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
知识大全 在Eclipse中使用Ant来自动编译J2me程序[2]
在Eclipse中使用Ant来自动编译J2me程序[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
知识大全 在Eclipse中使用Ant来自动编译J2me程序[3]
在Eclipse中使用Ant来自动编译J2me程序[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
知识大全 在Eclipse中使用Ant来自动编译J2me程序[4]
在Eclipse中使用Ant来自动编译J2me程序[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
Eclipse无法自动编译出class文件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 有时候
知识大全 Eclipse 4.3 输入等号和空格禁止自动上屏补丁
Eclipse4.3输入等号和空格禁止自动上屏补丁 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Delphi深度探索之自动完成外壳扩展 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &
在matlab中如何对重构的图像细节显示?(或者对图像的细节放大)!谢谢了!在gui窗口fig中画2个axes直接在回调函数下显示就可以了axes(handles.axes1);imshow(bw1)
最近玩ReportingService报表微软官方客户端展现实现中有这么一段代码 protectedvoidPage_Load(objectsenderEventArgse)