為 Gopher 打造 DDD 系列:領域模型-開篇
前言: 八叉樹是一位擁有數(shù)十年編程經(jīng)驗,醉心于代碼藝術的工程師。freedom是他結合《實現(xiàn)領域驅動設計》與《六邊形架構》兩文為一眾Gopher打造出最符合DDD戰(zhàn)術設計的輪子!
DDD是什么?
領域驅動設計(DDD) 做為一種軟件工程的方法論,它可以幫助我們設計高質量的軟件,或者說任何工程的設計都需要方法論,不論是城市設計、建筑設計、室內(nèi)設計。
比如沒有方法論的情況下樓是可以蓋起來的,或許整個樓道和窗戶上掛滿了電話線、閉路線、電線?下水道隔三差五就堵了?某一戶跳閘了導致整個樓都停電了?那么蓋樓前是否有好的方法論去建模呢?
不論任何行業(yè)的工程設計都因該使用正確的方法論去設計。任何行業(yè)的方法論也離不開八個字分而治之、擁抱變化。如果和城市的設計、建筑的設計相比較,我認為軟件的設計會更復雜,軟件的迭代和變化周期更快,也意味著我們更需要好的方法論。
字面上的領域模型并不抽象,可以理解為uml建模中的對象,它有什么屬性?它有什么行為?那么就可以把它規(guī)劃成某個領域的概念。
DDD 是一個分而治之的過程,是一系列分而治之的方法論。
如何把一個公司的領域劃分成多個子域,比如教育公司會劃分成作業(yè)子域、課程子域。電商可能會劃出商品子域、物流子域。如何為每個子域劃分出多個實體、聚合、服務,如何每一個實體和聚合設計它們的事件,如何為每一個實體設計它們的倉庫。這就是DDD要做的事情!
貧血和充血?
貧血的代碼是指數(shù)據(jù)和行為的分離,業(yè)務系統(tǒng)迭代中行為多變和數(shù)據(jù)的多變會導致代碼的難以維護。來看一個貧血讀取商品的演進
package service///獲取商品func GetGoods(goodsId int) dao.Goods {return orm.GetGoods(goodsId)}
PM 一個月后增加了自動選擇優(yōu)惠券功能
//增加了優(yōu)惠券package service//獲取商品func GetGoods(goodsId int) dao.Goods {return orm.GetGoods(goodsId)}// 獲取有優(yōu)惠券的商品func GetGoodsByCoupon(goodsId int) dao.Goods {goods := GetGoods(goodsId)coupon := orm.GetCoupon()//優(yōu)惠券和商品邏輯略過....return}
PM 2個月后加入了限時折扣,不可以疊加優(yōu)惠券,自動選擇最優(yōu)。
這個限時折扣該加哪,雖然各種if else也能加,那么以后pm在加邏輯呢?這里就不浪費筆墨了。
充血的代碼
func GetGoods(goodsId int) entity.Goods {//獲取優(yōu)惠券實體coupon := repository.GetCoupon()//獲取商品實體goods := repository.GetGoods(goodsId)//如果優(yōu)惠券減免大于限時折扣if coupon.SubPrice(goods) > goods.TimeLimitPrice() {//使用優(yōu)惠券goods.UseCoupon(coupon)return goods}return goods}//實體不應該僅僅只有數(shù)據(jù),而且必須要有行為func (c *coupon) SubPrice(goods entity.Goods) int {}func (c *goods) TimeLimitPrice() int {}func (c *goods) UseCoupon(coupon entity.Coupon){}
戰(zhàn)略和戰(zhàn)術?
戰(zhàn)略建模主要劃分子域和使用限界上下文,通常用于劃分微服務和設計服務與服務之間的關聯(lián)。子域分為核心域、支撐子域、通用子域。以一個金融公司領域來看,股票服務是這個公司的核心域,賬戶服務是這個公司的支持子域。更多參考<<實現(xiàn)領域驅動設計>>,本教程以go語言來做戰(zhàn)術設計的落地。戰(zhàn)術設計主要涉及下文目錄相關的知識點。
目錄
golang領域模型-開篇 golang領域模型-六邊形架構 golang領域模型-實體 golang領域模型-資源庫 golang領域模型-依賴倒置 golang領域模型-聚合根 golang領域模型-CQRS golang領域模型-領域事件
項目代碼 https://github.com/8treenet/freedom/tree/master/example/fshop
推薦閱讀
站長 polarisxu
自己的原創(chuàng)文章
不限于 Go 技術
職場和創(chuàng)業(yè)經(jīng)驗
Go語言中文網(wǎng)
每天為你
分享 Go 知識
Go愛好者值得關注
