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

首頁 > 編程 > Delphi > 正文

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

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

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

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

    好,下面我就舉一個詳細的例子來說明,如何將界面代碼和功能代碼分離。
    假設我要做一個簡單的個人通訊錄管理軟件,很顯然,整個軟件分為兩部分:一部分是面象用戶的,也就是所謂界面部分,我可以提供四個按鈕(分別為“添加”、“刪除”、“修改”、“查找”)和一個編輯框(顯示通訊錄信息和接受用戶輸入)用于和用戶交互;另一部分是功能化的,也就是軟件內(nèi)部的對于通訊錄的存取操作。
    于是,有了一個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;
    私有成員之所以無法確定,主要是取決于這個類的實現(xiàn)。
   
    如此,可以將對通訊錄的存取操作的邏輯封裝。而界面部分的代碼不會涉及到這些存取邏輯。界面部分代碼如下:
    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;
   
    以上界面部分的代碼,不涉及任何存取邏輯,每個模塊的代碼簡單,易懂,便于維護。而實際上,該通訊錄是使用數(shù)據(jù)庫保存還是用文本文件來保存,界面代碼都不知道;使用數(shù)據(jù)庫的話,是通過ODBC還是ADO還是BDE訪問數(shù)據(jù)庫,界面代碼也不知道。實際上,這些存取邏輯的東西取決于TAddrBook類的實現(xiàn),TAddrBook類的實現(xiàn)可以單獨的放在一個.pas文件中,對TAddrBook類的實現(xiàn)的任何更改,都不會影響界面部分。維護代碼的時候,將更改局限于某一個模塊中的做法是非常明智的。
   
   
Nicrosoft([email protected]) 于 2001.7.14


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

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

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

新聞熱點

疑難解答

圖片精選

網(wǎng)友關注

主站蜘蛛池模板: 少妇一级淫片高潮流水电影 | 精品在线视频播放 | 国产欧美精品一区二区三区四区 | 欧美成人一区二区三区 | 亚洲综人网 | 曰韩在线视频 | 91九色论坛| 天天草天天干天天射 | 国产精品视频一区二区三区四 | 美国一级黄色毛片 | 哪里可以看免费的av | 欧美福利视频一区二区三区 | 91久久精品一区二区 | 日本xxxx色视频在线观看免费, | 日本在线视频一区二区三区 | lutube成人福利在线观看污 | 噜噜社 | 午夜视频在线看 | 国产成人羞羞视频在线 | 久久久久久久久成人 | 国产精品www | 成人18免费观看 | ⅴideo裸体秀hd | 久久在线 | 91av99| 国产免费一区二区三区网站免费 | 中文字幕免费播放 | 亚洲第一激情 | 国产一区二区欧美精品 | h视频免费在线观看 | china对白普通话xxxx | 黄色男女视频 | 国产精品免费一区二区 | 久久撸视频 | 国产精品久久久免费 | 国产精品三级a三级三级午夜 | 黄色免费入口 | 久久久综 | 国产精品一区网站 | 免费观看一区 | 狠狠干导航|