分享
 
 
 

在Eclipse中扩展RefactoringWizard框架

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

扩展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-Close Principle)。

3. WizardDialog类

这个对话框类的主要职责是构造一个完整的GUI界面以及操作界面。它预设了一些按钮(Back,Next,Finish,Cancel)等界面元素,它负责装载Wizard类,操作时通过按钮Back、Next来在多个WizardPage之间切换。

下面我们给出RefactoringWizard框架的架构图:

图 5 Refactoring Wizard架构图

从图 5中我们可以看到,如果我们把每一个WizardPage页看作一项业务,那么Refactoring正是处理业务逻辑的控制中心,它封装了所有对业务逻辑的处理,当然它可以在将处理任务委任出去。但请注意,它并不负责实现业务流程,也就是说各业务(各个Page界面)之间的逻辑顺序关系不由它维护。

RefactoringWizard框架充分考虑到了应用的可扩展性,它在SWT的MVC(模型-视图-控制)元架构模式的基础上,添加了一些新的架构元素。MVC模式促使业务逻辑与界面分离,界面与控制行为分离,而RefactoringWizard框架增强了界面本身分离的特性,它将一个完整的界面分拆成多个页面,用户可以动态组合这些页面或添加新的页面来扩展界面行为。这种特性-界面的动态组合,低耦合,高内聚,封装良好的接口-让我们领略到了OO设计的精髓。

下面我们通过以下几个步骤来扩展RefactoringWizard框架:

?扩展RefactoringWizardPage

?扩展RefactoringWizard

?启动RefactoringWizard

第一步,扩展RefactoringWizardPage:首先我们新建一个类AnnotationRefactoringWizardPage,它需要继承UserInputWizardPage类(其父类是RefactoringWizardPage,而RefactoringWizardPage最终实现了IDialogPage接口)。接下来就是实现IDialogPage接口的createControl(…)方法,在这个方法里实现你的界面行为,比如我们例子中的TimeOut文本框,代码清单如下:

清单 14

/**

* create composite to add UI elements

*/

public void createControl(Composite parent) {

// define UI

Composite composite = new Composite(parent, SWT.NONE);

GridLayout lay = new GridLayout();

lay.numColumns = 2;

composite.setLayout(lay);

btnCheck = new Button(composite, SWT.CHECK);

btnCheck.setText("Add timeout parameter");

GridData gdBtnCheck = new GridData();

gdBtnCheck.horizontalSpan = 2;

gdBtnCheck.horizontalAlignment = GridData.FILL;

btnCheck.setLayoutData(gdBtnCheck);

labName = new Label(composite, SWT.WRAP);

labName.setText("TimeOut:");

GridData gdLabName = new GridData();

gdLabName.horizontalAlignment = GridData.BEGINNING;

gdLabName.grabExcessHorizontalSpace = true;

labName.setLayoutData(gdLabName);

txtTimeOut = new Text(composite, SWT.SINGLE | SWT.BORDER);

GridData gdTxtTimeOut = new GridData();

gdTxtTimeOut.horizontalAlignment = GridData.END;

gdLabName.grabExcessHorizontalSpace = true;

txtTimeOut.setLayoutData(gdTxtTimeOut);

txtTimeOut.setText("500");

// init status

labName.setEnabled(false);

txtTimeOut.setEnabled(false);

// add listener

defineListener();

// 将composite纳入框架的控制

setControl(composite);

Dialog.applyDialogFont(composite);

}

在这里我们要特别注意的一点是在定义完我们的界面元素后,需要将自定义的Composite纳入框架的控制,就是这行代码:"setControl(composite);"

在我们处理完输入数据检查后进入下一页面之前,我们需要设置页面完成的状态,以及传递输入数据到领域类Refactoring。我们用以下代码设置好页面完成的状态后,下个页面ErrorWizardPage就会处理显示逻辑:

清单 15

private void notifyStatus(boolean valid, String message) {

//设置错误信息

setErrorMessage(message);

//设置页面完成状态

setPageComplete(valid);

}

传递输入数据通过以下代码来处理:

清单 16

private void setRefactoring(boolean selection, String text) {

AnnotationRefactoring refactoring = (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

public AnnotationRefactoringWizard(Refactoring refactoring) {

super(refactoring, WIZARD_BASED_USER_INTERFACE);

}

然后我们加载我们的AnnotationRefactoringWizardPage类,只需重载父类RefactoringWizard的addUserInputPages()方法就可以:

清单 18

protected void addUserInputPages() {

page = new AnnotationRefactoringWizardPage("refactor annotation");

addPage(page);

}

第三步,启动RefactoringWizard。扩展好RefactoringWizard之后,就需要在用户点击菜单项或是按钮时弹出这个对话框。RefactoringWizard最好使用RefactoringWizardOpenOperation类来打开(当然也可以用RefactoringWizardDialog)。RefactoringWizardOpenOperation首先进行重构的初始检查,通过后才打开RefactoringWinzard对话框,否则就会打开错误对话框。前面完成创建插件工程时我们提到,弹出RefactoringWizard对话框的代码应该放到响应菜单操作的类的run函数中。具体到本文工程中,就是把下面的代码放到AnnotationManageAction的run函数中。这些代码首先依次构造Refactoring和RefacoringWizard子类AnnotationRefactoring和AnnotationRefactoringWizard,并将AnnotationRefactoring的引用传递给AnnotationRefactoringWizard,然后用RefactoringWizardOpenOperation打开AnnotationRefactoringWizard,弹出向导对话框。

清单 19

public void run(IAction action) {

Shell shell = window.getShell();

AnnotationRefactoring refactor = new AnnotationRefactoring(select);

AnnotationRefactoringWizard wizard = new AnnotationRefactoringWizard(refactor);

RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);

try {

op.run(shell, "Inserting @Override Annotation");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

小结

在Eclipse中有效的利用重构能够大大的减轻软件开发人员的工作负担,提高软件的健壮性。然而,目前重构仍然处在一个工具缺乏的时代。以Eclipse为例,只有JDT提供的重构工具最为完善,而针对其他语言例如C++、Python等的开发环境,都缺乏对应的重构功能。 通过本文提供的方法,我们能够有效的利用Eclipse中的重构框架创建新的重构,从而进一步提高已有开发环境的效率。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有