在Eclipse中创建新的重构功能

2008-02-23 08:00:20来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  对重构的强大支持是软件开发人员喜爱Eclipse的一个最为重要的原因。而Eclipse还有一个至少和重构不相上下的优点,那就是其近乎无懈可击的可扩展性。这两者的结合意味着我们可以根据自己的需要来创建展新的重构功能。

  介绍

  重构在现代软件开发过程中扮演着重要的角色,它能够减轻软件开发人员的工作负担,提高软件开发的生产效率。为了阐明重构的重要性,我们在这里引用了developerWorks上David Carew提供的关于重构的教程中的一段话:

  现在,一个开发者的工作大部分在于对现有的代码进行修改,而不是起草写新的代码。简单的修改可能包括对现有代码进行添加。然而,多样化的修改或扩展的改变会使软件内部结构开始恶化。重构改变软件的内部结构使得软件更容易理解并且在不需要改变其显著的行为的情况下使得修改的代价也更小。 在Java软件开发过程中,通过使用Eclipse提供的重构工具,我们至少获得了以下好处:

  1. 最终产品更为健壮:我们对程序代码的修改将不太可能出错,出现遗漏修改的可能变少,即使出现问题也能够通过Undo功能回退到重构前的状态。

  2. 提高了生产效率。通常一次重构能够完成对程序代码的多处改动。最为明显的例子可能是Eclipse提供的Rename重构,它能够在修改名称的同时相应的更改所有的引用。 Eclipse为我们提供了多种实用的重构功能,在软件开发过程中使用这些重构能够给我们带来极大的好处。然而,针对每个开发人员的特殊需要,总有一些迫切需要的功能是不能通过已有的重构来获得的。这个时候,我们可以对Eclipse平台进行一些扩展,创建适应我们自己需要的重构。如果这个重构恰好能够符合大多数人的需要,我们也可以像其他Eclipse的contributor一样,将我们的重构贡献给Eclipse社区。

  接下来,我们将通过一个例子来展示如何在Eclipse中创建新的重构功能。我们这里创建的重构将用于迁移JUnit的测试用例。我们知道,在当前版本的JUnit中,一个用于测试的函数必须以字符串"test"作为方法名称的开始。而在即将来到的JUnit 4中,一个"@Test"的Annotation被用于标明方法是一个测试方法。我们将要创建的重构将完成这个迁移工作,即在所有的以"test"开始的方法之前加上"@Test"标记。@Test Annotation还可以包含一个timeout属性用来规定方法的最大执行时间,我们在向导中提供了一个页面供用户选择是否需要timeout属性。

  结果预览

  为了给读者一个直观的感受,我们下面首先介绍本文中例子的实际运行效果。在阅读完本文之后,读者朋友也能够顺利的完成类似的功能。

  启动例子程序提供的Refactor之后,我们获得了一个由三个页面组成的向导。在第一个页面中,用户可以选择是否需要timeout参数,并且用户能够设置timeout参数的值。


图 1 输入参数
  当用户输入参数完毕之后,通过单击Next按钮我们将进入下一个页面。向导将进行初始条件检查和最终条件检查,并将检查的结果反馈给用户。在图 2中我们可以看到,初始条件和最终条件都正常,因此我们可以进入下一步。


图 2 显示条件检查
  接下来是预览窗口(图 3),向导用直观的界面显示了在应用向导之后,我们将会对源代码造成怎样的改动。用户可以在这个页面中判断最终的修改是否符合自己的需要。另外,用户也能够选择性的取消对某些文件的修改。


  当用户检查预览页面确认没有问题之后,用户可以按下Finish按钮从而完成重构。这个时候,源代码会发生修改,最后的结果如下所示:

  清单 1

package main;

public class TestSomething {
 @Test(timeout=500)
 public void testSomething(){}
}

  总体结构和流程

  在Eclipse中,一个重构操作主要由以下三个部分组成:

  1. RefactoringWizard类:RefactoringWizard提供了向导式的用户界面来引导用户完成重构工作。不需要我们做任何工作,Eclipse已经通过RefactoringWizard为我们提供了预览页面、条件检查页面以及Undo/Redo等功能。我们需要继承这个类从而为重构过程提供特定的用户界面。

  2. Refactoring类:Refactoring类完成具体的定位和修改代码功能。为了建立新的Refactoring,我们需要继承这个类并实现重构的逻辑部分。

  3. AST和ASTParser:在Refactoring类中,我们需要对代码进行定位和修改,这可以通过AST机制来完成。AST是abstract syntax tree的简称,它能够将Java代码解析成为一个树形结构。在利用了AST树之后,对源代码的修改变成了对AST树的遍历、更改节点属性,以及插入和删除节点等。

  一个典型的重构操作流程如下所示:

  1. 用户选择要进行重构的对象,通过菜单项或按钮启动重构操作。

  2. 创建具体的Refactoring类,弹出RefactoringWizard。

  3. RefactoringWizard与用户交互,引导用户输入必要的参数;RefactoringWizard调用Refactoring类的函数进行条件检查。

  4. Refactoring类创建AST,并利用其对源代码进行定位和修改。这里进行的修改并不直接应用到源代码上,而是被保存成Change对象,供Refactoring框架使用。

  5. RefactoringWizard调用Refactoring类的函数,获得重构内容的详细描述信息(即第4步生成的Change对象),显示在预览界面上,待用户确认。

  6. 用户确认后Refactoring框架将修改代码,重构操作结束。

  接下来,我们将详细介绍新建重构类型的各个步骤。

  创建插件工程

  在大家对整个系统构架有了一个大概的了解之后,我们的介绍就从创建工程开始。大家都知道Eclipse提供了很好的扩展性,通过创建插件就能把我们要添加的重构功能无缝的插入到Eclipse平台中。创建插件工程的方法在很多地方都有介绍,这里不再详细讲解。

  通过菜单 File -> New-> Project,选择Plug-in Project。点击Next,出现对话框,输入项目名称manage.annotation,接受其他选项的默认值。点击Next,出现插件属性设置的对话框,继续接受默认值。点击Next,出现选择插件模板对话框,该工程要在Refactor菜单中添加一个新的菜单项,所以这里我们采用"Hello,World"的插件模板。点击Next,修改"Action类名称"的值为AnnotationManageAction,点击Finish按钮。至此,一个最基本Eclipse工作台的插件工程就被创建出来了。 插件工程创建后,缺省进入Plug-in开发透视图,Plug-in Manifest编辑器自动打开,显示这个插件工程的基本信息,如对其他插件的依赖,扩展点,构建(build)的配置信息等等。由于该工程需要用到其他插件的功能,必须为其添加到其他插件的依赖。在Plug-in Manifest编辑器点击Dependencies页面,在该页面中的Required Plug-ins列表中通过Add按钮添加如下的插件:

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:基于JDBC的数据库连接池技术研究与应用

下一篇:网站安全不可忽视:一个收费JSP网站的破解过程