[转载]在Eclipse中扩展RefactoringWizard 框架

在Eclipse中扩展RefactoringWizard 框架
扩展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框架的架构图:
  
     2005.12.8.10.57.48.11.1.gif
  图 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中的重构框架创建新的重构,从而进一步提高已有开发环境的效率。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-131423/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/374079/viewspace-131423/

基于STM32F407,使用DFS算法实现最短迷宫路径检索,分为三种模式:1.DEBUG模式,2. 训练模式,3. 主程序模式 ,DEBUG模式主要分析bug,测量必要数据,训练模式用于DFS算法训练最短路径,并将最短路径以链表形式存储Flash, 主程序模式从Flash….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计,皆可应用在项目、毕业设计、课程设计、期末/期/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值