- 基于敏捷開發的數據結構研究
- 黃復賢著
- 1243字
- 2018-12-27 20:11:14
2.2 開發過程與方法
2.2.1 面向對象的界面接口設計
可視化編程環境提供了豐富的可視控件,大大簡化了界面設計的難度,但編程者容易陷入過程化設計的泥潭,我們根據面向對象的思想,讓界面與實現分離。
根據分析設計界面類,界面類成員主要由可視控件構成,根據簡單原則,主要選用表格控件來顯示簡單變量值的變化、數組的值的變化及系統工作棧的變化,另設置一個圖像控件用來顯示圖形,并設置“開始”命令按鈕完成演示類的生成,對演示類進行初始化。“開始”命令按鈕還完成如下功能:檢查演示的輸入是否合法,調用算法執行類,完成算法的執行過程,并產生腳本文件?!皢尾健眻绦邪粹o調用演示類的解釋腳本行功能,實現算法的過程模擬與演示。另外,利用計時器控件可以實現自動演示,這只要在timer事件中調用單步執行即可。
2.2.2 迭代與重構
演示類的主要功能就是以行為單位從文本文件中讀取腳本行,對腳本進行解釋。核心模塊用來實現對腳本的解釋功能,這在開發的過程中不可能一次就設計好,需要在開發中不斷迭代和重構逐步完善。
對指針類型需要用圖示方式進行演示,結點類型有多種情況,從線性鏈表到廣義表再到二叉樹,它們的相同點是都有兩類域,不同點是域名不同,通過迭代和重構,模擬內存分配,我們分別設計出結點的申請、釋放和對域的賦值三個方法。最終形成以下方法:
procedure newnode(vname: string; fn: integer);
//按結點結構分配內存單元,vname為指針變量名,fn為結點域數
function getadd(vname:string):integer; //返回vname所指結點的行號
function getfieldvalue(vname: string; fn: integer):string;
//返回vname所指結點的fieldname域的值
procedure setdatavalue(vname: string; fn: integer; value:string);
//設置vname所指結點的fn數據域的值,并圖示
procedure setpointvalue(vname: string; fn: integer; value:string);
//設置vname所指結點的fn指針域的值,并圖示
procedure cleargraph; //清除圖形顯示區
procedure initmemo; //初始化指針類型的內存數據
procedure freenode(vname:string); //釋放結點
procedure ptop(pexp,qexp:string); //指針值傳遞
procedure drawnode(i:integer); //在圖形區顯示地址為i的結點
procedure drawarrow(x1,y1,x2,y2:integer); //顯示指針的指向
procedure setnewnodexy(x,y:integer); //設置下一個結點的位置
經過迭代與重構,系統的架構已經清晰,利用模板設計模式,在類型說明中設置一個關于演示類demo的類引用說明:ttdemo=class of demo,在選擇了執行類的目錄后,由類名生成具體的子類。把演示類的基類中不能實現的方法說明為如下所述的抽象虛方法:
function runprogram(no:integer):boolean;virtual;abstract;
//為在子類中執行選定算法的程序產生腳本
function inputok(no:integer):boolean;virtual;abstract;
//根據不同算法的要求進行輸入合法性檢查
procedure drawspecial(tobj:timage;s:string); virtual;abstract;
//把圖形控件對象和特殊顯示字符串傳給子類,在圖形顯示控件對象上繪制具體圖形
2.2.3 測試驅動
測試是一種驗證行為,更是一種設計行為。在開發軟件的初期,編寫腳本可以起到測試用例的作用,在以后的重構中,都要使以前的腳本通過才可以。在開發過程中,可以結合自動測試工具和基于腳本的可視化實現自動測試。另外,測試用腳本還能起到使用說明文檔的作用,始終記錄最新的變化。
2.2.4 開發過程的線性化
敏捷開發強調開發過程的線性化,即使到了開發后期工作進度也不會減慢,工作內容也不會變得越來越大而無法完成。在本軟件的開發中,一旦完成了演示類,后面的工作是在基類的基礎上進行繼承和擴展,對前面代碼只在合適時機進行重構,能隨時集成及運行。新增的類都可基于以下模板編寫代碼:
ex = class(demo) private f: text; public function inputok(no:integer): Boolean; override; procedure outprogram(no:integer);//輸出算法演示文本 function runprogram(no:integer): Boolean; override; //在此處可以增加一批新的要演示的算法執行程序 end;