色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何實現DCI架構(上)

jf_78858299 ? 來源:元閏子的邀請 ? 作者:元閏子 ? 2023-05-10 17:09 ? 次閱讀

前言

在面向對象編程的理念里,應用程序是對現實世界的抽象,我們經常會將現實中的事物建模為編程語言中的類/對象(“ 是什么 ”),而事物的行為則建模為方法(“ 做什么 ”)。面向對象編程有 三大基本特性 (封裝、繼承/組合、多態)和 五大基本原則 (單一職責原則、開放封閉原則、里氏替換原則、依賴倒置原則、接口分離原則),但知道這些還并不足以讓我們設計出好的程序,于是很多方法論就涌現了出來。

近來最火的當屬領域驅動設計(DDD),其中戰術建模提出的實體、值對象、聚合等建模方法,能夠很好的指導我們設計出符合現實世界的領域模型。但DDD也不是萬能的,在某些應用場景下,按照傳統的戰術建模/面向對象方法設計出來的程序,也會存在可維護性差、違反單一職責原則等問題。

本文介紹的DCI建模方法可以看成是戰術建模的一種輔助,在某些場景下,它可以很好的彌補DDD戰術建模的一些缺點。接下來,我們將會通過一個案例來介紹DCI是如何解決DDD戰術建模的這些缺點的。

本文涉及的代碼歸檔在github項目:https://github.com/ruanrunxue/DCI-Architecture-Implementation

案例

考慮一個普通人的生活日常,他會在學校上課,也會趁著暑假去公司工作,在工作之余去公園游玩,也會像普通人一樣在家吃喝玩樂。當然,一個人的生活還遠不止這些,為了講解方便,本文只針對這幾個典型的場景進行建模示例。

圖片

使用DDD建模

按照DDD戰術建模的思路,首先,我們會列出該案例的 通用語言

人、身份證、銀行卡、家、吃飯、睡覺、玩游戲、學校、學生卡、學習、考試、公司、工卡、上班、下班、公園、購票、游玩

接著,我們使用戰術建模技術( 值對象實體聚合領域服務資源庫 )對通用語言進行領域建模。

DDD建模后的代碼目錄結構如下:

- aggregate: 聚合
  - company.go
  - home.go
  - park.go
  - school.go
- entity: 實體
  - people.go
- vo: 值對象
  - account.go
  - identity_card.go
  - student_card.go
  - work_card.go

我們將身份證、學生卡、工卡、銀行卡這幾個概念,建模為 值對象 (Value Object):

package vo

// 身份證
type IdentityCard struct {
 Id   uint32
 Name string
}

// 學生卡
type StudentCard struct {
 Id     uint32
 Name   string
 School string
}

// 工卡
type WorkCard struct {
 Id      uint32
 Name    string
 Company string
}

// 銀行卡
type Account struct {
 Id      uint32
 Balance int
}

...

接著我們將人建模成 實體 (Entity),他包含了身份證、學生卡等值對象,也具備吃飯、睡覺等行為:

package entity

// 人
type People struct {
 vo.IdentityCard
 vo.StudentCard
 vo.WorkCard
 vo.Account
}

// 學習
func (p *People) Study() {
 fmt.Printf("Student %+v studying\\n", p.StudentCard)
}
// 考試
func (p *People) Exam() {
 fmt.Printf("Student %+v examing\\n", p.StudentCard)
}
// 吃飯
func (p *People) Eat() {
 fmt.Printf("%+v eating\\n", p.IdentityCard)
 p.Account.Balance--
}
// 睡覺
func (p *People) Sleep() {
 fmt.Printf("%+v sleeping\\n", p.IdentityCard)
}
// 玩游戲
func (p *People) PlayGame() {
 fmt.Printf("%+v playing game\\n", p.IdentityCard)
}
// 上班
func (p *People) Work() {
 fmt.Printf("%+v working\\n", p.WorkCard)
 p.Account.Balance++
}
// 下班
func (p *People) OffWork() {
 fmt.Printf("%+v getting off work\\n", p.WorkCard)
}
// 購票
func (p *People) BuyTicket() {
 fmt.Printf("%+v buying a ticket\\n", p.IdentityCard)
 p.Account.Balance--
}
// 游玩
func (p *People) Enjoy() {
 fmt.Printf("%+v enjoying park scenery\\n", p.IdentityCard)
}

最后,我們將學校、公司、公園、家建模成 聚合 (Aggregate),聚合由一個或多個實體、值對象組合而成,組織它們完成具體的業務邏輯:

package aggregate

// 家
type Home struct {
 me *entity.People
}
func (h *Home) ComeBack(p *entity.People) {
 fmt.Printf("%+v come back home\\n", p.IdentityCard)
 h.me = p
}
// 執行Home的業務邏輯
func (h *Home) Run() {
 h.me.Eat()
 h.me.PlayGame()
 h.me.Sleep()
}

// 學校
type School struct {
 Name     string
 students []*entity.People
}
func (s *School) Receive(student *entity.People) {
 student.StudentCard = vo.StudentCard{
  Id:     rand.Uint32(),
  Name:   student.IdentityCard.Name,
  School: s.Name,
 }
 s.students = append(s.students, student)
 fmt.Printf("%s Receive stduent %+v\\n", s.Name, student.StudentCard)
}
// 執行School的業務邏輯
func (s *School) Run() {
 fmt.Printf("%s start class\\n", s.Name)
 for _, student := range s.students {
  student.Study()
 }
 fmt.Println("students start to eating")
 for _, student := range s.students {
  student.Eat()
 }
 fmt.Println("students start to exam")
 for _, student := range s.students {
  student.Exam()
 }
 fmt.Printf("%s finish class\\n", s.Name)
}

// 公司
type Company struct {
 Name    string
 workers []*entity.People
}
func (c *Company) Employ(worker *entity.People) {
 worker.WorkCard = vo.WorkCard{
  Id:      rand.Uint32(),
  Name:    worker.IdentityCard.Name,
  Company: c.Name,
 }
 c.workers = append(c.workers, worker)
 fmt.Printf("%s Employ worker %s\\n", c.Name, worker.WorkCard.Name)
}
// 執行Company的業務邏輯
func (c *Company) Run() {
 fmt.Printf("%s start work\\n", c.Name)
 for _, worker := range c.workers {
  worker.Work()
 }
 fmt.Println("worker start to eating")
 for _, worker := range c.workers {
  worker.Eat()
 }
 fmt.Println("worker get off work")
 for _, worker := range c.workers {
  worker.OffWork()
 }
 fmt.Printf("%s finish work\\n", c.Name)
}

// 公園
type Park struct {
 Name     string
 enjoyers []*entity.People
}
func (p *Park) Welcome(enjoyer *entity.People) {
 fmt.Printf("%+v come to park %s\\n", enjoyer.IdentityCard, p.Name)
 p.enjoyers = append(p.enjoyers, enjoyer)
}
// 執行Park的業務邏輯
func (p *Park) Run() {
 fmt.Printf("%s start to sell tickets\\n", p.Name)
 for _, enjoyer := range p.enjoyers {
  enjoyer.BuyTicket()
 }
 fmt.Printf("%s start a show\\n", p.Name)
 for _, enjoyer := range p.enjoyers {
  enjoyer.Enjoy()
 }
 fmt.Printf("show finish\\n")
}

那么,根據上述方法建模出來的模型是這樣的:

圖片

模型的運行方法如下:

paul := entity.NewPeople("Paul")
mit := aggregate.NewSchool("MIT")
google := aggregate.NewCompany("Google")
home := aggregate.NewHome()
summerPalace := aggregate.NewPark("Summer Palace")
// 上學
mit.Receive(paul)
mit.Run()
// 回家
home.ComeBack(paul)
home.Run()
// 工作
google.Employ(paul)
google.Run()
// 公園游玩
summerPalace.Welcome(paul)
summerPalace.Run()

貧血模型 VS 充血模型(工程派 VS 學院派)

上一節中,我們使用DDD的戰術建模完成了該案例領域模型。模型的核心是People實體,它有IdentityCardStudentCard等數據屬性,也有Eat()Study()Work()等業務行為 ,非常符合現實世界中定義。這也是學院派所倡導的,同時擁有數據屬性和業務行為的 充血模型

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 應用程序
    +關注

    關注

    38

    文章

    3322

    瀏覽量

    58698
  • DCI
    DCI
    +關注

    關注

    0

    文章

    40

    瀏覽量

    6965
  • 面向對象編程

    關注

    0

    文章

    22

    瀏覽量

    1901
收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    DCI 顛覆光器件產業?

    DCI的理念使產品設計思維陷入兩難境地。DCI引導行業深入研究了COB生產工藝,現在人們確實在COB工藝取得巨大推進。對于新技術的光模塊、DCI正成為首批商用的試驗場所。我們相信
    發表于 02-08 15:53

    Xilinx FPGA DCI使用方法

    各位大神,請問Xilinx FPGA中的DCI是如何使用的?我知道是把每個Bank的VRP、VRN管腳分別下拉、拉,除此之外,在HDL代碼和約束中應該如何寫呢?查了半天資料沒有查到,所以來論壇問問。@LQVSHQ
    發表于 08-20 20:51

    為什么銀行也沒有DCI匹配?

    在ml_605的示意圖中,我發現在一個銀行(例如銀行16)中混合了LVDS信號和信號端信號,所以銀行應該收起2.5v,并且銀行有DCI匹配。但是在銀行24(銀行混合了LVDS信號和信號端信號),所以
    發表于 10-25 08:47

    如何在IBIS文件中配置SSTL135 DCI阻抗

    嗨,我正在嘗試使用Hyperlynx來模擬K7的DDR3L設計。我使用Vivado write_ibis根據我的FPGA設計生成ibis文件。對于SSTL135_DCI_HP_IN50_I信號,我
    發表于 07-14 09:10

    使用KC705板晶振作為參考時鐘生成DCI和data,有很多跳動的雜波信號是怎么回事?

    最近配置AD9139的時候,分別采用了兩種方式。一種是直接使用KC705板晶振作為參考時鐘生成DCI和data,DAC單獨供參考時鐘,另一種是使用AD9139評估板分頻得到的DCO作為FPGA
    發表于 12-04 06:53

    MIPS聯手SySDSoft在MIPS 架構實現LTE技術

    MIPS聯手SySDSoft在MIPS 架構實現LTE技術 美普思科技公司(MIPS )和4G移動WiMAX、LTE嵌入式軟件方案領先供貨商SySDSoft公司宣布,雙方將合作實現
    發表于 03-01 11:28 ?615次閱讀

    MIPS和SySDSoft合作在MIPS架構實現LTE技術

    MIPS和SySDSoft合作在MIPS架構實現LTE技術  美普思科技公司和4G移動WiMAX、LTE嵌入式軟件方案領先供貨商SySDSoft公司宣布,雙方將合作實現MIPS
    發表于 03-02 10:17 ?629次閱讀

    MIPS科技和SySDSoft共同在MIPSTM 架構實現

    MIPS科技和SySDSoft共同在MIPSTM 架構實現LTE技術 美普思科技公司(MIPS Technologies)和SySDSoft公司宣布,雙方將合作實現MIPSTM
    發表于 03-03 10:00 ?927次閱讀

    DCI是什么?Xilinx 7系列FPGA的HP bank都支持DCI

    DCI的縮寫,應該也算上xilinx 在IO feature的一項技術(這不是7系列才有的新技術)。DCI從字面上看含義是可控制的阻抗,啟動DCI功能可以減少單板為阻抗匹配所需要的
    發表于 06-27 09:11 ?2w次閱讀
    <b class='flag-5'>DCI</b>是什么?Xilinx 7系列FPGA的HP bank都支持<b class='flag-5'>DCI</b>

    什么是DCI-BOX?為什么會出現這個東西?

    但為什么會出現這個東西?在我看來,主要是場景和成本兩方面決定。場景DCI-BOX說高大一點是面向新一代城域網的架構,如城域分發(POD),云網入網點(POP)等功能區的應用場景。
    的頭像 發表于 11-18 09:35 ?1.3w次閱讀

    DCI BOX與傳統WDM/OTN設備有什么區別?

    DCI-BOX,中國聯通叫模塊化波分設備,中國電信叫盒式波分設備DCI-BOX,是數據中心點到點互連(DCI)的設備。在DCI BOX出現之前,DC
    的頭像 發表于 03-26 14:29 ?2079次閱讀

    易飛揚非相干DCI BOX的DCI傳輸方案介紹

    易飛揚推出的最新1U 800G DWDM DCI BOX是一款1U盒式的多業務波分傳輸平臺,可滿足最大8×100GE業務點對點傳輸的應用場景,單機框常規接入容量800G。它同樣滿足DCI對小體積、低功耗、極簡維護、低時延、大帶寬的需求。
    發表于 04-21 10:39 ?728次閱讀

    非相干DCI BOX,提供更經濟的DCI傳輸方案

    易飛揚推出的最新1U 800G DWDM DCI BOX是一款1U盒式的多業務波分傳輸平臺,可滿足最大8×100GE業務點對點傳輸的應用場景,單機框常規接入容量800G。它同樣滿足DCI對小體積、低功耗、極簡維護、低時延、大帶寬的需求。
    的頭像 發表于 04-21 10:40 ?1105次閱讀

    非相干DCI BOX,提供更經濟的DCI傳輸方案

    上文,我們介紹了相干DCI BOX完美適配目前DCI傳輸的應用,不過,相干子系統的成本向來比較高,那是否有成本較低的非相干設備可供選擇?考慮到不同用戶的預算需求,易飛揚同樣提供經濟型的非相干DCI BOX,本文介紹的1U 800
    的頭像 發表于 04-24 09:46 ?1119次閱讀
    非相干<b class='flag-5'>DCI</b> BOX,提供更經濟的<b class='flag-5'>DCI</b>傳輸方案

    如何實現DCI架構(中)

    在面向對象編程的理念里,應用程序是對現實世界的抽象,我們經常會將現實中的事物建模為編程語言中的類/對象(“ **是什么** ”),而事物的行為則建模為方法(“ **做什么** ”)。面向對象編程有 **三大基本特性** (封裝、繼承/組合、多態)和 **五大基本原則** (單一職責原則、開放封閉原則、里氏替換原則、依賴倒置原則、接口分離原則),但知道這些還并不足以讓我們設計出好的程序,于是很多方法論就涌現了出來。
    的頭像 發表于 05-10 17:10 ?879次閱讀
    如何<b class='flag-5'>實現</b><b class='flag-5'>DCI</b><b class='flag-5'>架構</b>(中)
    主站蜘蛛池模板: 伊人久99久女女视频精品免 | 护士WC女子撒尿 | 亚洲99精品A片久久久久久 | 一区二区视频在线观看高清视频在线 | 三级黄.色 | 亚欧日韩毛片在线看免费网站 | 小伙无套内射老女人 | 一二三四免费中文在线1 | 精品亚洲AV无码蜜芽麻豆 | 精品无码久久久久久国产百度 | 国产99久久久国产精品免费看 | 美女叉腿掰阴大胆艺术照 | 白银谷在线观看 | 24小时日本免费看 | 香蕉 在线播放 | 亚洲AV香蕉一区区二区三区蜜桃 | 伊人大香线蕉精品在线播放 | 张开腿我尝尝你的草莓 | 99re8热视频这在线视频 | 97精品国偷拍自产在线 | av天堂电影网在线观看 | 毛片999| 亚洲国产成人综合 | 国产精品爆乳尤物99精品 | 欧洲美女高清一级毛片 | 色怕怕 | 亚洲国语在线视频手机在线 | 国产三区在线成人AV | 色多多旧版污污破解版 | 国产成人a在一区线观看高清 | 国产高清视频在线观看97 | 日韩欧美中文字幕在线二视频 | 亚洲精品无码不卡在线播放he | 国产高清美女一级毛片久久 | 欧美video巨大粗暴18 | 午夜伦理网 | 亚洲AV精品无码成人 | 邻家美姨在线观看全集免费 | 暖暖日本大全免费观看 | 日韩人妻少妇一区二区三区 | 国产免费人成在线视频有码 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品