程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 數據庫的一種完全面向對象設計模式(包含實例)Rayphrank原創!

數據庫的一種完全面向對象設計模式(包含實例)Rayphrank原創!

編輯:Delphi

數據庫的一種完全面向對象設計模式   

 

1.1 完全面向對象和非完全面向對象

     面向對象(OO)方法這個名字早已深入人心,它的科學性和合理性也已毋庸置疑。人們動辄將自己開發的軟件冠以“采用面向對象方法設計”以示其先進性就是一個極好的證明。然而,一個先進的方法學必須有相應的工具支持才能實現,它的概念和方法如不落實程序實現上,就不能真正掌握它的精髓而在實踐中運用。誠然,SmallTalk語言已被公認是一個面向對象語言,但是它對於開發者來說是多麼的陌生!C++也可以說是一個OO語言,不過從名字就可以看出他是C語言的一個變種。它實現了從過程式編程到面向對象編程的一個較好的過渡。但是許多聲稱用C++制作的軟件其實仍舊是C軟件!這是因為沒有真正掌握OO方法的緣故。


      即使開發者的開發環境,開發工具是支持OO的(如Delphi,VC),但開發者沒有以OO的觀點去觀察軟件的問題域,或者以往的過程式設計思想根深蒂固,那麼開發出的軟件仍舊是披著OO這件漂亮外衣的過程化軟件。沒有把OO作為一種確實實用的方法學。造成這種現象的原因是沒有認識到OO的精髓,尤其是在一些RAD開發工具下,更容易忽視以OO的觀點去觀察問題域。


      RAD開發工具開發的軟件常能分成兩種形式:完全面向對象設計和非完全面向對象設計。一個數據庫軟件系統的體系結構常能分為三層:用戶接口層、中間件層和數據庫層。在用戶接口層,常是一些具體與用戶交互的對象,如:按鈕、菜單、和對話框。在數據庫層,則是從問題域中找出描述實體的表。完全面向對象和非完全面向對象的最大區別在於中間件層,什麼是中間件層,中間件層是問題域中具體對象,商業規則,更高層次上的問題實體。完全面向對象有中間件層,非完全面向對象沒有中間件層。RAD工具開發時常會忽視中間件層。


       舉個例子:一個簡單的記帳系統如果用RAD工具(如:Delphi)開發,用戶接口層是一些系統中所用的控件,如按鈕,菜單等,這些控件對象由Delphi或其它開發工具中的類庫封裝;數據庫層則是在數據庫系統(如SQL SERVER、Oracle等)建立的表,如顧客表、產品表、訂單表等。


       完全面向對象設計中的中間件層為問題域的交易,商業規則等對象,以及更高層次上的問題實體,如顧客,產品,訂單。非完全面向對象則沒有中間件層這些對象。換句話說,非完全面向對象是基於用戶接口層直接存取數據庫層,即:基於控件。完全面向對象是將中間件層封裝數據庫層,用戶接口層使用中間件層,這樣將數據庫層完全透明,做到數據與界面的分離,即:面向對象,基於控件。


       在一些小型的系統中,非完全面向對象設計可以加快開發速度,但系統的靈活性,重用性不好,大型系統必須采用完全面向對象的開發方法,否則,由於商業規則沒有放在一起,軟件後期將不可控制,一個成功的可復用的商業軟件應該是由中間件層的眾多對象組件靈活搭配而成。


       由此,筆者提出一種數據庫完全面向對象的設計模式。

1.2數據庫的一種完全面向對象設計模式
    
       用完全面向對象的方法做一般的應用程序比數據庫程序容易一些,因為它不涉及到數據庫存取。但在做數據庫程序時應該考慮類跟跟數據庫是怎樣聯系的。

步驟1:分析問題域,找出所有問題域中相關事物,從中抽象出對象。

步驟2:從抽象出的對象中找出所有的持久對象(Persisitant Object),所謂持久對象就是由數據庫管理系統負責管理的,可以永久保留,將來可被提取的對象,將這些持久對象以“一類一表格”的原則映射到數據庫中,通過數據庫管理系統建立表格。

步驟3:定義持久對象,所有持久對象均采用“雙構造函數”的方法在程序中進行構造,其中,一個構造函數參數為所有初始化該持久對象的值,封裝數據模塊中“存”操作,另一個構造函數的參數為唯一標識該持久對象的值,封裝數據模塊中“取”操作。其它數據庫操作由持久對象相應方法封裝。

步驟4:所有與數據庫層發生交互的動作,均放在專門的數據模塊中,由中間件層持久對象相應方法封裝,做到數據與界面的分離。


步驟5:定義其它非持久對象。具體軟件功能由相應對象協同實現。


      該設計模式的重點在於持久對象的定義,除了雙構造外,持久對象如果一次獲取數據數量>1,那麼可以定義“持久對象集”對象,“持久對象集”對象由持久對象組成,“持久對象集”對象中的對象集可由數據模塊中相應的SQL語言篩選,如果數據集中數據數量非常大,那麼在數據模塊中相應的SQL語言可以以固定數量進行篩選數據集,分批篩選。對象集中的相應持久對象可用鏈表的結構進行鏈接。
以這種方式定義的持久對象,完全封裝了數據庫存取,用戶在使用持久對象的時侯甚至感覺不到數據庫的存在,因為相應的數據庫操作已被持久對象的相應方法封裝,用戶只需要建立相應的持久對象即可進行數據庫的操作。

 

2.數據庫完全面向對象設計模式在銀行儲蓄管理系統中的實現


2.1問題域對象、持久對象與數據庫表


根據上述設計模式的思想,我們首先找出問題域的所有對象
1. 帳戶對象
2. 儲蓄帳戶對象
3. 定期儲蓄帳戶對象
4. 活期儲蓄帳戶對象
5. 銀行卡帳戶對象

       其中儲蓄帳戶對象、銀行卡帳戶對象繼承自帳戶對象,帳戶對象為一個虛基類,定期儲蓄帳戶對象、活期儲蓄帳戶對象繼承自儲蓄帳戶,儲蓄帳戶對象為一個虛基類
UML類層次圖(圖12)

圖12:帳戶對象UML類層次圖

 


6. 儲戶對象
7. 櫃員對象
8. 交易對象
9. 費用對象
10. 利率對象
11. 特殊操作對象
12. 系統信息對象
13. 銀行功能對象
14. 銀行服務對象
15. 儲蓄服務對象
16. 銀行卡服務對象


     其中儲蓄服務對象,銀行卡服務對象繼承自銀行服務對象,銀行服務對象是一個虛基類


UML類層次圖(圖13)

圖13:服務對象類層次圖

 

      然後,我們分析問題域,將要持久存儲在數據庫的數據對象確立為持久對象。
所確立的持久對象為:
1. 儲蓄帳戶對象
2. 定期儲蓄帳戶對象
3. 活期儲蓄帳戶對象
4. 銀行卡帳戶對象
5. 儲戶對象
6. 櫃員對象
7. 交易對象
8. 費用對象
9. 利率對象
10. 特殊操作對象
     這些持久對象將以“一類一表格”的原則映射到我們選擇的數據庫SQL SERVER2000中,由此確立數據庫中所建立的表格與字段為:


2.2 問題域對象的定義


(1) 雙構造函數的使用。


     限於篇幅,本文以持久對象——儲戶對象為例,說明持久對象的雙構造函數方法,其它持久對象的定義思想與之大致相同。

儲戶對象接口定義
type
  TCustomer = class(TObject)
  private
    { Private declarations }
  protected
    { Protected declarations }
    Cus_id:string;
    Cus_name:string;
    Cus_shenfenid:string;
    Cus_addr:string;
    Cus_phone:string;
     procedure New_Cus_Info(c_name,c_sfid,c_addr,c_phone:string);
     procedure Load_Cus_info(cusid:string);
  public
    { Public declarations }
    constructor create(c_name,c_sfid,c_addr,c_phone:string);overload;   //(1)
constructor Create(cusid:string);overload;                        //(2)

    function update_cus():boolean;
    procedure Set_Cus_Id(C_Id:string);
    procedure Set_Cus_name(C_name:string);
    procedure Set_Cus_shenfenid(sfid:string);
    procedure Set_Cus_addr(addr:string);
    procedure Set_Cus_phone(phone:string);
    function Get_Cus_Id:string;
    function Get_Cus_name:string;
    function Get_Cus_shenfenid:string;
    function Get_Cus_addr:string;
    function Get_Cus_phone:string;
  published
    { Published declarations }
  end;


     根據數據庫完全面向對象設計模式,持久對象將由兩個構造函數(見(1)、(2)),其中第一個

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved