精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

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

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

前言

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

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

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

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

案例

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

圖片

使用DDD建模

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

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

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

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

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è)務邏輯
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è)務邏輯
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è)務邏輯
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è)務邏輯
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)術建模完成了該案例領域模型。模型的核心是People實體,它有IdentityCardStudentCard等數(shù)據(jù)屬性,也有Eat()Study()Work()等業(yè)務行為 ,非常符合現(xiàn)實世界中定義。這也是學院派所倡導的,同時擁有數(shù)據(jù)屬性和業(yè)務行為的 充血模型

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

    關注

    37

    文章

    3240

    瀏覽量

    57600
  • DCI
    DCI
    +關注

    關注

    0

    文章

    39

    瀏覽量

    6806
  • 面向對象編程

    關注

    0

    文章

    22

    瀏覽量

    1807
收藏 人收藏

    評論

    相關推薦

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

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

    Xilinx FPGA DCI使用方法

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

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

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

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

    嗨,我正在嘗試使用Hyperlynx來模擬K7的DDR3L設計。我使用Vivado write_ibis根據(jù)我的FPGA設計生成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 架構實現(xiàn)LTE技術

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

    MIPS和SySDSoft合作在MIPS架構實現(xiàn)LTE技術

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

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

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

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

    DCI的縮寫,應該也算上xilinx 在IO feature的一項技術(這不是7系列才有的新技術)。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)的架構,如城域分發(fā)(POD),云網(wǎng)入網(wǎng)點(POP)等功能區(qū)的應用場景。
    的頭像 發(fā)表于 11-18 09:35 ?1.2w次閱讀

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

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

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

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

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

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

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

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

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

    在面向對象編程的理念里,應用程序是對現(xiàn)實世界的抽象,我們經常會將現(xiàn)實中的事物建模為編程語言中的類/對象(“ **是什么** ”),而事物的行為則建模為方法(“ **做什么** ”)。面向對象編程有 **三大基本特性** (封裝、繼承/組合、多態(tài))和 **五大基本原則** (單一職責原則、開放封閉原則、里氏替換原則、依賴倒置原則、接口分離原則),但知道這些還并不足以讓我們設計出好的程序,于是很多方法論就涌現(xiàn)了出來。
    的頭像 發(fā)表于 05-10 17:10 ?655次閱讀
    如何<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>DCI</b><b class='flag-5'>架構</b>(中)