您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页在Eclipse中建立新的重构效率

在Eclipse中建立新的重构效率

来源:五一七教育网


在Eclipse中建立新的重构效率

对重构的强壮支持是软件开发职员爱好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属性。 下场预览

为了给读者一个直观的感到,咱们下面起首介绍本文中例子的理论运行成就。在浏览完本文来日,读者朋友也概略或许顺遂的搞定相同的功用。

发动例子挨次提供的Refa首席技术官r来日,咱们获得了一个由三个页面构成的统率。在第一个页面中,用户概略繁华是否需求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按钮添加以下的插件: 清单 2

org.eclipse.jface.text org.eclipse.ltk.core.refactoring org.eclipse.ltk.ui.refactoring org.eclipse.jdt org.eclipse.jdt.core 可能也可能经由直接批改MANIFEST.MF文件搞定。垄断搞定后察看MANIFEST.MF文件,留意Require-Bundle列表中能否出现了新增长的这几项。MANIFEST.MF文件以下: 清单 3

Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Annotation Plug-in

Bundle-SymbolicName: manage.annotation; singleton:=true Bundle-Version: 1.0.0

Bundle-Activator: manage.annotation.AnnotationPlugin Bundle-Localization: plugin Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.jface.text,

org.eclipse.ltk.core.refactoring,

org.eclipse.ltk.ui.refactoring, org.eclipse.jdt, org.eclipse.jdt.core Eclipse-AutoStart: true

在Plug-in Manifest编纂器中翻开插件清单文件plugin.xml,或者看到,这个插件扩充了org.eclipse.ui.actionSets扩充点,这是一个基本的Eclipse工作台的扩充点,颠末扩充它,插件或者很容易得对Eclipse的菜单、东西条发展扩充。这个plugin.xml是\"Hello,World\"插件模板的清单文件,咱们把它改成切当这个工程的文件。清单如下: 清单 4

<?xml version=\"1.0\" encoding=\"UTF-8\"?> <?eclipse version=\"3.0\"?> <plugin>

<extension

point=\"org.eclipse.ui.actionSets\"> <actionSet

label=\"Annotation Action Set\" visible=\"true\"

id=\"manage.annotation.actionSet\"> <menu

label=\"%Refactoring.menu.label\" path=\"source\"

id=\"org.eclipse.jdt.ui.refactoring.menu\"> <separator name=\"reorgGroup\"/> </menu> <action

class=\"manage.annotation.actions.AnnotationManageAction\" icon=\"icons/sample.gif\"

id=\"manage.annotation.actions.AnnotationManageAction\" label=\"%Annotation.manage\"

menubarPath=\"org.eclipse.jdt.ui.refactoring.menu/reorgGroup\" toolbarPath=\"reorgGroup\"

tooltip=\"Manage Annotation in Java Project\"/> </actionSet> </extension>

</plugin>

该清单文件表达,在Refactor菜单中增加了一个新菜单项\"Annotation Manage\",并在东

西条上相应增加了一个按钮。点击菜单项可能按钮的事故由类\"manage.annotation.actions.AnnotationManageAction\"处置惩罚。

结尾重要修改的即是manage.annotation.actions.AnnotationManageAction类。它承袭了org.eclipse.ui.IWorkbenchWindowActionDelegate接口,该接口用于处置惩罚各种经由扩充点增加的操作。当菜单项可能按钮被点击时,这个类就被Eclipse工作台装载进来,处置惩罚转发过来的哀求以及尔后的操作。

AnnotationManageAction被创立后,一旦用户的选择部分有所窜改,接口的selectionChanged函数就会被触发,见告用户所选择的部分,也许在这个函数中依照用户的选择相应的修改操作的可用性可能别的体现属性。比方在本文的工程中,咱们巴望只要当用户选择了一个Java模型元素时伎俩应用这个操作,那么就重要在selectionChanged中增加下列的代码: 清单 5

public void selectionChanged(IAction action, ISelection selection) { if (selection.isEmpty()) select = null;

else if (selection instanceof IStructuredSelection) {

IStructuredSelection strut = ((IStructuredSelection) selection); if (strut.size() != 1) select = null;

if (strut.getFirstElement() instanceof IJavaElement) select = (IJavaElement) strut.getFirstElement(); } else select = null;

action.setEnabled(select != null); }

selectionChanged函数的参数selection记载了用户决计的一小块,咱们起首果断它的决计一小块的数目能否为一,而后果断这个独一的决计一小块能否为Java模子元素,这两个条件任何一个不如意足都会导致action.setEnabled(false)的执行,这时会弹出如下的对话框阐明独霸不成用,同时菜单项和按钮都会泄漏表现成灰色,直到用户决计了合适的一小块时,菜单项和按钮才会实显,便或是发展具体的独霸了。

图 4 解释Action目前不能执行的对话框

独霸的执行是在AnnotationManageAction的run函数中实现的,比喻在本文的工程中,

就是弹出Refa首席技能官ringWizard对话框,领导用户实现重构的工作,这些咱们将在下面的章节中陈说。

文章来源:java视频http://www.leadfar.org/

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务