官术网_书友最值得收藏!

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;
主站蜘蛛池模板: 宜宾市| 西乌珠穆沁旗| 吴堡县| 山西省| 金坛市| 都江堰市| 安西县| 子洲县| 乐安县| 邳州市| 加查县| 石景山区| 黄浦区| 进贤县| 苏尼特右旗| 洛南县| 积石山| 平潭县| 镇江市| 新兴县| 资阳市| 盈江县| 云安县| 当阳市| 东乡族自治县| 峨眉山市| 临城县| 达州市| 桐柏县| 乌鲁木齐市| 呼伦贝尔市| 弥勒县| 金门县| 桑日县| 邵阳县| 临沂市| 自治县| 普定县| 普定县| 天柱县| 日喀则市|