領域物件驅動開發 來吧,讓我們從物件開始吧

2022-01-29 14:49:17 字數 3942 閱讀 7510

今天我們通過乙個「超市收銀」業務來作為我們的示例(雖然這個示例看上去不太正常,但是它確表述我們所需要的)。我們將從業務分析到業務建模然後最後的編碼來用「面向領域物件」的方式來做我們的專案。

好,我們開始吧!

一、業務分析

大家都去超市買過東西,對超市收銀業務都比較熟悉。什麼?你不熟?好吧,那我們找個收銀員給大家講解下(領域專家)。

收銀員小慧:哦,是這樣呢。顧客排隊銀帳我就收銀呢,我要使用收銀機呢。收銀機就能計算出要收的錢呢,我就掃一下呢,就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)

一 領域驅動中的分層 領域驅動設計將軟體系統分為四層 基礎結構層 領域層 應用層和表現層。基礎結構層 該層專為其它各層提供技術框架支援。注意,這部分內容不會涉及任何業務知識。眾所周知的資料訪問的內容,也被放在了該層當中,因為資料的讀寫是業務無關的。領域層 包含了業務所涉及的領域物件 實體 值物件 領...