|
園子里這么多討論OO的﹐我也來湊一下熱鬧吧。
面向?qū)ο箝_發(fā)一個(gè)最重要的思想就是對真實(shí)世界進(jìn)行模擬。
然而﹐在大量的使用面向?qū)ο笳Z言開發(fā)的系統(tǒng)中﹐您卻很難看到這種模擬﹐而依然是些以數(shù)據(jù)庫為中心的增刪改查動(dòng)作﹐很少能看到”真實(shí)的世界”的身影。
出現(xiàn)這種情況﹐很大程度上都是受數(shù)據(jù)庫為中心的影響。
以數(shù)據(jù)庫為中心開發(fā)系統(tǒng)﹐有一套成熟的理論﹐也經(jīng)歷住了多年的考驗(yàn)﹐是到今天為止﹐大部分信息系統(tǒng)開發(fā)時(shí)的不二選擇。
以一個(gè)圖書管理系統(tǒng)為例﹐有這樣的一些功能﹕新書上架﹐借閱﹐歸還。
按照數(shù)據(jù)庫方法﹐我們會(huì)設(shè)計(jì)出這樣的三個(gè)關(guān)系﹕
書籍(BookID,ISBN﹐書名﹐作者﹐出版社﹐內(nèi)容簡介)
借書證(CardID﹐姓名﹐電話﹐身份證號﹐地址)
借閱(BookID,CardID,借閱時(shí)間,歸還時(shí)間,)
然后在數(shù)據(jù)庫中建表
接下來提供書籍新增﹐刪除﹐修改﹐查詢﹐借書證增刪改查﹐圖書借閱﹐歸還的人機(jī)界面
再圍繞數(shù)據(jù)庫編寫增刪改查對象和方法。大家爭論的Book.Save和BookManager.Save方法也是在此吧。其實(shí)只要不重復(fù)代碼﹐使用起來方便﹐高效﹐統(tǒng)一﹐無論將Save方法放在哪﹐都是有其道理的。
對于大部分信息系統(tǒng)﹐以數(shù)據(jù)庫為中心是十分合適的﹐這種方法也是非常高效且成熟。
然而﹐您還是可以嘗試另外一種方法
我們想象這樣的場景﹕
有一個(gè) [圖書館]
[圖書館]里有很多[書架](可以理解為﹕書籍分類目錄)
[書架]上有很多[書籍]
一個(gè)讀者進(jìn)入系統(tǒng)﹐系統(tǒng)幫助他瀏覽[圖書館]的[書架],然后在其中一個(gè)[書架]中找到了他想借閱的[書籍]﹐接下來﹐它將[借書證]交給管理員﹐要求借閱該[書籍]﹐管理員辦理借閱手續(xù)﹐產(chǎn)生一筆[借閱記錄]﹐完成借書過程
這個(gè)場景可以由下面這個(gè)對象完成
Class 圖書館幫助者
{
PublicList<書架> 所有書架
{
Return 圖書館.Instance.所有書架
}
Public void 選擇書架(書架)
{
記錄當(dāng)前書架
}
Public void 選擇圖書(圖書)
{
記錄所選圖書
}
Public void 借閱(借書證)
{
If(借書證.借出記錄!=null)
ThrowException “該書已借出”;
New 借閱記錄();
借閱記錄.Book= 當(dāng)前圖書
借閱記錄.Card= 借書證
借閱記錄.時(shí)間 =Now
當(dāng)前圖書.借出記錄 =借閱記錄
借書證的借閱記錄.Add(借閱記錄)
}
}
這就是借書的用例實(shí)現(xiàn)﹐而這些對象則是系統(tǒng)領(lǐng)域模型中的對象。
沒有數(shù)據(jù)庫﹐沒有UI﹐只有業(yè)務(wù)以及邏輯。
當(dāng)您開發(fā)人機(jī)界面時(shí)﹐您可以選擇windows﹐也可以選擇web﹐它使用這個(gè)類 (顯示書架﹐選擇一個(gè)書籍﹐顯示書架中的書籍﹐選擇一本書﹐借閱按鈕)完成了借閱功能
自始至終﹐我們的設(shè)計(jì)中均未出現(xiàn)數(shù)據(jù)庫
我們的系統(tǒng)做為一個(gè)真實(shí)世界的模型﹐已經(jīng)足夠.上架時(shí)﹐只要new 書籍﹐加入書架就可以﹐辦理借書證﹐也只需要new借書證,同樣﹐歸還書籍時(shí)﹐只要將借出記錄與書籍的關(guān)聯(lián)取消即可﹐一切良好。
然而這種理想的環(huán)境是不存在的﹐這樣我們才有了對象持久化的概念﹐數(shù)據(jù)庫作為一個(gè)穩(wěn)定﹐高效的持久方案﹐就是不錯(cuò)的選擇(我以前也試過將所有對象以二進(jìn)制文件形式間隔備份到硬盤上的方法完成持久)。
至于系統(tǒng)中的對象與數(shù)據(jù)庫的表格如何轉(zhuǎn)換﹐ORM就開始派上用場了。
然而請記住一條﹐在使用數(shù)據(jù)庫存對象時(shí)﹐請千萬不要和領(lǐng)域模型耦合在一起了(不要在借閱方法中﹐來一句Book.Insert代碼﹐我們的領(lǐng)域?qū)ο笾皇腔ハ嘀g有關(guān)系﹐而和數(shù)據(jù)庫是沒關(guān)系的﹐我們的數(shù)據(jù)庫保存的是當(dāng)前系統(tǒng)中的對象及其狀態(tài))﹐設(shè)計(jì)模式呀﹐AOP呀﹐這時(shí)候是他們大顯身手的時(shí)候了
(順便說一句﹕一直以來﹐我認(rèn)為以數(shù)據(jù)庫為中心而又采用ORM的系統(tǒng)設(shè)計(jì)方案可以說非常憋屈的﹐好好得實(shí)現(xiàn)您的增刪改查﹐下SQL﹐連數(shù)據(jù)庫不就行了﹐硬是插一腳O/RMapping﹐讓十分強(qiáng)大的SQL,變成笨手笨腳的對象方法﹐不難受才怪。)
it知識(shí)庫:領(lǐng)域模型﹐打開OO的另一扇窗,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。