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

首頁 > 編程 > Delphi > 正文

如何將界面代碼和功能代碼分離(基于Delphi/VCL)

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

    很多朋友看了上次我寫的“創(chuàng)建良好設(shè)計(jì)的代碼(基于Delphi/VCL)”后,對我說感覺上可以接受其中的觀點(diǎn),但似乎說得太簡單,不夠具體;也有的朋友對其中的一個(gè)小例子有些異議。因此便有了此文。

    上次,我舉的例子是這樣的:假設(shè)要從某處獲得一個(gè)字符串列表,然后顯示于 TListBox 中,我所推崇的代碼是:
    ObjectXXX := TObjectXXX.Create;
    ListBox1.Items := ObjectXXX.GetStringList;
    ObjectXXX.Free;
    的確,我承認(rèn),單純從這三行代碼來看,似乎有了“濫用對象”之嫌。也許是例子過于簡單,給人的感覺是TObjectXXX只有GetStringList這一個(gè)public成員函數(shù),如果真的這樣的話,那可真是“濫用對象”了。類是對對象的抽象,而對象是由狀態(tài)和操作(也就是數(shù)據(jù)和對數(shù)據(jù)的操作)的集合組成。因此,沒有狀態(tài)的對象不是對象!沒有私有數(shù)據(jù)成員的類的設(shè)計(jì)是失敗的設(shè)計(jì)(那不是類,而是接口了)。

    好,下面我就舉一個(gè)詳細(xì)的例子來說明,如何將界面代碼和功能代碼分離。
    假設(shè)我要做一個(gè)簡單的個(gè)人通訊錄管理軟件,很顯然,整個(gè)軟件分為兩部分:一部分是面象用戶的,也就是所謂界面部分,我可以提供四個(gè)按鈕(分別為“添加”、“刪除”、“修改”、“查找”)和一個(gè)編輯框(顯示通訊錄信息和接受用戶輸入)用于和用戶交互;另一部分是功能化的,也就是軟件內(nèi)部的對于通訊錄的存取操作。
    于是,有了一個(gè)TAddrBook類,它是對功能化部分的抽象。
    TAddrBook = class
    PRivate
        //一些私有成員
    public
        constructor Create;
        destructor Destroy;override;
        GetCount: Integer;
        FindRecord(strString): Integer;
        GetRecord(nIndex:Integer): String;
        SetRecord(nIndex:integer; strRec:String): Boolean;
        AddRecord(strRec:String): Boolean;
        DelRecord(nIndex): Boolean;
        //其它共有成員函數(shù)
    end;
    私有成員之所以無法確定,主要是取決于這個(gè)類的實(shí)現(xiàn)。
   
    如此,可以將對通訊錄的存取操作的邏輯封裝。而界面部分的代碼不會(huì)涉及到這些存取邏輯。界面部分代碼如下:
    var
      Form1: TForm1;
      AddrBook: TAddrBook;
      nCurRec: Integer;

    implementation   
   
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        AddrBook := TAddrBook.Create;
        nCurRec := AddrBook.GetCount;
    end;

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
        AddrBook.Free;
    end;
   
    //添加按鈕
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        if not AddrBook.AddRecord(memo1.Text) then
            ShowMessage("error");
    end;
   
    //刪除按鈕
    procedure TForm1.Button2Click(Sender: TObject);
    begin
        if not AddrBook.DelRecord(nCurRec) then
            ShowMessage("error");
    end;
   
    //修改按鈕
    procedure TForm1.Button3Click(Sender: TObject);
    begin
        if not AddrBook.SetRecord(nCurRec, memo1.Text) then
            ShowMessage("error");
    end;
   
    //查找按鈕
    procedure TForm1.Button4Click(Sender: TObject);
    begin
        memo1.Text := AddrBook.GetRecord(AddrBook.FindRecord(memo1.Text));
    end;
   
    以上界面部分的代碼,不涉及任何存取邏輯,每個(gè)模塊的代碼簡單,易懂,便于維護(hù)。而實(shí)際上,該通訊錄是使用數(shù)據(jù)庫保存還是用文本文件來保存,界面代碼都不知道;使用數(shù)據(jù)庫的話,是通過ODBC還是ADO還是BDE訪問數(shù)據(jù)庫,界面代碼也不知道。實(shí)際上,這些存取邏輯的東西取決于TAddrBook類的實(shí)現(xiàn),TAddrBook類的實(shí)現(xiàn)可以單獨(dú)的放在一個(gè).pas文件中,對TAddrBook類的實(shí)現(xiàn)的任何更改,都不會(huì)影響界面部分。維護(hù)代碼的時(shí)候,將更改局限于某一個(gè)模塊中的做法是非常明智的。
   
   
Nicrosoft(nicrosoft@sunistudio.com) 于 2001.7.14


上一篇:DELPHI的原子世界(2)

下一篇:在Delphi的DBGrid中插入其他可視組件

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 东安县| 天峨县| 汾阳市| 岑溪市| 靖宇县| 德昌县| 沂源县| 红安县| 房山区| 定襄县| 浦东新区| 溧水县| 巴楚县| 河源市| 上杭县| 新闻| 合川市| 石台县| 吴川市| 崇文区| 安达市| 淳安县| 梅河口市| 定西市| 永济市| 刚察县| 黔东| 陕西省| 安溪县| 瑞昌市| 阿克| 凤凰县| 三河市| 临高县| 武城县| 揭东县| 永修县| 邹平县| 九龙城区| 南部县| 朝阳县|