|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
还有就是总有人问我到底该学习什么语言,什么语言有前途,那么我的回答是不论是C,C++,java,.net,ruby,asp或是其他语言都可以学,编程的关键不是语言,而是思想。创立 对重构的壮大撑持是软件开辟职员喜好Eclipse的一个最为主要的缘故原由。而Eclipse另有一个最少和重构八两半斤的长处,那就是其近乎自作掩饰的可扩大性。这二者的分离意味着我们能够依据本人的必要来创立展新的重构功效。
先容
重构在古代软件开辟过程当中饰演侧重要的脚色,它可以加重软件开辟职员的事情包袱,进步软件开辟的临盆效力。为了分析重构的主要性,我们在这里援用了developerWorks上DavidCarew供应的关于重构的教程中的一段话:
如今,一个开辟者的事情年夜部分在于对现有的代码举行修正,而不是草拟写新的代码。复杂的修正大概包含对现有代码举行增加。但是,多样化的修正或扩大的改动会使软件外部布局入手下手好转。重构改动软件的外部布局使得软件更简单了解而且在不必要改动其明显的举动的情形下使得修正的价值也更小。在Java软件开辟过程当中,经由过程利用Eclipse供应的重构工具,我们最少取得了以下优点:
1.终极产物更加强健:我们对程序代码的修正将不太大概堕落,呈现漏掉修正的大概变少,即便呈现成绩也可以经由过程Undo功效回退到重构前的形态。
2.进步了临盆效力。一般一次重构可以完成对程序代码的多处修改。最为分明的例子多是Eclipse供应的Rename重构,它可以在修正称号的同时响应的变动一切的援用。Eclipse为我们供应了多种有用的重构功效,在软件开辟过程当中利用这些重构可以给我们带来极年夜的优点。但是,针对每一个开辟职员的特别必要,总有一些急切必要的功效是不克不及经由过程已有的重构来取得的。这个时分,我们能够对Eclipse平台举行一些扩大,创立顺应我们本人必要的重构。假如这个重构刚好可以切合年夜多半人的必要,我们也能够像其他Eclipse的contributor一样,将我们的重构奉献给Eclipse社区。
接上去,我们将经由过程一个例子来展现怎样在Eclipse中创立新的重构功效。我们这里创立的重构将用于迁徙JUnit的测试用例。我们晓得,在以后版本的JUnit中,一个用于测试的函数必需以字符串"test"作为办法称号的入手下手。而期近未来到的JUnit4中,一个"@Test"的Annotation被用于标明办法是一个测试办法。我们将要创立的重构将完成这个迁徙事情,即在一切的以"test"入手下手的办法之前加上"@Test"标志。@TestAnnotation还能够包括一个timeout属性用来划定办法的最年夜实行工夫,我们在导游中供应了一个页面供用户选择是不是必要timeout属性。
了局预览
为了给读者一个直不雅的感觉,我们上面起首先容本文中例子的实践运转效果。在浏览完本文以后,读者伴侣也可以顺遂的完成相似的功效。
启动例子程序供应的Refactor以后,我们取得了一个由三个页面构成的导游。在第一个页面中,用户能够选择是不是必要timeout参数,而且用户可以设置timeout参数的值。
输出参数
当用户输出参数终了以后,经由过程单击Next按钮我们将进进下一个页面。导游将举行初始前提反省和终极前提反省,并将反省的了局反应给用户。在中我们能够看到,初始前提和终极前提都一般,因而我们能够进进下一步。
显现前提反省
接上去是预览窗口(),导游用直不雅的界面显现了在使用导游以后,我们将会对源代码形成如何的修改。用户能够在这个页面中判别终极的修正是不是切合本人的必要。别的,用户也可以选择性的作废对某些文件的修正。
当用户反省预览页面确认没有成绩以后,用户能够按下Finish按钮从而完成重构。这个时分,源代码会产生修正,最初的了局以下所示:
清单1
packagemain;
publicclassTestSomething{
@Test(timeout=500)
publicvoidtestSomething(){}
}
整体布局和流程
在Eclipse中,一个重构操纵次要由以下三个部分构成:
1.RefactoringWizard类:RefactoringWizard供应了导游式的用户界面来引诱用户完成重构事情。不必要我们做任何事情,Eclipse已经由过程RefactoringWizard为我们供应了预览页面、前提反省页面和Undo/Redo等功效。我们必要承继这个类从而为重构历程供应特定的用户界面。
2.Refactoring类:Refactoring类完成详细的定位和修正代码功效。为了创建新的Refactoring,我们必要承继这个类并完成重构的逻辑部分。
3.AST和ASTParser:在Refactoring类中,我们必要对代码举行定位和修正,这能够经由过程AST机制来完成。AST是abstractsyntaxtree的简称,它可以将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-inProject。点击Next,呈现对话框,输出项目称号manage.annotation,承受其他选项的默许值。点击Next,呈现插件属性设置的对话框,持续承受默许值。点击Next,呈现选择插件模板对话框,该工程要在Refactor菜单中增加一个新的菜单项,以是这里我们接纳"Hello,World"的插件模板。点击Next,修正"Action类称号"的值为AnnotationManageAction,点击Finish按钮。至此,一个最基础Eclipse事情台的插件工程就被创立出来了。插件工程创立后,缺省进进Plug-in开辟透视图,Plug-inManifest编纂器主动翻开,显现这个插件工程的基础信息,如对其他插件的依附,扩大点,构建(build)的设置信息等等。因为该工程必要用到其他插件的功效,必需为其增加到其他插件的依附。在Plug-inManifest编纂器点击Dependencies页面,在该页面中的RequiredPlug-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:AnnotationPlug-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-inManifest编纂器中翻开插件清单文件plugin.xml,能够看到,这个插件扩大了org.eclipse.ui.actionSets扩大点,这是一个基础的Eclipse事情台的扩大点,经由过程扩大它,插件能够很复杂得对Eclipse的菜单、工具条举行扩大。这个plugin.xml是"Hello,World"插件模板的清单文件,我们把它改成合适这个工程的文件。清单以下:
清单4
<?xmlversion="1.0"encoding="UTF-8"?>
<?eclipseversion="3.0"?>
<plugin>
<extension
point="org.eclipse.ui.actionSets">
<actionSet
label="AnnotationActionSet"
visible="true"
id="manage.annotation.actionSet">
<menu
label="%Refactoring.menu.label"
path="source"
id="org.eclipse.jdt.ui.refactoring.menu">
<separatorname="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="ManageAnnotationinJavaProject"/>
</actionSet>
</extension>
</plugin>
该清单文件标明,在Refactor菜单中增加了一个新菜单项"AnnotationManage",并在工具条上响应增加了一个按钮。点击菜单项大概按钮的事务由类"manage.annotation.actions.AnnotationManageAction"处置。
最初必要修正的就是manage.annotation.actions.AnnotationManageAction类。它承继了org.eclipse.ui.IWorkbenchWindowActionDelegate接口,该接口用于处置各类经由过程扩大点增加的操纵。当菜单项大概按钮被点击时,这个类就被Eclipse事情台装载出去,处置转发过去的哀求和接上去的操纵。
AnnotationManageAction被创立后,一旦用户的选择部分有所改动,接口的selectionChanged函数就会被触发,告诉用户所选择的部分,能够在这个函数中依据用户的选择响应的修正操纵的可用性大概其他显现属性。比方在本文的工程中,我们但愿只要当用户选择了一个Java模子元素时才干利用这个操纵,那末就必要在selectionChanged中增加以下的代码:
清单5
publicvoidselectionChanged(IActionaction,ISelectionselection){
if(selection.isEmpty())
select=null;
elseif(selectioninstanceofIStructuredSelection){
IStructuredSelectionstrut=((IStructuredSelection)selection);
if(strut.size()!=1)
select=null;
if(strut.getFirstElement()instanceofIJavaElement)
select=(IJavaElement)strut.getFirstElement();
}else
select=null;
action.setEnabled(select!=null);
}
selectionChanged函数的参数selection纪录了用户选择的部分,我们起首判别它的选择部分的数量是不是为一,然后判别这个独一的选择部分是不是为Java模子元素,这两个前提任何一个不满意城市招致action.setEnabled(false)的实行,这时候会弹出以下的对话框申明操纵不成用,同时菜单项和按钮城市显现成灰色,直到用户选择了符合的部分时,菜单项和按钮才会实显,就能够举行详细的操纵了。
标明Action今朝不克不及实行的对话框
操纵的实行是在AnnotationManageAction的run函数中完成的,比方在本文的工程中,就是弹出RefactoringWizard对话框,引导用户完成重构的事情,这些我们将鄙人面的章节中报告。
<P> 扩大Refactoring类
经由过程后面体系构架的先容,人人晓得了Refactoring和RefactoringWizard是完成EClipse重构功效的基本类。在创立好插件工程后,我们就经由过程扩大Refactoring来完成详细的功效。
Refactoring是一切撑持代码转化的类的笼统父类,它在全部流程中与RefactoringWizard交互以完成重构的功效,起着十分主要的感化。这些类必要供应以下两类办法:
用于前提反省的办法,判别重构操纵大致而言可否实行,和详细的转化可否完成;
创立Change对象的办法,Change对象形貌了一切将要实行的对以后代码的修正操纵。
Refactoring类的典范流程以下所示:
1.详细的Refactoring类被创立。
2.取得用户选择的要举行重构的对象,初始化该Refactoring类。这个由详细的完成类给出响应的办法。
3.在重构操纵入手下手实行时,起首挪用Refactoring的checkInitialConditions(IProgressMonitor)基于用户选择的对象做一个的初始反省,这个一般由界面主动实行。前往RefactoringStatus.FATAL标明初始反省没有经由过程,重构操纵不克不及持续。
4.取得举行重构的其他参数,好比,对重定名操纵来讲就是指新名字。这个一般是由界面依据用户的输出供应的。由详细的完成类给出响应的办法。
5.取得用户输出参数后,挪用Refactoring的checkFinalConditions(IProgressMonitor)举行剩下的反省,这个一般由界面主动实行,前往RefactoringStatus.FATAL标明最初的反省没有经由过程,重构操纵不克不及持续。
6.挪用Refactoring的createChange(IProgressMonitor)取得Change对象,这个一般由界面主动实行,界面能够依据Change对象显现预览界面。
基于以上的先容,为了完成本文工程中的重构操纵,我们必要扩大Refactoring类,为它增添一个机关函数,而且详细完成checkInitialConditions、checkFinalConditions和createChange三个函数。
起首经由过程菜单File->New->Class弹出创立类的对话框,输出包名manage.annotation.refactor,类名AnnotationRefactoring,输出父类org.eclipse.ltk.core.refactoring.Refactoring,选中"承继笼统办法"复选框,点击完成按钮,一个扩大了Refactoring的最基础的类AnnotationRefactoring就被创立出来了。
起首为其增添机关函数,以用户选择的Java模子元素作为参数。Refactoring剖析这个参数以失掉一切相干的可写Java文件,作为重构操纵的对象,假如该模子元素包括在Java文件中,则找到包括它的文件节点;假如该模子元素包括Java文件,则找到它的一切子Java文件。机关函数代码以下:
清单6
publicAnnotationRefactoring(IJavaElementelement){
while(element.getElementType()>IJavaElement.COMPILATION_UNIT){
element=element.getParent();
if(element==null)
return;
}
if(element.getElementType()==IJavaElement.COMPILATION_UNIT){
if(!element.isReadOnly())
compilationUnits.add(element);
}
if(element.getElementType()<IJavaElement.COMPILATION_UNIT)
findWritableCompilationUnits(element);
}
接着完成checkInitialConditions函数,完成初始反省的详细操纵。作为示例,在本文工程中我们不举行任何详细的反省操纵,只复杂得给出初始反省乐成的信息,前往RefactoringStatus.
INFO以使重构操纵持续实行。checkInitialConditions函数代码以下:
清单7
publicRefactoringStatuscheckInitialConditions(IProgressMonitorpm)
throwsCoreException,OperationCanceledException{
returnRefactoringStatus.createInfoStatus("InitialConditionisOK!");
}
接着完成checkFinalConditions函数,完成取得用户输出参数后的后续反省操纵。在本文工程中,我们起首搜集一切必要增加正文的以test开首的办法,判别是不是不存在如许的办法,假如不存在给出堕落信息,前往RefactoringStatus.FATAL以停止重构操纵;假如存在如许的办法,则给出后续反省乐成的信息,前往RefactoringStatus.
INFO。checkFinalConditions函数代码以下:
清单8
publicRefactoringStatuscheckFinalConditions(IProgressMonitorpm)
throwsCoreException,OperationCanceledException{
collectChanges();
if(fChangeManager.size()==0)
returnRefactoringStatus.createFatalErrorStatus("Notestingmethodsfound!");
elsereturnRefactoringStatus.createInfoStatus("FinalconditionisOK!");
}
最初,创立Change对象的createChange函数是全部重构操纵中最中心的代码,它的完成将鄙人面章节中先容。
<P> 利用AST机关Change对象
当我们找到了修正的地位时,我们有两个选择:
1.经由过程IScanner接口扫描代码,然后经由过程IBuffer接口间接修正代码
2.经由过程遍历和编纂AST树举行布局化的修正
DeveloperWorks供应的文章《扩大Eclipse的Java开辟工具》中,给出了利用IBuffer接口的例子。如今我们要报告利用AST来遍历和修正Java源代码的办法。
AST是abstractsyntaxtree的缩写。它是Eclipse中的Java开辟情况(JDT)为我们供应的极其壮大的源代码剖析和编纂工具。
在利用AST树供应的功效之前,我们起首要创立AST树。因为AST树的构建是一项费时的操纵,JDT缺省情形下不将源代码剖析为AST树。上面的代码演示了取得一个ICompilationUnit对应的AST树的历程。在JDT供应的API中,ICompilationUnit接口用于暗示一个能够被编译的源代码文件。在我们供应的例子程序中,我们经由过程上面的代码将全部文件剖析成了一颗AST树。
清单9
ASTParserparser=ASTParser.newParser(AST.JLS3);
parser.setSource(cu);
ASTNoderoot=parser.createAST(null);
AST树中的每一个节点都是ASTNode范例,经由过程Visit形式,我们能够会见一个ASTNode包括的一切节点。上面的代码演示了会见一个AST节点并取得个中一切的MethodDeclaration节点的办法。
清单10
privatevoidgetMethods(ASTNodecuu,finalListmethods){
cuu.accept(newASTVisitor(){
publicbooleanvisit(MethodDeclarationnode){
methods.add(node);
returnfalse;
}
});
}
在搜集到了一切的MethodDeclaration节点以后,我们就能够经由过程向AST树中拔出和删除节点大概修正已有的节点的办法来修正AST树了。上面的代码演示了利用AST工具为办法增加@TestAnnotation的功效。
清单11
privatebooleancollectChanges(CompilationUnitroot,MethodDeclarationmethod){
if(method.getName().getFullyQualifiedName().startsWith("test")){
ASTast=method.getAST();
if(needTimeout){
NormalAnnotationna=ast.newNormalAnnotation();
na.setTypeName(ast.newSimpleName("Test"));
MemberValuePairpair=ast.newMemberValuePair();
pair.setName(ast.newSimpleName("timeout"));
pair.setValue(ast.newNumberLiteral("500"));
na.values().add(pair);
method.modifiers().add(0,na);
}else{
MarkerAnnotationna=ast.newMarkerAnnotation();
na.setTypeName(ast.newSimpleName("Test"));
method.modifiers().add(0,na);
}
returntrue;
}
returnfalse;
}
在Refactoring框架中,我们请求对AST树的修正其实不立即反应到源代码中。相反,我们必要一个能纪录全部修正历程的Change对象。Refactoring框架将使用这个Change对象来显现Priveiw窗口、举行Undo和Redo等操纵。大抵上,我们纪录对一个AST树的修正从而天生Change对象的历程如以下代码所示。
清单12
root.recordModifications();
//在这里修正AST树…
TextEditedits=root.rewrite(document,cu.getJavaProject()
.getOptions(true));
TextFileChangechange=newTextFileChange("",(IFile)cu
.getResource());
change.setEdit(edits);
最初,因为Refactoring类的createChange办法仅前往一个Change对象,假如我们必要对多个源代码文件举行修正,我们能够使用CompositeChange类将多个Change对象封装成一个Change对象。这个历程大概相似以下代码所实行的流程
清单13
publicChangecreateChange(IProgressMonitorpm)throwsCoreException,OperationCanceledException{
Change[]changes=newChange[fChangeManager.size()];
System.arraycopy(fChangeManager.toArray(),0,changes,0,fChangeManager.size());
CompositeChangechange=newCompositeChange("Add@OverrideAnnotation",changes);
returnchange;
}
<P> 扩大RefactoringWizard框架
Eclipse中的RefactoringWizard框架扩大了Eclipse的Wizard框架,关于Wizard框架的先容能够在Eclipse的匡助体系中找到,这里我们仅从OO计划和架构的角度切磋一下RefactoringWizard框架。
我们从Wizard相干的几个类入手下手:
1.WizardPage类
WizardPage是一个包括了多个界面元素(好比文本框Text,按钮Button)的一个界面组合部分。各个Page之间是自力的,是能够静态加载的。WizardPage类的职责有:
・组合SWT界面元素,机关出一个界面页。
・界说自己界面元素的操纵举动。
在RefactoringWizard框架中预设了两个通用的属性页:PreviewWizardPage和ErrorWizardPage。PreviewWizardPage类是用来预览重构后的修正,对照代码或其他资本的变更。ErrorWizardPage类是用来处置前提反省及毛病形态关照的。我们只需扩大RefactoringWizard框架就能够主动猎取这两项壮大的功效。
2.Wizard类
一个Wizard就是一个装载一系列WizardPage页的容器,Wizard类的职责有:
・装载一系列WizardPage,机关出一个庞大的界面。
・装载范畴类来处置详细营业逻辑。(在RefactoringWizard框架中这个类就是Refactoring类)
保护WizardPage页之间和页与范畴类之间的数据传送和形态共享。(在这里要增补一点,实在在详细RefactoringWizard框架的完成中有专门的类来分管这部分职责。)
我们的界面举动能够一成不变(经由过程组合分歧的WizardPage),而卖力处置营业逻辑的范畴类也能够自力的变更,你能够随便扩大Wizard的界面功效(-对扩大开放),而不必修正现有RefactoringWizard框架(-对修正关闭),这恰是OO计划的最基础准绳-OCP(Open-ClosePrinciple)。
3.WizardDialog类
这个对话框类的次要职责是机关一个完全的GUI界面和操纵界面。它预设了一些按钮(Back,Next,Finish,Cancel)等界面元素,它卖力装载Wizard类,操纵时经由过程按钮Back、Next来在多个WizardPage之间切换。
上面我们给出RefactoringWizard框架的架构图:
RefactoringWizard架构图
从中我们能够看到,假如我们把每个WizardPage页看做一项营业,那末Refactoring恰是处置营业逻辑的把持中央,它封装了一切对营业逻辑的处置,固然它能够在将处置义务委任进来。但请注重,它其实不卖力完成营业流程,也就是说各营业(各个Page界面)之间的逻辑按次干系不由它保护。
RefactoringWizard框架充实思索到了使用的可扩大性,它在SWT的MVC(模子-视图-把持)元架构形式的基本上,增加了一些新的架构元素。MVC形式促使营业逻辑与界面分别,界面与把持举动分别,而RefactoringWizard框架加强了界面自己分别的特征,它将一个完全的界面分拆成多个页面,用户能够静态组合这些页面或增加新的页面来扩大界面举动。这类特征-界面的静态组合,低耦合,高内聚,封装优秀的接口-让我们明白到了OO计划的精华。
上面我们经由过程以下几个步骤来扩大RefactoringWizard框架:
・扩大RefactoringWizardPage
・扩大RefactoringWizard
・启动RefactoringWizard
第一步,扩大RefactoringWizardPage:起首我们新建一个类AnnotationRefactoringWizardPage,它必要承继UserInputWizardPage类(其父类是RefactoringWizardPage,而RefactoringWizardPage终极完成了IDialogPage接口)。接上去就是完成IDialogPage接口的createControl(…)办法,在这个办法里完成你的界面举动,好比我们例子中的TimeOut文本框,代码清单以下:
清单14
/**
*createcompositetoaddUIelements
*/
publicvoidcreateControl(Compositeparent){
//defineUI
Compositecomposite=newComposite(parent,SWT.NONE);
GridLayoutlay=newGridLayout();
lay.numColumns=2;
composite.setLayout(lay);
btnCheck=newButton(composite,SWT.CHECK);
btnCheck.setText("Addtimeoutparameter");
GridDatagdBtnCheck=newGridData();
gdBtnCheck.horizontalSpan=2;
gdBtnCheck.horizontalAlignment=GridData.FILL;
btnCheck.setLayoutData(gdBtnCheck);
labName=newLabel(composite,SWT.WRAP);
labName.setText("TimeOut:");
GridDatagdLabName=newGridData();
gdLabName.horizontalAlignment=GridData.BEGINNING;
gdLabName.grabExcessHorizontalSpace=true;
labName.setLayoutData(gdLabName);
txtTimeOut=newText(composite,SWT.SINGLE|SWT.BORDER);
GridDatagdTxtTimeOut=newGridData();
gdTxtTimeOut.horizontalAlignment=GridData.END;
gdLabName.grabExcessHorizontalSpace=true;
txtTimeOut.setLayoutData(gdTxtTimeOut);
txtTimeOut.setText("500");
//initstatus
labName.setEnabled(false);
txtTimeOut.setEnabled(false);
//addlistener
defineListener();
//将composite归入框架的把持
setControl(composite);
Dialog.applyDialogFont(composite);
}
在这里我们要出格注重的一点是在界说完我们的界面元素后,必要将自界说的Composite归入框架的把持,就是这行代码:"setControl(composite);"
在我们处置完输出数据反省落后进下一页面之前,我们必要设置页面完成的形态,和传送输出数据到范畴类Refactoring。我们用以下代码设置好页面完成的形态后,下个页面ErrorWizardPage就会处置显现逻辑:
清单15
privatevoidnotifyStatus(booleanvalid,Stringmessage){
//设置毛病信息
setErrorMessage(message);
//设置页面完成形态
setPageComplete(valid);
}
传送输出数据经由过程以下代码来处置:
清单16
privatevoidsetRefactoring(booleanselection,Stringtext){
AnnotationRefactoringrefactoring=(AnnotationRefactoring)getRefactoring();
refactoring.setNeedTimeout(true);
if(selection){
refactoring.setTimeout(Integer.valueOf(txtTimeOut.getText()).intValue());
}
}
个中getRefactoring()办法是承继自RefactoringWizardPage的办法,因为我们的RefactoringWizard类装载了RefactoringWizardPage和Refactoring类,这个办法是从RefactoringWizard类中取得的,这内里用到了Observer计划形式。至此,我们完成RefactoringWizardPage的扩大。
第二步,扩大RefactoringWizard:起首我们新建一个类AnnotationRefactoringWizard,它必要承继RefactoringWizard类,这个类中我们只必要加载界说好的AnnotationRefactoringWizardPage类和AnnotationRefactoring类,固然庞大的处置已有RefactoringWizard框架处置好了。上面我们在机关函数中加载Refactoring类:
清单17
publicAnnotationRefactoringWizard(Refactoringrefactoring){
super(refactoring,WIZARD_BASED_USER_INTERFACE);
}
然后我们加载我们的AnnotationRefactoringWizardPage类,只需重载父类RefactoringWizard的addUserInputPages()办法就能够:
清单18
protectedvoidaddUserInputPages(){
page=newAnnotationRefactoringWizardPage("refactorannotation");
addPage(page);
}
第三步,启动RefactoringWizard。扩大好RefactoringWizard以后,就必要在用户点击菜单项或是按钮时弹出这个对话框。RefactoringWizard最好利用RefactoringWizardOpenOperation类来翻开(固然也能够用RefactoringWizardDialog)。RefactoringWizardOpenOperation起首举行重构的初始反省,经由过程后才翻开RefactoringWinzard对话框,不然就会翻开毛病对话框。后面完成创立插件工程时我们提到,弹出RefactoringWizard对话框的代码应当放到呼应菜单操纵的类的run函数中。详细到本文工程中,就是把上面的代码放到AnnotationManageAction的run函数中。这些代码起首顺次机关Refactoring和RefacoringWizard子类AnnotationRefactoring和AnnotationRefactoringWizard,并将AnnotationRefactoring的援用传送给AnnotationRefactoringWizard,然后用RefactoringWizardOpenOperation翻开AnnotationRefactoringWizard,弹出导游对话框。
清单19
publicvoidrun(IActionaction){
Shellshell=window.getShell();
AnnotationRefactoringrefactor=newAnnotationRefactoring(select);
AnnotationRefactoringWizardwizard=newAnnotationRefactoringWizard(refactor);
RefactoringWizardOpenOperationop=newRefactoringWizardOpenOperation(wizard);
try{
op.run(shell,"Inserting@OverrideAnnotation");
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
小结
在Eclipse中无效的使用重构可以年夜年夜的加重软件开辟职员的事情包袱,进步软件的强健性。但是,今朝重构仍旧处在一个工具缺少的时期。以Eclipse为例,只要JDT供应的重构工具最为完美,而针对其他言语比方C++、Python等的开辟情况,都缺少对应的重构功效。经由过程本文供应的办法,我们可以无效的使用Eclipse中的重构框架创立新的重构,从而进一步进步已有开辟情况的效力。
在1995年5月23日以“Java”的名称正式发布了。 |
|