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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

如何實現(xiàn)DCI架構(gòu)(上)

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

前言

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

近來最火的當屬領(lǐng)域驅(qū)動設(shè)計(DDD),其中戰(zhàn)術(shù)建模提出的實體、值對象、聚合等建模方法,能夠很好的指導(dǎo)我們設(shè)計出符合現(xiàn)實世界的領(lǐng)域模型。但DDD也不是萬能的,在某些應(yīng)用場景下,按照傳統(tǒng)的戰(zhàn)術(shù)建模/面向?qū)ο蠓椒ㄔO(shè)計出來的程序,也會存在可維護性差、違反單一職責原則等問題。

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

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

案例

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

圖片

使用DDD建模

按照DDD戰(zhàn)術(shù)建模的思路,首先,我們會列出該案例的 通用語言

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

接著,我們使用戰(zhàn)術(shù)建模技術(shù)( 值對象實體聚合領(lǐng)域服務(wù)資源庫 )對通用語言進行領(lǐng)域建模。

DDD建模后的代碼目錄結(jié)構(gòu)如下:

- 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),聚合由一個或多個實體、值對象組合而成,組織它們完成具體的業(yè)務(wù)邏輯:

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
}
// 執(zhí)行Home的業(yè)務(wù)邏輯
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)
}
// 執(zhí)行School的業(yè)務(wù)邏輯
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)
}
// 執(zhí)行Company的業(yè)務(wù)邏輯
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)
}
// 執(zhí)行Park的業(yè)務(wù)邏輯
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")
}

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

圖片

模型的運行方法如下:

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 學院派)

上一節(jié)中,我們使用DDD的戰(zhàn)術(shù)建模完成了該案例領(lǐng)域模型。模型的核心是People實體,它有IdentityCardStudentCard等數(shù)據(jù)屬性,也有Eat()Study()Work()等業(yè)務(wù)行為 ,非常符合現(xiàn)實世界中定義。這也是學院派所倡導(dǎo)的,同時擁有數(shù)據(jù)屬性和業(yè)務(wù)行為的 充血模型

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
收藏 人收藏

    評論

    相關(guān)推薦

    DCI 顛覆光器件產(chǎn)業(yè)?

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

    Xilinx FPGA DCI使用方法

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

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

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

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

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

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

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

    MIPS聯(lián)手SySDSoft在MIPS 架構(gòu)實現(xiàn)LTE技術(shù)

    MIPS聯(lián)手SySDSoft在MIPS 架構(gòu)實現(xiàn)LTE技術(shù) 美普思科技公司(MIPS )和4G移動WiMAX、LTE嵌入式軟件方案領(lǐng)先供貨商SySDSoft公司宣布,雙方將合作實現(xiàn)
    發(fā)表于 03-01 11:28 ?556次閱讀

    MIPS和SySDSoft合作在MIPS架構(gòu)實現(xiàn)LTE技術(shù)

    MIPS和SySDSoft合作在MIPS架構(gòu)實現(xiàn)LTE技術(shù)  美普思科技公司和4G移動WiMAX、LTE嵌入式軟件方案領(lǐng)先供貨商SySDSoft公司宣布,雙方將合作實現(xiàn)MIPS
    發(fā)表于 03-02 10:17 ?575次閱讀

    MIPS科技和SySDSoft共同在MIPSTM 架構(gòu)實現(xiàn)

    MIPS科技和SySDSoft共同在MIPSTM 架構(gòu)實現(xiàn)LTE技術(shù) 美普思科技公司(MIPS Technologies)和SySDSoft公司宣布,雙方將合作實現(xiàn)MIPSTM
    發(fā)表于 03-03 10:00 ?853次閱讀

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

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

    什么是DCI-BOX?為什么會出現(xiàn)這個東西?

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

    DCI BOX與傳統(tǒng)WDM/OTN設(shè)備有什么區(qū)別?

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

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

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

    非相干DCI BOX,提供更經(jīng)濟的DCI傳輸方案

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

    非相干DCI BOX,提供更經(jīng)濟的DCI傳輸方案

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

    如何實現(xiàn)DCI架構(gòu)(中)

    在面向?qū)ο缶幊痰睦砟罾铮瑧?yīng)用程序是對現(xiàn)實世界的抽象,我們經(jīng)常會將現(xiàn)實中的事物建模為編程語言中的類/對象(“ **是什么** ”),而事物的行為則建模為方法(“ **做什么** ”)。面向?qū)ο缶幊逃?**三大基本特性** (封裝、繼承/組合、多態(tài))和 **五大基本原則** (單一職責原則、開放封閉原則、里氏替換原則、依賴倒置原則、接口分離原則),但知道這些還并不足以讓我們設(shè)計出好的程序,于是很多方法論就涌現(xiàn)了出來。
    的頭像 發(fā)表于 05-10 17:10 ?670次閱讀
    如何<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>DCI</b><b class='flag-5'>架構(gòu)</b>(中)
    主站蜘蛛池模板: 小雪奶水涨翁工帮吸的推荐语录| 亚洲伊人精品综合在合线| 亚洲国产女人aaa毛片在线| 孕交videosgratis乌克兰| xxx在线播放| 国语92电影网午夜福利| 牛牛在线精品视频| 亚洲精品第五页中文字幕| 99在线免费观看| 花季v3.0.2黄在线观看| 日本久久久免费高清| 亚洲一区二区三区高清网| 成人国内精品久久久久影院| 精品国产自在现线拍400部| 欧美最猛黑人AAAAA片| 亚洲中文字幕乱码熟女在线| 大学生一级毛片免费看| 久久re这里精品23| 网友自拍区视频精品| 99热免费精品店| 九九热在线免费观看| 日本最新免费区中文| 中字幕久久久人妻熟女天美传媒| 国产成人精品久久久久婷婷| 蜜臀AV中文字幕熟女人妻| 亚洲精品午夜aaa级久久久久| FREE性丰满白嫩白嫩的HD| 久久才是精品亚洲国产| 婷婷综合亚洲爱久久| av色天堂2018在线观看| 久久vs国产综合色| 小p孩玩成年女性啪啪资源| wwww69| 恋夜直播午夜秀场最新| 亚洲国产精品热久久| 观赏女性排尿| 欧美最猛黑人XXXXWWW| 3D动漫网站HOXXXxes| 久久re这里视频只有精品首页| 亚州三级视频| 国产精品…在线观看|