介紹
下面我要介紹的Bold for Delphi就是是一套優秀的基於UML模型驅動的面向對象的數據庫開發框架包括了幾十個組件組件以及個以上的類可以用來輕松地實現信息模型設計及基於信息模型的的應用程序
基礎概念介紹
為了使大家對Bold for Delphi整個框架的使用有一個大概的了解下面將演示如何用UML設計一個簡單的模型並用Bold來完成並包括如何用Bold快速實現一個簡單的操作界面
自打我和我老婆認識以後就染上了她的臭毛病比較喜歡亂花錢沒有節制結果搞的自己常常是掙的不如花的多老要借外債後來痛定思痛決定要對每月收支情況做預算嚴格控制費用支出為此寫了還寫了好多的財務小程序下面要講的這個例子程序就是一個常見的家庭小賬本程序它可以用來統計家庭中的收支情況軟件的功能要求如下
可以定義家庭中的各個人員的信息
可以輸入收支情況並同消費的人員關聯起來
給出一定時期內消費的情況統計作為未來家庭預算的依據
建立信息模型
在產品的需求分析階段我們首先要建立數據庫程序的信息模型一般來說信息模型主要是指基於ER圖的實體關系模型這是因為我們使用的數據庫大部分都是關系型數據庫雖然有些數據庫比如Oracle有面向對象的特性但不是很完善一般很少使用而關系型數據庫有一個很大的問題就是無法直觀的體現面向對象的思想關系型的ER模型能夠清晰地描述業務域的靜態的數據視圖但你無法從模型獲取實體的操作及其相互之間的交互同時也很難在關系型數據庫中簡單地實現繼承重載多態等等面向對象的技術因此現代數據庫開發方法所提倡的面向對象的編程思想無法簡單清晰平滑地映射為關系型數據庫中的表結構
統一建模語言(UML)是一種以可視化的方式建立軟件系統框架並進行文檔化的語言UML語言是對當今軟件工程領域成熟設計實踐的一個總結並且已經被實踐證明是可以成功地描述大型的復雜系統的目前國內很多的大型公司已經開始在軟件開發過程中使用UML作為一種標准的信息模型設計語言了 Bold for Delphi就是基於UML的它內置了一套自己的UML建模工具當然我們也可以使用Rose或者ModelMaker來進行UML設計
面向對象的UML類圖則可以說是對ER模型的一個擴展它對實體之間的關系以及相互之間的作用也進行了描述ER模型只是對要進行保存的數據進行的模型化而類圖則包括了全部的類實體的屬性以及它們的操作和相互作用它可以使我們對業務域問題有一個更精確的視圖通過使用各種類圖技術可以更容易地也更快速地建立正確的軟件系統
基於Bold for Delphi的數據庫開發革命性的一點就是允許我們直接把基於UML的類圖映射為關系型數據庫的存儲而無須手工的通過代碼進行轉換要注意一點的是Bold同其它建模工具如TogetherModelMaker不同它生成框架代碼時只使用了UML中的類圖而Together等可以利用UML圖中的類圖協作圖等其它UML元素來生成代碼框架但是Together不負責生成對象模型對應的關系數據庫模型
類模型
下面的這個類圖就是我們的賬本程序的一個簡單類圖
圖中顯示了兩個類人員信息類Person以及賬目信息類AcctItem人員類和賬目類之間的連線描述了兩個類之間的關系關系包括一個標題PayAssoc揭示了兩者之間的關系是支付的關系每個屬性PayPerson和Pay以及關系多重度因子和n表明每個人可以完成多個賬目的收支而每個賬目至少要有一個關聯的人員同時類圖還描述了下面一些業務規則
一個人的信息要有名稱
賬目信息中包含收支金額大小以及發生日期
上面的類圖如果使用關系型數據庫來實現的話需要建立主從表並將人員和賬目之間的關聯約束通過應用程序代碼強制一些運行邏輯來完成這時通常要通過補充詳細的文檔來描述需要強制的業務邏輯如果沒有詳細的設計文檔實現代碼時就很容易遺漏某些重要的商業規則同時這些文檔在整個的數據庫開發的生命周期裡面都需要人來手工地維護難免會出現文檔和模型不匹配的錯誤而且文檔的工作量比較大而程序員數量又相對不足的話程序員會覺得既要寫代碼又要寫文檔無形中增加了很多工作量難免會有抵觸情緒這些都會影響工作的效率
對於這樣的問題Bold則通過精確描述信息模型無須詳細規則描述文檔可以將模型自動的轉變為實現代碼商業規則在整個數據庫開發生命周期內由Bold的類來維護減少了文檔的工作量和出錯的可能
建立示例程序
首先我們要安裝Bold for DelphiBold的一個月評估版可以從wwwboldsoftcom獲取同時D的架構版內置了Bold這裡我就不詳細介紹申請和安裝的過程了安裝好後Bold會在IDE的組件面板中添加很多組件接下來我們就開始建立使用Bold的Delphi程序了
在Delphi中選File|New Application創建一個新的應用程序
保存窗體文件為MainFormpas保存工程文件為CMoneydpr
添加一個數據模塊設定數據模塊的名字為DmMoney
將數據模塊保存為CDataModulepas
為了使用Bold來建立系統的信息模型要進行下列操作
從Bold Handles 組件頁上選擇BoldModal(命名為bmMoney)BoldSystemTypeInfoHandle(命名為bsthMoney)和BoldSystemHandle(命名為bshMoney)到數據模塊中
設定bsthMoney的BoldModal屬性為bmMoney
設定bshMoney的BoldSystemTypeInfoHandle 屬性為bsthMoney
其中BoldModel組件將被用來保存模型即類類的關系約束以及類型等這些信息將在設計時作為字符串保存到Delphi的窗體和數據模塊文件中在運行時Bold將執行一些模型的中間轉換過程將模型轉化為BoldSystemTypeInfoHandle控件所使用的格式並選擇實現可持續性的機制
在設計時儲存在BoldModel組件中的信息模型可以被看做元數據就象數據庫的庫表和字段結構一樣的信息而BoldSystemTypeInfoHandle組件則保存BoldSystemHandle所需要的運行時信息這些信息是對UML模型的一種運行時的表達這個組件是其他Bold組件的信息源
BoldSystemHandle組件則被用來表達整個系統的業務域元素可以理解為對象空間通過對象空間我們可以在運行時獲得設計時元數據表達的對象的運行實例目前用到的三個控件已經可以很好的應用在不需要保存數據的環境中了但賬目記錄這類數據庫程序必須要保存用戶輸入的信息因此還需要添加支持數據可持久性的控件這裡為了快速演示的需要我們使用XML文件作為存儲介質接下來要添加XML可持續控件到數據模塊中
從Bold Persistence組件頁上選擇BoldPersistenceHandleFileXML控件(命名為bphxMoeny)添加到數據模塊中
設定組件的BoldModel屬性為bmMoney控件
設定bshMoney組件的PersistenceHandle屬性為bphxMoeny組件
現在組件關系示意圖如下
BoldPersistenceHandleFileXML組件將使我們的程序可以使用XML文件來保存和讀取對象這是一個使用很方便的控件特別是在快速原型設計期間因為在原型設計期間模型經常會被改動而重新生成數據庫表是很費時間的而XML文件可以使我們非常快的變更我們的模型設計當模型基本穩定後可以去掉這個控件轉而切換為其他使用關系型數據庫進行存儲的可持續性控件這樣的開發方式可以使我們不需要改動整個程序就能很容易地改變數據持續層的存儲策略也就是前面所說的數據庫平台無關設計
除了前面的一些基本的屬性設置外我們還要設定下列控件屬性
組件
屬性
值
說明
bsthMoney
UseGeneratedCode
false
是否使用bold生成類代碼
這裡暫時先不使用
稍後我們會進一步介紹
bphxMoeny
FileName
Data
xml
指定保存數據的xml文件名
bshMoney
AutoActivate
true
告訴Bold控件在程序運行後馬上打開xml文件用於數據存儲
建立模型
下面的步驟是建立我們的模型Bold for Delphi內置了一個樹形的UML建模工具(應該說Bold美中不足的一點就是沒有提供象Visio和Rose那樣基於拖放的模型設計界面)我們可以雙擊BoldModel(bmMoney)組件調出模型設計工具bold UML模型編輯器(見下圖)包含了應用程序模型信息數據類型信息和關系數據庫映射信息
模型編輯器支持下列實體類型
Model: 模型全部業務域實體集合
Package: 包整個模型的一個子集所包含的實體可以將大模型分解為小模型來減少系統復雜度
Class:類類似於Delphi的類的概念(Delphi的類可以從UML的類來生成)但包含Object Pascal無法直接描述的類的信息和相互關系Bold框架通過關聯類和特殊的列表類封裝了一些額外的功能使得我們可以很容易的處理復雜的類關系
Attribute: 屬性類似於Delphi中的property概念然而在Bold中這些屬性可以在模型中直接保存而無需我們編寫屬性的GetSet方法
Operation: 操作等價於Delphi中的類的過程和函數
Association: 關聯代表了類之間的關系關聯可以使用類來表達關聯也可以有操作和屬性在Bold中建立關聯的復雜工作同樣可以由框架來實現我們無須編寫代碼來完成
Role: 角色代表關聯同類的連接
Data Type: 表示模型所支持的不同數據類型它可以被擴展以支持用戶自定義的數據類型
下圖是不同實體類型在模型編輯器中是如何標識的
所有的實體類型都可以通過編輯器的右鍵菜單來創建和修改屬性同時我們選中實體節點後實體和全局的選項會顯示在右側的編輯器中其中重要的有
Name: 模型的名稱
Unit name: 指定Bold根據模型生成Delphi類的pascal單元的名稱(前提是我們選擇生成代碼這裡也可以選擇不生成代碼)
From:http://tw.wingwit.com/Article/program/Delphi/201311/24785.html