今天我們通過乙個「超市收銀」業務來作為我們的示例(雖然這個示例看上去不太正常,但是它確表述我們所需要的)。我們將從業務分析到業務建模然後最後的編碼來用「面向領域物件」的方式來做我們的專案。
好,我們開始吧!
一、業務分析
大家都去超市買過東西,對超市收銀業務都比較熟悉。什麼?你不熟?好吧,那我們找個收銀員給大家講解下(領域專家)。
收銀員小慧:哦,是這樣呢。顧客排隊銀帳我就收銀呢,我要使用收銀機呢。收銀機就能計算出要收的錢呢,我就掃一下呢,就ok了呢。然後就收銀了呢。
聽了小慧的講解,我們心中有了業務的概念了。我們這裡採用《業務關鍵字分析法》來找出此業務流程裡面的一些關係字:
商品顧客
收銀員收銀機
*收銀*選商品
*收銀員使用收銀機
*收銀機掃商品計算金額
好了,列出這些「業務關鍵字」了,我們就可以建我們的物件模型了。
二、系統建模
上面我們分析出了一些「業務關鍵字」接下來我們分析這些業務關鍵字並深入他們的業務。
商品物件(goods)。
屬性:商品名稱(goodsname)、商品**(goodsprice)。
行為:在這裡商品物件是沒有行為的,我們也可以叫它「值物件」。
顧客物件(customer)。
屬性:顧客姓名(customername)、顧客選購的商品(goodss)
行為:選購想買的商品(likebuy)、聽收銀員說要收多少rmb(listenamount)
收銀員物件(cashier)。
屬性:收銀員姓名(cashiername)
行為:收銀(cashierregister)
收銀機物件(cashierregister)。
屬性:收銀機編號(cashregisterno)
字段:總金額(_totalamount)
行為:收銀(cashregisters)、顯示收銀總額(showamount)
有木有!有木有?有木有很直觀,這也就是物件導向分析的好處,
因為物件就是對現實的抽象,我們現實中的事務可以很方便的用物件抽象出來。我們很容易發現,這和用表來描述這些業務模型顯然要不方便的多。表還只能描述屬性,造成了屬性與行為的分離。
三、**示例
商品物件
//////
商品///
public
class
goods
//////
商品名稱
///public
string
goodsname
//////
商品**
///public
decimal
goodsprice
}顧客物件
//////
顧客///
public
class
customer
//////
顧客姓名
///public
string
customername
private
list
<
goods
>
_goodss
=new
list
<
goods
>
();///
///顧客購買的商品
///public
list
<
goods
>
goodss
set}
//////
顧客選購商品
//////
商品public
void
likebuy(goods goods)
//////
聽收銀員應收多少錢
//////
public
void
listenamount(
decimal
amount)
],我買了件商品。我共花了元rmb。",
this
.customername,
this
.goodss.count, amount.tostring("f2
"));
}收銀員物件
//////
收銀員///
public
class
cashier
//////
收銀員姓名
///public
string
cashiername
//////
收銀///
///顧客
public
void
cashregister(customer customer)
//通知顧客一共收多少錢
customer.listenamount(cashregister.showamount());}}
收銀機物件
//////
物件標識
///public
guid okey
//////
收銀機編號
///public
string
cashregisterno
//////
總**///
private
decimal
_totalamount
public
cashregister()
//////
收銀///
///商品
public
void
cashregisters(goods goods)
//////
顯示收銀總額
//////
public
decimal
showamount()
模擬業務流程
//我們建立幾樣商品
goods redwine
=new
goods() ;
goods condoms
=new
goods() ;
//我們建立幾位顧客
customer chunge
=new
customer() ;
customer beianqi
=new
customer() ;
//當然,我們需要收銀員啊
cashier cashiermm
=new
cashier() ;
//顧客逛了一圈,選了自己想要的商品
chunge.likebuy(redwine);
beianqi.likebuy(redwine);
beianqi.likebuy(condoms);
//顧客開始排隊結帳了
queue
<
customer
>
customerqueue
=new
queue
<
customer
>
();customerqueue.enqueue(chunge);
customerqueue.enqueue(beianqi);
//隊伍過來,按先後順序挨個收銀嘍
foreach
(var customer
incustomerqueue)
顯示結果
上面的例子雖然不是很恰當,但是它也很好的像我們表達出了領域驅動分析問題、
物件導向驅動開發的好處了。
最後大家回想一下,用資料庫表驅動的方式。分析這個業務會是什麼樣子的。。。。
領域驅動的開發
物件導向方法被認為是軟體技術方面的重要進步,特別是在對複雜現象建模方面比起前任更加容易。但是在可重性性,可維護性,可靠性,甚至表現性方面展沒有達到期望的進展。作為乙個可重用的單元來說,物件被證實太小了,而框架似乎又太大,以及他們的開發還停留在藝術階段。構件提供可重用性,但是其功能越多,則體積變得越大...
領域驅動開發的優點
一直以來,j2ee的開發過程 以struts hibernate spring為例 都是這樣的 1.設計資料庫 2.生成資料庫 3.從工程裡建立資料庫連線 4.把資料庫反向工程生成pojo 5.最後才能進行開發工作 如果需求發生了變更或者發現了資料庫的設計錯誤,那麼所有步驟都要再來一遍,工作繁瑣無比...
最精簡領域驅動設計開發模版(針對WPF)
一 領域驅動中的分層 領域驅動設計將軟體系統分為四層 基礎結構層 領域層 應用層和表現層。基礎結構層 該層專為其它各層提供技術框架支援。注意,這部分內容不會涉及任何業務知識。眾所周知的資料訪問的內容,也被放在了該層當中,因為資料的讀寫是業務無關的。領域層 包含了業務所涉及的領域物件 實體 值物件 領...