<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          為 Gopher 打造 DDD 系列:領域模型-開篇

          共 2095字,需瀏覽 5分鐘

           ·

          2020-07-29 05:19

          前言: 八叉樹是一位擁有數(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





          推薦閱讀



          學習交流 Go 語言,掃碼回復「進群」即可


          站長 polarisxu

          自己的原創(chuàng)文章

          不限于 Go 技術

          職場和創(chuàng)業(yè)經(jīng)驗


          Go語言中文網(wǎng)

          每天為你

          分享 Go 知識

          Go愛好者值得關注


          瀏覽 48
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  A片免费网站在线观看 | 爆操阿姨 | 免费黄色一级片 | 97精品国产 | 五月丁香婷婷乱伦 |