从Java的角度理解设计模式3:自动提炼方法

文章摘自http://www.rzchina.net/forum/7

下面将简单展示两个重构技巧“提炼方法(Refactoring:Extract Method)”和“搬移方法(Refactoring:Move Method)”如何通过Eclipse自动实施。给出原始代码,如下所示。

HelloBean.java

package ch2.extractandmovemethod.prototype;
 
public class HelloBean {
  public void sayHello() {
    System.out.println("朋友,时刻重构吧!");
  }
}

RefactoringIDETest.java

package ch2.extractandmovemethod.prototype;
 
public class RefactoringIDETest {
  public static void main(String[] args) throws Exception {
    String className = "ch2.refactoringusingide.HelloBean";

    Object beanInstance = null;
    try {
      Class clazz = Class.forName(className);
      beanInstance = clazz.newInstance();
    } catch (Exception ex) {
      throw ex;
    }

    ((HelloBean)beanInstance).sayHello();
  }
}
注意上述代码的框选部分,显然这部分代码可以被提炼出来形成一个公用方法。
说明:如果使用重构工具,只需简单地圈选出要提炼的段落,然后点选菜单选项“Extract Method”就行了。重构工具会自动检查被圈选的代码段是否可以提炼。代码无法提炼的原因有很多,可能是:它可能只包含部分标识符声明;可能对某个变量赋值而该变量又被其它代码用到。所有这些情况,程序员都完全不必担心,因为重构工具会自动识别并处理一切。随后,工具会自动计算出新方法所需的参数,并要求程序员为新方法取一个名字。此时,程序员可自行决定新方法参数的命名、排列顺序等。所有准备工作都完成后,重构工具会把圈选的代码从源方法中提炼出来,并在源方法中加入对新方法的调用。随后它会再源方法所属的类中建立新的方法,并以程序员指定的名称来命名该方法。整个重构过程耗时极短,且不会出错,相比手工进行这个重构,方便、安全了许多,体现了自动化重构工具的威力。
现在用Eclipse来实现上述步骤,首先选中上述代码的框选部分,点击鼠标右键,找到重构菜单“Refactor”,点选“Extract Method” (注意,重构菜单会自动识别出当前圈选的代码段有哪些重构技巧可用),如图1所示。

图1  自动化重构过程第一步
在随后出现的对话框中,为提炼出的新方法命名(命名为“instantiateClass”),并决定其它的方法签名(注意,为了后续可以不用修改地将此方法搬移到另一个工具类中,请选择“public”的方法访问权限),如图2所示。

图2  自动化重构过程第二步
点选“Preview”可预览重构所牵动的资源和结果,点选“OK”将直接进行重构,点选“Cancel”将放弃重构,当然即使在重构完成后,Eclipse也提供了强大的重构回复功能,可将所有牵动的代码回复到重构前的状态,甚至还有重构的历史回复功能。现在,点击“OK”,得到应用了(Refactoring:Extract Method)后的代码,如下所示。

RefactoringIDETest.java

package ch2.extractandmovemethod;
 
import ch2.extractandmovemethod.prototype.HelloBean;
 
public class RefactoringIDETest {
  public static void main(String[] args) throws Exception {
    String className = "ch2.refactoringusingide.HelloBean";
    Object beanInstance = instantiateClass(className);
    ((HelloBean)beanInstance).sayHello();
  }
 
  public static Object instantiateClass(String className) throws Exception {
    Object beanInstance = null;
    try {
      Class clazz = Class.forName(className);
      beanInstance = clazz.newInstance();
    } catch (Exception ex) {
      throw ex;
    }
    return beanInstance;
  }
}
 
 
 
融智技术学苑(http://www.rzchina.net)版权所有,本公司致力于提供更好更实用的Java培训课程,帮助学员迅速成为编程的行家里手,更多Java面试题/Java视频/Java教程请访问我们的网站.转载请保留这段文字。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值