全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1550
推到 Plurk!
推到 Facebook!

如何將界面代碼和功能代碼分離

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-09-06 12:11:26 IP:163.31.xxx.xxx 未訂閱

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

作者:Nicrosoft ------------------------------------------------------------------------------- 很多朋友看了上次我寫的“創建良好設計的代碼(基于Delphi/VCL)”后,對我說感覺上可以接受其中的觀點,但似乎說得太簡單,不夠具體;也有的朋友對其中的一個小例子有些異議。因此便有了此文。 上次,我舉的例子是這樣的:假設要從某處獲得一個字符串列表,然后顯示于 TListBox 中,我所推崇的代碼是:
 
   ObjectXXX := TObjectXXX.Create; 
   ListBox1.Items := ObjectXXX.GetStringList; 
   ObjectXXX.Free; 
的確,我承認,單純從這三行代碼來看,似乎有了“濫用對象”之嫌。也許是例子過于簡單,給人的感覺是TObjectXXX只有GetStringList這一個public成員函數,如果真的這樣的話,那可真是“濫用對象”了。類是對對象的抽象,而對象是由狀態和操作(也就是數據和對數據的操作)的集合組成。因此,沒有狀態的對象不是對象!沒有私有數據成員的類的設計是失敗的設計(那不是類,而是接口了)。 好,下面我就舉一個詳細的例子來說明,如何將界面代碼和功能代碼分離。 假設我要做一個簡單的個人通訊錄管理軟件,很顯然,整個軟件分為兩部分:一部分是面象用戶的,也就是所謂界面部分,我可以提供四個按鈕(分別為“添加”、“刪除”、“修改”、“查找”)和一個編輯框(顯示通訊錄信息和接受用戶輸入)用于和用戶交互;另一部分是功能化的,也就是軟件內部的對于通訊錄的存取操作。 于是,有了一個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; 
       //其它共有成員函數 
   end; 
私有成員之所以無法確定,主要是取決于這個類的實現。 如此,可以將對通訊錄的存取操作的邏輯封裝。而界面部分的代碼不會涉及到這些存取邏輯。界面部分代碼如下:
   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; 
    
以上界面部分的代碼,不涉及任何存取邏輯,每個模塊的代碼簡單,易懂,便于維護。而實際上,該通訊錄是使用數據庫保存還是用文本文件來保存,界面代碼都不知道;使用數據庫的話,是通過ODBC還是ADO還是BDE訪問數據庫,界面代碼也不知道。實際上,這些存取邏輯的東西取決于TAddrBook類的實現,TAddrBook類的實現可以單獨的放在一個.pas文件中,對TAddrBook類的實現的任何更改,都不會影響界面部分。維護代碼的時候,將更改局限于某一個模塊中的做法是非常明智的。 聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-09-08 04:39:21 IP:203.204.xxx.xxx 未訂閱
引言:

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

作者:Nicrosoft ------------------------------------------------------------------------------- 很多朋友看了上次我寫的“創建良好設計的代碼(基于Delphi/VCL)”后,對我說感覺上可以接受其中的觀點,但似乎說得太簡單,不夠具體;也有的朋友對其中的一個小例子有些異議。因此便有了此文。 上次,我舉的例子是這樣的:假設要從某處獲得一個字符串列表,然后顯示于 TListBox 中,我所推崇的代碼是:
 
   ObjectXXX := TObjectXXX.Create; 
   ListBox1.Items := ObjectXXX.GetStringList; 
   ObjectXXX.Free; 
的確,我承認,單純從這三行代碼來看,似乎有了“濫用對象”之嫌。也許是例子過于簡單,給人的感覺是TObjectXXX只有GetStringList這一個public成員函數,如果真的這樣的話,那可真是“濫用對象”了。類是對對象的抽象,而對象是由狀態和操作(也就是數據和對數據的操作)的集合組成。因此,沒有狀態的對象不是對象!沒有私有數據成員的類的設計是失敗的設計(那不是類,而是接口了)。 好,下面我就舉一個詳細的例子來說明,如何將界面代碼和功能代碼分離。 假設我要做一個簡單的個人通訊錄管理軟件,很顯然,整個軟件分為兩部分:一部分是面象用戶的,也就是所謂界面部分,我可以提供四個按鈕(分別為“添加”、“刪除”、“修改”、“查找”)和一個編輯框(顯示通訊錄信息和接受用戶輸入)用于和用戶交互;另一部分是功能化的,也就是軟件內部的對于通訊錄的存取操作。 于是,有了一個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; 
       //其它共有成員函數 
   end; 
私有成員之所以無法確定,主要是取決于這個類的實現。 如此,可以將對通訊錄的存取操作的邏輯封裝。而界面部分的代碼不會涉及到這些存取邏輯。界面部分代碼如下:
   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; 
    
以上界面部分的代碼,不涉及任何存取邏輯,每個模塊的代碼簡單,易懂,便于維護。而實際上,該通訊錄是使用數據庫保存還是用文本文件來保存,界面代碼都不知道;使用數據庫的話,是通過ODBC還是ADO還是BDE訪問數據庫,界面代碼也不知道。實際上,這些存取邏輯的東西取決于TAddrBook類的實現,TAddrBook類的實現可以單獨的放在一個.pas文件中,對TAddrBook類的實現的任何更改,都不會影響界面部分。維護代碼的時候,將更改局限于某一個模塊中的做法是非常明智的。 聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
介面 應該是 = interface 功能 應該是 = implementation 代碼 ? 是指 Code 嗎 ? 不太懂大陸人的用語 .... 可以解釋一下嗎 ? 還是可以 Post 英文版的文章呢 ?
raylau
一般會員


發表:11
回覆:12
積分:4
註冊:2002-10-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-11-13 15:51:56 IP:202.175.xxx.xxx 未訂閱
請問哪裡有更多這些coding design 的資料呀
------
Crazy~Ray
系統時間:2024-05-09 4:20:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!