a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > 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)注

主站蜘蛛池模板: 精品综合久久久 | 在线观看欧美成人 | 欧美a区| 久久久久黄色 | 婷婷亚洲五月 | 粉嫩视频在线观看 | 欧美日本一区视频免费 | 一级视频在线观看 | av在线一区二区三区 | 欧美午夜视频在线观看 | 免费v片| 超碰网址 | 国产精品国产精品国产专区不片 | www.久久.com | 欧美性生活视频 | 一级在线观看 | 国产精品 日韩 | 超碰999| 成人小视频在线观看 | 奇米色欧美一区二区三区 | 精品一区二区三区免费 | 国产精品久久久久久久久免费丝袜 | 999国内精品永久免费视频 | 中文字幕一区二区在线观看 | 国产精品精品视频 | 国产日韩av在线 | 国产片一区二区三区 | 在线观看亚洲大片短视频 | 国产精彩视频 | 国产女人和拘做受视频 | 一本色道| 视频一区二区三区在线观看 | 99久视频| 成人教育av | 日韩视频在线观看视频 | 91亚洲视频 | 日本一区二区三区四区 | av毛片 | 九九热九九 | 欧美极品一区二区 | 天天操天天碰 |