麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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

  
  從圖 5中我們可以看到,假如我們把每一個(gè)WizardPage頁看作一項(xiàng)業(yè)務(wù),那么Refactoring正是處理業(yè)務(wù)邏輯的控制中心,它封裝了所有對業(yè)務(wù)邏輯的處理,當(dāng)然它可以在將處理任務(wù)委任出去。但請注重,它并不負(fù)責(zé)實(shí)現(xiàn)業(yè)務(wù)流程,也就是說各業(yè)務(wù)(各個(gè)Page界面)之間的邏輯順序關(guān)系不由它維護(hù)。
  
  RefactoringWizard框架充分考慮到了應(yīng)用的可擴(kuò)展性,它在SWT的MVC(模型-視圖-控制)元架構(gòu)模式的基礎(chǔ)上,添加了一些新的架構(gòu)元素。MVC模式促使業(yè)務(wù)邏輯與界面分離,界面與控制行為分離,而RefactoringWizard框架增強(qiáng)了界面本身分離的特性,它將一個(gè)完整的界面分拆成多個(gè)頁面,用戶可以動(dòng)態(tài)組合這些頁面或添加新的頁面來擴(kuò)展界面行為。這種特性-界面的動(dòng)態(tài)組合,低耦合,高內(nèi)聚,封裝良好的接口-讓我們領(lǐng)略到了OO設(shè)計(jì)的精髓。
  
  下面我們通過以下幾個(gè)步驟來擴(kuò)展RefactoringWizard框架:
  
  ·擴(kuò)展RefactoringWizardPage
  
  ·擴(kuò)展RefactoringWizard
  
  ·啟動(dòng)RefactoringWizard
  
  第一步,擴(kuò)展RefactoringWizardPage:首先我們新建一個(gè)類AnnotationRefactoringWizardPage,它需要繼續(xù)UserInputWizardPage類(其父類是RefactoringWizardPage,而RefactoringWizardPage最終實(shí)現(xiàn)了IDialogPage接口)。接下來就是實(shí)現(xiàn)IDialogPage接口的createControl(…)方法,在這個(gè)方法里實(shí)現(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)后,下個(gè)頁面ErrorWizardPage就會(huì)處理顯示邏輯:
  
  清單 15
  
  private void notifyStatus(boolean valid, String message) {
  //設(shè)置錯(cuò)誤信息
  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類,這個(gè)方法是從RefactoringWizard類中獲得的,這里面用到了Observer設(shè)計(jì)模式。至此,我們完成RefactoringWizardPage的擴(kuò)展。
  
  第二步,擴(kuò)展RefactoringWizard:首先我們新建一個(gè)類AnnotationRefactoringWizard,它需要繼續(xù)RefactoringWizard類,這個(gè)類中我們只需要加載定義好的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);
  }
  
  第三步,啟動(dòng)RefactoringWizard。擴(kuò)展好RefactoringWizard之后,就需要在用戶點(diǎn)擊菜單項(xiàng)或是按鈕時(shí)彈出這個(gè)對話框。RefactoringWizard最好使用RefactoringWizardOpenOperation類來打開(當(dāng)然也可以用RefactoringWizardDialog)。RefactoringWizardOpenOperation首先進(jìn)行重構(gòu)的初始檢查,通過后才打開RefactoringWinzard對話框,否則就會(huì)打開錯(cuò)誤對話框。前面完成創(chuàng)建插件工程時(shí)我們提到,彈出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)仍然處在一個(gè)工具缺乏的時(shí)代。以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ā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲日韩精品欧美一区二区 | 国内精品久久久久影院不卡 | 国产精品久久久久影院老司 | 欧美日韩在线免费观看 | 一级黄色国产视频 | 欧美日韩亚洲在线 | 色就操 | 91九色视频在线观看 | 成人男女免费视频 | 久久精品国产久精国产 | 爱逼爱操综合网 | 19禁国产精品福利视频 | 真人一级毛片免费 | 一级黄色影院 | 高清在线国产 | av在线免费观看不卡 | 国产精品亚洲欧美一级在线 | 国产一区视频观看 | 国产精品视频 | 美女在线观看视频一区二区 | 美女视频黄视大全视频免费网址 | 亚洲看片网 | 国产女厕一区二区三区在线视 | 国产一级毛片国产 | 欧美1区2区在线观看 | 久久久久久久久久性 | 免费黄色在线电影 | 精品在线观看一区 | 欧美另类视频在线 | 久久欧美亚洲另类专区91大神 | av电影网在线观看 | 欧日韩在线视频 | 国产精品一区二区日韩 | 精品一区二区久久久久久按摩 | av电影手机在线看 | 欧美一级黄色片在线观看 | 欧美片a | 狠狠一区二区 | 福利免费在线观看 | 精品一区二区亚洲 | 性高湖久久久久久久久aaaaa |