熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

在Eclipse中擴展RefactoringWizard 框架

2013-11-23 20:37:36  來源: Java開源技術 

  擴展RefactoringWizard 框架
  

  Eclipse中的RefactoringWizard框架擴展了Eclipse的Wizard框架關於Wizard框架的介紹可以在Eclipse的幫助系統中找到這裡我們僅從OO設計和架構的角度探討一下RefactoringWizard框架
  
  我們從Wizard相關的幾個類開始
  
   WizardPage類
  
  WizardPage是一個包含了多個界面元素(比如文本框Text按鈕Button)的一個界面組合部分各個Page之間是獨立的是可以動態加載的WizardPage類的職責有
  
  ·組合SWT界面元素構造出一個界面頁
  
  ·定義本身界面元素的操作行為
  
  在RefactoringWizard框架中預設了兩個通用的屬性頁PreviewWizardPage和ErrorWizardPagePreviewWizardPage類是用來預覽重構後的修改對比代碼或其他資源的變化ErrorWizardPage類是用來處理條件檢查及錯誤狀態通知的我們只需擴展RefactoringWizard框架就可以自動獲取這兩項強大的功能
  
   Wizard類
  
  一個Wizard就是一個裝載一系列WizardPage頁的容器Wizard類的職責有
  
  ·裝載一系列WizardPage構造出一個復雜的界面
  
  ·裝載領域類來處理具體業務邏輯(在RefactoringWizard框架中這個類就是Refactoring類)
  
  維護WizardPage頁之間以及頁與領域類之間的數據傳遞和狀態共享(在這裡要補充一點其實在具體RefactoringWizard框架的實現中有專門的類來分擔這部分職責
  
  我們的界面行為可以千變萬化(通過組合不同的WizardPage)而負責處理業務邏輯的領域類也可以獨立的變化你可以隨意擴展Wizard的界面功能(-對擴展開放)而不用修改現有RefactoringWizard框架(-對修改封閉)這正是OO設計的最基本原則-OCP(OpenClose Principle)
  
   WizardDialog類
  
  這個對話框類的主要職責是構造一個完整的GUI界面以及操作界面它預設了一些按鈕(BackNextFinishCancel)等界面元素它負責裝載Wizard類操作時通過按鈕BackNext來在多個WizardPage之間切換
  
  下面我們給出RefactoringWizard框架的架構圖
  
  
 
  圖 Refactoring Wizard架構圖

  
  從圖 中我們可以看到如果我們把每一個WizardPage頁看作一項業務那麼Refactoring正是處理業務邏輯的控制中心它封裝了所有對業務邏輯的處理當然它可以在將處理任務委任出去但請注意它並不負責實現業務流程也就是說各業務(各個Page界面)之間的邏輯順序關系不由它維護
  
  RefactoringWizard框架充分考慮到了應用的可擴展性它在SWT的MVC(模型-視圖-控制)元架構模式的基礎上添加了一些新的架構元素MVC模式促使業務邏輯與界面分離界面與控制行為分離而RefactoringWizard框架增強了界面本身分離的特性它將一個完整的界面分拆成多個頁面用戶可以動態組合這些頁面或添加新的頁面來擴展界面行為這種特性-界面的動態組合低耦合高內聚封裝良好的接口-讓我們領略到了OO設計的精髓
  
  下面我們通過以下幾個步驟來擴展RefactoringWizard框架
  
  ·擴展RefactoringWizardPage
  
  ·擴展RefactoringWizard
  
  ·啟動RefactoringWizard
  
  第一步擴展RefactoringWizardPage首先我們新建一個類AnnotationRefactoringWizardPage它需要繼承UserInputWizardPage類(其父類是RefactoringWizardPage而RefactoringWizardPage最終實現了IDialogPage接口)接下來就是實現IDialogPage接口的createControl(…)方法在這個方法裡實現你的界面行為比如我們例子中的TimeOut文本框代碼清單如下
  
  清單
  
  /**
  * create composite to add UI elements
  */
  public void createControl(Composite parent) {
  // define UI
  Composite composite = new Composite(parent SWTNONE);
  GridLayout lay = new GridLayout();
  laynumColumns = ;
  compositesetLayout(lay);
  
  btnCheck = new Button(composite SWTCHECK);
  btnChecksetText(Add timeout parameter);
  GridData gdBtnCheck = new GridData();
  gdBtnCheckhorizontalSpan = ;
  gdBtnCheckhorizontalAlignment = GridDataFILL;
  btnChecksetLayoutData(gdBtnCheck);
  
  labName = new Label(composite SWTWRAP);
  labNamesetText(TimeOut:);
  GridData gdLabName = new GridData();
  gdLabNamehorizontalAlignment = GridDataBEGINNING;
  gdLabNamegrabExcessHorizontalSpace = true;
  labNamesetLayoutData(gdLabName);
  
  txtTimeOut = new Text(composite SWTSINGLE | SWTBORDER);
  GridData gdTxtTimeOut = new GridData();
  gdTxtTimeOuthorizontalAlignment = GridDataEND;
  gdLabNamegrabExcessHorizontalSpace = true;
  txtTimeOutsetLayoutData(gdTxtTimeOut);
  txtTimeOutsetText();
  
  // init status
  labNamesetEnabled(false);
  txtTimeOutsetEnabled(false);
  // add listener
  defineListener();
  
  // 將composite納入框架的控制
  setControl(composite);
  DialogapplyDialogFont(composite);
  }
  
  在這裡我們要特別注意的一點是在定義完我們的界面元素後需要將自定義的Composite納入框架的控制就是這行代碼setControl(composite);
  
  在我們處理完輸入數據檢查後進入下一頁面之前我們需要設置頁面完成的狀態以及傳遞輸入數據到領域類Refactoring我們用以下代碼設置好頁面完成的狀態後下個頁面ErrorWizardPage就會處理顯示邏輯
  
  清單
  
  private void notifyStatus(boolean valid String message) {
  //設置錯誤信息
  setErrorMessage(message);
  //設置頁面完成狀態
  setPageComplete(valid);
  }
  
  傳遞輸入數據通過以下代碼來處理
  
  清單
  
  private void setRefactoring(boolean selection String text) {
  AnnotationRefactoring refactoring = (AnnotationRefactoring) getRefactoring();
  refactoringsetNeedTimeout(true);
  if(selection) {
  refactoringsetTimeout(IntegervalueOf(txtTimeOutgetText())intValue());
  }
  }
  
  其中getRefactoring()方法是繼承自RefactoringWizardPage的方法由於我們的RefactoringWizard類裝載了RefactoringWizardPage和Refactoring類這個方法是從RefactoringWizard類中獲得的這裡面用到了Observer設計模式至此我們完成RefactoringWizardPage的擴展
  
  第二步擴展RefactoringWizard首先我們新建一個類AnnotationRefactoringWizard它需要繼承RefactoringWizard類這個類中我們只需要加載定義好的AnnotationRefactoringWizardPage類和AnnotationRefactoring類當然復雜的處理已經有RefactoringWizard框架處理好了下面我們在構造函數中加載Refactoring類
  
  清單
  
  public AnnotationRefactoringWizard(Refactoring refactoring) {
  super(refactoring WIZARD_BASED_USER_INTERFACE);
  }
  
  然後我們加載我們的AnnotationRefactoringWizardPage類只需重載父類RefactoringWizard的addUserInputPages()方法就可以
  
  清單
  
  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彈出向導對話框
  
  清單
  
  public void run(IAction action) {
  Shell shell = windowgetShell();
  
  AnnotationRefactoring refactor = new AnnotationRefactoring(select);
  AnnotationRefactoringWizard wizard = new AnnotationRefactoringWizard(refactor);
  RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
  try {
  oprun(shell Inserting @Override Annotation);
  } catch (InterruptedException e) {
  eprintStackTrace();
  }
  }
  
  小結
  
  在Eclipse中有效的利用重構能夠大大的減輕軟件開發人員的工作負擔提高軟件的健壯性然而目前重構仍然處在一個工具缺乏的時代以Eclipse為例只有JDT提供的重構工具最為完善而針對其他語言例如C++Python等的開發環境都缺乏對應的重構功能 通過本文提供的方法我們能夠有效的利用Eclipse中的重構框架創建新的重構從而進一步提高已有開發環境的效率
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28785.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.