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

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

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

如何實(shí)現(xiàn)DCI架構(gòu)(下)

jf_78858299 ? 來(lái)源:元閏子的邀請(qǐng) ? 作者:元閏子 ? 2023-05-10 17:10 ? 次閱讀

為解決該問題,我們引入了xxxTrait接口

// 人類角色特征
type HumanTrait interface {
 CastHuman() *Human
}
// 學(xué)生角色特征
type StudentTrait interface {
 CastStudent() *Student
}
// 員工角色特征
type WorkerTrait interface {
 CastWorker() *Worker
}
// 游玩者角色特征
type EnjoyerTrait interface {
 CastEnjoyer() *Enjoyer
}

Student、Worker、Enjoyer組合HumanTrait,并通過Compose(HumanTrait)方法進(jìn)行特征注入,只要在注入的時(shí)候保證Human是同一個(gè),就可以解決該問題了。

// 學(xué)生角色
type Student struct {
 // Student同時(shí)也是個(gè)普通人,因此組合了Human角色
 HumanTrait
 data.StudentCard
}
// 注入人類角色特征
func (s *Student) Compose(trait HumanTrait) {
 s.HumanTrait = trait
}
func (s *Student) Study() {
 fmt.Printf("Student %+v studying\\n", s.StudentCard)
}
func (s *Student) Exam() {
 fmt.Printf("Student %+v examing\\n", s.StudentCard)
}

// 員工角色
type Worker struct {
 // Worker同時(shí)也是個(gè)普通人,因此組合了Human角色
 HumanTrait
 data.WorkCard
}
// 注入人類角色特征
func (w *Worker) Compose(trait HumanTrait) {
 w.HumanTrait = trait
}
func (w *Worker) Work() {
 fmt.Printf("%+v working\\n", w.WorkCard)
 w.CastHuman().Balance++
}
func (w *Worker) OffWork() {
 fmt.Printf("%+v getting off work\\n", w.WorkCard)
}

// 游玩者角色
type Enjoyer struct {
 // Enjoyer同時(shí)也是個(gè)普通人,因此組合了Human角色
 HumanTrait
}
// 注入人類角色特征
func (e *Enjoyer) Compose(trait HumanTrait) {
 e.HumanTrait = trait
}
func (e *Enjoyer) BuyTicket() {
 fmt.Printf("%+v buying a ticket\\n", e.CastHuman().IdentityCard)
 e.CastHuman().Balance--
}
func (e *Enjoyer) Enjoy() {
 fmt.Printf("%+v enjoying scenery\\n", e.CastHuman().IdentityCard)
}

最后,實(shí)現(xiàn)People這一領(lǐng)域?qū)ο螅?/p>

package object

type People struct {
 // People對(duì)象扮演的角色
 role.Human
 role.Student
 role.Worker
 role.Enjoyer
}
// People實(shí)現(xiàn)了HumanTrait、StudentTrait、WorkerTrait、EnjoyerTrait等特征接口
func (p *People) CastHuman() *role.Human {
 return &p.Human
}
func (p *People) CastStudent() *role.Student {
 return &p.Student
}
func (p *People) CastWorker() *role.Worker {
 return &p.Worker
}
func (p *People) CastEnjoyer() *role.Enjoyer {
 return &p.Enjoyer
}
// People在初始化時(shí),完成對(duì)角色特征的注入
func NewPeople(name string) *People {
  // 一些初始化的邏輯...
 people.Student.Compose(people)
 people.Worker.Compose(people)
 people.Enjoyer.Compose(people)
 return people
}

進(jìn)行角色拆分之后,在實(shí)現(xiàn)HomeSchool、Company、Park等場(chǎng)景時(shí),只需依賴相應(yīng)的角色即可,不再需要依賴People這一領(lǐng)域?qū)ο螅?/p>

// 家
type Home struct {
 me *role.Human
}
func (h *Home) ComeBack(human *role.Human) {
 fmt.Printf("%+v come back home\\n", human.IdentityCard)
 h.me = human
}
// 執(zhí)行Home的業(yè)務(wù)邏輯
func (h *Home) Run() {
 h.me.Eat()
 h.me.PlayGame()
 h.me.Sleep()
}

// 學(xué)校
type School struct {
 Name     string
 students []*role.Student
}
func (s *School) Receive(student *role.Student) {
  // 初始化StduentCard邏輯 ...
 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.CastHuman().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 []*role.Worker
}
func (c *Company) Employ(worker *role.Worker) {
  // 初始化WorkCard邏輯 ...
  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.CastHuman().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 []*role.Enjoyer
}
func (p *Park) Welcome(enjoyer *role.Enjoyer) {
 fmt.Printf("%+v come park %s\\n", enjoyer.CastHuman().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")
}

模型的運(yùn)行方法如下:

paul := object.NewPeople("Paul")
mit := context.NewSchool("MIT")
google := context.NewCompany("Google")
home := context.NewHome()
summerPalace := context.NewPark("Summer Palace")

// 上學(xué)
mit.Receive(paul.CastStudent())
mit.Run()
// 回家
home.ComeBack(paul.CastHuman())
home.Run()
// 工作
google.Employ(paul.CastWorker())
google.Run()
// 公園游玩
summerPalace.Welcome(paul.CastEnjoyer())
summerPalace.Run()

寫在最后

從前文所描述的場(chǎng)景中,我們可以發(fā)現(xiàn)傳統(tǒng)的DDD/面向?qū)ο笤O(shè)計(jì)方法在對(duì)行為進(jìn)行建模方面存在著不足,進(jìn)而導(dǎo)致了所謂的 貧血模型和充血模型之爭(zhēng) 。

DCI架構(gòu)的出現(xiàn)很好的彌補(bǔ)了這一點(diǎn),它通過引入角色扮演的思想,巧妙地解決了充血模型中上帝類和模塊間耦合問題,而且不影響模型的正確性。當(dāng)然,DCI架構(gòu)也不是萬(wàn)能的,在行為較少的業(yè)務(wù)模型中,使用DCI來(lái)建模并不合適。

最后,將DCI架構(gòu)總結(jié)成一句話就是: 領(lǐng)域?qū)ο螅∣bject)在不同的場(chǎng)景(Context)中扮演(Cast)不同的角色(Role),角色之間通過交互(Interactive)來(lái)完成具體的業(yè)務(wù)邏輯 。

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

    評(píng)論

    相關(guān)推薦

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

    會(huì)遍嘗苦果,但是這種重新定義行業(yè)標(biāo)準(zhǔn)的大膽的行動(dòng),一子顛覆了人們的認(rèn)知。光器件未來(lái)到底要遵循什么樣的技術(shù)和質(zhì)量標(biāo)準(zhǔn)?由于光模塊不僅要使用于低環(huán)境要求的DCI,也需要使用于其它如電信應(yīng)用的高標(biāo)準(zhǔn)環(huán)境
    發(fā)表于 02-08 15:53

    DDR3控制器和SSTL15_T_DCI在同一個(gè)bank中

    你好,我使用Virtex7的HP庫(kù)來(lái)實(shí)現(xiàn)DDR3控制器。我的控制器將以1600Mbps的速度運(yùn)行,因此主控制器中的VRN和VRP應(yīng)連接一個(gè)80Ω電阻,以實(shí)現(xiàn)更高的性能。實(shí)現(xiàn)addr / cmd信號(hào)
    發(fā)表于 03-25 11:04

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

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

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

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

    GD32F207-DCI

    單片機(jī)GD32F207學(xué)習(xí)例程之GD32F207-DCI例程源碼
    發(fā)表于 06-03 15:40 ?10次下載

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

    Xilinx 7系列FPGA的HP bank都支持DCI,目的是在高速單板信號(hào)傳輸中保持信號(hào)完整性,減少反射等因素影響,那么DCI是什么?digitally controlled impedance
    發(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?為什么會(huì)出現(xiàn)這個(gè)東西?

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

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

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

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

    DCI BOX出現(xiàn)之前,DCI通常使用WDM/OTN設(shè)備進(jìn)行互連,那么兩者之間有什么區(qū)別呢?
    的頭像 發(fā)表于 03-27 15:37 ?1031次閱讀

    易飛揚(yáng)全新升級(jí)DCI BOX,照亮DCI傳輸網(wǎng)絡(luò)

    易飛揚(yáng)2U 6.4T DCI BOX
    的頭像 發(fā)表于 04-14 17:46 ?1064次閱讀
    易飛揚(yáng)全新升級(jí)<b class='flag-5'>DCI</b> BOX,照亮<b class='flag-5'>DCI</b>傳輸網(wǎng)絡(luò)

    易飛揚(yáng)非相干DCI BOX的DCI傳輸方案介紹

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

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

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

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

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

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

    在面向?qū)ο缶幊痰睦砟罾?,?yīng)用程序是對(duì)現(xiàn)實(shí)世界的抽象,我們經(jīng)常會(huì)將現(xiàn)實(shí)中的事物建模為編程語(yǔ)言中的類/對(duì)象(“ **是什么** ”),而事物的行為則建模為方法(“ **做什么** ”)。面向?qū)ο缶幊逃?**三大基本特性** (封裝、繼承/組合、多態(tài))和 **五大基本原則** (單一職責(zé)原則、開放封閉原則、里氏替換原則、依賴倒置原則、接口分離原則),但知道這些還并不足以讓我們?cè)O(shè)計(jì)出好的程序,于是很多方法論就涌現(xiàn)了出來(lái)。
    的頭像 發(fā)表于 05-10 17:09 ?625次閱讀
    如何<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>DCI</b><b class='flag-5'>架構(gòu)</b>(上)

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

    在面向?qū)ο缶幊痰睦砟罾?,?yīng)用程序是對(duì)現(xiàn)實(shí)世界的抽象,我們經(jīng)常會(huì)將現(xiàn)實(shí)中的事物建模為編程語(yǔ)言中的類/對(duì)象(“ **是什么** ”),而事物的行為則建模為方法(“ **做什么** ”)。面向?qū)ο缶幊逃?**三大基本特性** (封裝、繼承/組合、多態(tài))和 **五大基本原則** (單一職責(zé)原則、開放封閉原則、里氏替換原則、依賴倒置原則、接口分離原則),但知道這些還并不足以讓我們?cè)O(shè)計(jì)出好的程序,于是很多方法論就涌現(xiàn)了出來(lái)。
    的頭像 發(fā)表于 05-10 17:10 ?618次閱讀
    如何<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>DCI</b><b class='flag-5'>架構(gòu)</b>(中)