国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

在Eclipse中擴(kuò)展RefactoringWizard 框架

2019-11-18 13:02:13
字體:
供稿:網(wǎng)友

  擴(kuò)展RefactoringWizard 框架
  

  Eclipse中的RefactoringWizard框架擴(kuò)展了Eclipse的Wizard框架,關(guān)于Wizard框架的介紹可以在Eclipse的幫助系統(tǒng)中找到,這里我們僅從OO設(shè)計和架構(gòu)的角度探討一下RefactoringWizard框架。
  
  我們從Wizard相關(guān)的幾個類開始:
  
  1. WizardPage類
  
  WizardPage是一個包含了多個界面元素(比如文本框Text,按鈕Button)的一個界面組合部分。各個Page之間是獨(dú)立的,是可以動態(tài)加載的。WizardPage類的職責(zé)有:
  
  ·組合SWT界面元素,構(gòu)造出一個界面頁。
  
  ·定義本身界面元素的操作行為。
  
  在RefactoringWizard框架中預(yù)設(shè)了兩個通用的屬性頁:PReviewWizardPage和ErrorWizardPage。PreviewWizardPage類是用來預(yù)覽重構(gòu)后的修改,對比代碼或其他資源的變化。ErrorWizardPage類是用來處理條件檢查及錯誤狀態(tài)通知的。我們只需擴(kuò)展RefactoringWizard框架就可以自動獲取這兩項強(qiáng)大的功能。
  
  2. Wizard類
  
  一個Wizard就是一個裝載一系列WizardPage頁的容器,Wizard類的職責(zé)有:
  
  ·裝載一系列WizardPage,構(gòu)造出一個復(fù)雜的界面。
  
  ·裝載領(lǐng)域類來處理具體業(yè)務(wù)邏輯。(在RefactoringWizard框架中這個類就是Refactoring類)
  
  維護(hù)WizardPage頁之間以及頁與領(lǐng)域類之間的數(shù)據(jù)傳遞和狀態(tài)共享。(在這里要補(bǔ)充一點(diǎn),其實在具體RefactoringWizard框架的實現(xiàn)中有專門的類來分擔(dān)這部分職責(zé)。)
  
  我們的界面行為可以千變?nèi)f化(通過組合不同的WizardPage),而負(fù)責(zé)處理業(yè)務(wù)邏輯的領(lǐng)域類也可以獨(dú)立的變化,你可以隨意擴(kuò)展Wizard的界面功能(-對擴(kuò)展開放),而不用修改現(xiàn)有RefactoringWizard框架(-對修改封閉),這正是OO設(shè)計的最基本原則-OCP(Open-Close Principle)。
  
  3. WizardDialog類
  
  這個對話框類的主要職責(zé)是構(gòu)造一個完整的GUI界面以及操作界面。它預(yù)設(shè)了一些按鈕(Back,Next,Finish,Cancel)等界面元素,它負(fù)責(zé)裝載Wizard類,操作時通過按鈕Back、Next來在多個WizardPage之間切換。
  
  下面我們給出RefactoringWizard框架的架構(gòu)圖:
  
  
 在Eclipse中擴(kuò)展RefactoringWizard 框架
  圖 5 Refactoring Wizard架構(gòu)圖

  
  從圖 5中我們可以看到,假如我們把每一個WizardPage頁看作一項業(yè)務(wù),那么Refactoring正是處理業(yè)務(wù)邏輯的控制中心,它封裝了所有對業(yè)務(wù)邏輯的處理,當(dāng)然它可以在將處理任務(wù)委任出去。但請注重,它并不負(fù)責(zé)實現(xiàn)業(yè)務(wù)流程,也就是說各業(yè)務(wù)(各個Page界面)之間的邏輯順序關(guān)系不由它維護(hù)。
  
  RefactoringWizard框架充分考慮到了應(yīng)用的可擴(kuò)展性,它在SWT的MVC(模型-視圖-控制)元架構(gòu)模式的基礎(chǔ)上,添加了一些新的架構(gòu)元素。MVC模式促使業(yè)務(wù)邏輯與界面分離,界面與控制行為分離,而RefactoringWizard框架增強(qiáng)了界面本身分離的特性,它將一個完整的界面分拆成多個頁面,用戶可以動態(tài)組合這些頁面或添加新的頁面來擴(kuò)展界面行為。這種特性-界面的動態(tài)組合,低耦合,高內(nèi)聚,封裝良好的接口-讓我們領(lǐng)略到了OO設(shè)計的精髓。
  
  下面我們通過以下幾個步驟來擴(kuò)展RefactoringWizard框架:
  
  ·擴(kuò)展RefactoringWizardPage
  
  ·擴(kuò)展RefactoringWizard
  
  ·啟動RefactoringWizard
  
  第一步,擴(kuò)展RefactoringWizardPage:首先我們新建一個類AnnotationRefactoringWizardPage,它需要繼續(xù)UserInputWizardPage類(其父類是RefactoringWizardPage,而RefactoringWizardPage最終實現(xiàn)了IDialogPage接口)。接下來就是實現(xiàn)IDialogPage接口的createControl(…)方法,在這個方法里實現(xiàn)你的界面行為,比如我們例子中的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);
  }
  
  在這里我們要非凡注重的一點(diǎn)是在定義完我們的界面元素后,需要將自定義的Composite納入框架的控制,就是這行代碼:"setControl(composite);"
  
  在我們處理完輸入數(shù)據(jù)檢查后進(jìn)入下一頁面之前,我們需要設(shè)置頁面完成的狀態(tài),以及傳遞輸入數(shù)據(jù)到領(lǐng)域類Refactoring。我們用以下代碼設(shè)置好頁面完成的狀態(tài)后,下個頁面ErrorWizardPage就會處理顯示邏輯:
  
  清單 15
  
  private void notifyStatus(boolean valid, String message) {
  //設(shè)置錯誤信息
  setErrorMessage(message);
  //設(shè)置頁面完成狀態(tài)
  setPageComplete(valid);
  }
  
  傳遞輸入數(shù)據(jù)通過以下代碼來處理:
  
  清單 16
  
  private void setRefactoring(boolean selection, String text) {
  AnnotationRefactoring refactoring = (AnnotationRefactoring) getRefactoring();
  refactoring.setNeedTimeout(true);
  if(selection) {
  refactoring.setTimeout(Integer.valueOf(txtTimeOut.getText()).intValue());
  }
  }
  
  其中g(shù)etRefactoring()方法是繼續(xù)自RefactoringWizardPage的方法,由于我們的RefactoringWizard類裝載了RefactoringWizardPage和Refactoring類,這個方法是從RefactoringWizard類中獲得的,這里面用到了Observer設(shè)計模式。至此,我們完成RefactoringWizardPage的擴(kuò)展。
  
  第二步,擴(kuò)展RefactoringWizard:首先我們新建一個類AnnotationRefactoringWizard,它需要繼續(xù)RefactoringWizard類,這個類中我們只需要加載定義好的AnnotationRefactoringWizardPage類和AnnotationRefactoring類,當(dāng)然復(fù)雜的處理已經(jīng)有RefactoringWizard框架處理好了。下面我們在構(gòu)造函數(shù)中加載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。擴(kuò)展好RefactoringWizard之后,就需要在用戶點(diǎn)擊菜單項或是按鈕時彈出這個對話框。RefactoringWizard最好使用RefactoringWizardOpenOperation類來打開(當(dāng)然也可以用RefactoringWizardDialog)。RefactoringWizardOpenOperation首先進(jìn)行重構(gòu)的初始檢查,通過后才打開RefactoringWinzard對話框,否則就會打開錯誤對話框。前面完成創(chuàng)建插件工程時我們提到,彈出RefactoringWizard對話框的代碼應(yīng)該放到響應(yīng)菜單操作的類的run函數(shù)中。具體到本文工程中,就是把下面的代碼放到AnnotationManageAction的run函數(shù)中。這些代碼首先依次構(gòu)造Refactoring和RefacoringWizard子類AnnotationRefactoring和AnnotationRefactoringWizard,并將AnnotationRefactoring的引用傳遞給AnnotationRefactoringWizard,然后用RefactoringWizardOpenOperation打開AnnotationRefactoringWizard,彈出向?qū)υ捒颉?br />  
  清單 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();
  }
  }
  
  小結(jié)
  
  在Eclipse中有效的利用重構(gòu)能夠大大的減輕軟件開發(fā)人員的工作負(fù)擔(dān),提高軟件的健壯性。然而,目前重構(gòu)仍然處在一個工具缺乏的時代。以Eclipse為例,只有JDT提供的重構(gòu)工具最為完善,而針對其他語言例如C++、Python等的開發(fā)環(huán)境,都缺乏對應(yīng)的重構(gòu)功能。 通過本文提供的方法,我們能夠有效的利用Eclipse中的重構(gòu)框架創(chuàng)建新的重構(gòu),從而進(jìn)一步提高已有開發(fā)環(huán)境的效率。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 鱼台县| 平昌县| 怀远县| 大埔县| 城步| 铜川市| 兴和县| 酒泉市| 河西区| 博乐市| 望谟县| 滕州市| 泾川县| 馆陶县| 磴口县| 乌兰察布市| 永顺县| 苗栗县| 乌恰县| 博白县| 靖州| 聂荣县| 高州市| 句容市| 阳朔县| 柳河县| 密云县| 济源市| 慈溪市| 轮台县| 山西省| 正镶白旗| 德化县| 扬州市| 宿州市| 建德市| 登封市| 斗六市| 鸡泽县| 绥宁县| 通江县|