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

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

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

3天內不再提示

如何實現DCI架構(中)

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

然而,充血模型并非完美,它也有很多問題,比較典型的是這兩個:

問題一:上帝類

People這個實體包含了太多的職責,導致它變成了一個名副其實的上帝類。試想,這里還是裁剪了很多“人”所包含的屬性和行為,如果要建模一個完整的模型,其屬性和方法之多,無法想象。 上帝類違反了單一職責原則,會導致代碼的可維護性變得極差

問題二:模塊間耦合

SchoolCompany本應該是相互獨立的,School不必關注上班與否,Company也不必關注考試與否。但是現在因為它們都依賴了People這個實體,School可以調用與Company相關的Work()OffWork()方法,反之亦然。這導致 模塊間產生了不必要的耦合,違反了接口隔離原則

這些問題都是工程派不能接受的,從軟件工程的角度,它們會使得代碼難以維護。解決這類問題的方法,比較常見的是對實體進行拆分,比如將實體的行為建模成 領域服務 ,像這樣:

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

type StudentService struct{}
func (s *StudentService) Study(p *entity.People) {
 fmt.Printf("Student %+v studying\\n", p.StudentCard)
}
func (s *StudentService) Exam(p *entity.People) {
 fmt.Printf("Student %+v examing\\n", p.StudentCard)
}

type WorkerService struct{}
func (w *WorkerService) Work(p *entity.People) {
 fmt.Printf("%+v working\\n", p.WorkCard)
 p.Account.Balance++
}
func (w *WorkerService) OffWOrk(p *entity.People) {
 fmt.Printf("%+v getting off work\\n", p.WorkCard)
}

// ...

圖片

這種建模方法,解決了上述兩個問題,但也變成了所謂的 貧血模型People變成了一個純粹的數據類,沒有任何業務行為。在人的心理上,這樣的模型并不能在建立起對現實世界的對應關系,不容易讓人理解,因此被學院派所抵制。

到目前為止,貧血模型和充血模型都有各有優缺點,工程派和學院派誰都無法說服對方。接下來,輪到本文的主角出場了。

DCI架構

DCI (Data,Context,Interactive)架構是一種面向對象的軟件架構模式,在《The DCI Architecture: A New Vision of Object-Oriented Programming》一文中被首次提出。與傳統的面向對象相比,DCI能更好地對數據和行為之間的關系進行建模,從而更容易被人理解。

  • Data ,也即數據/領域對象,用來描述系統“是什么”,通常采用DDD中的戰術建模來識別當前模型的領域對象,等同于DDD分層架構中的領域層。
  • Context ,也即場景,可理解為是系統的Use Case,代表了系統的業務處理流程,等同于DDD分層架構中的應用層。
  • Interactive ,也即交互,是DCI相對于傳統面向對象的最大發展,它認為我們應該顯式地對領域對象( Object )在每個業務場景(Context)中扮演( Cast )的角色( Role )進行建模。 Role代表了領域對象在業務場景中的業務行為(“做什么”),Role之間通過交互完成完整的義務流程

這種角色扮演的模型我們并不陌生,在現實的世界里也是隨處可見,比如,一個演員可以在這部電影里扮演英雄的角色,也可以在另一部電影里扮演反派的角色。

DCI認為,對Role的建模應該是面向Context的,因為特定的業務行為只有在特定的業務場景下才會有意義。通過對Role的建模,我們就能夠將領域對象的方法拆分出去,從而避免了上帝類的出現。最后,領域對象通過組合或繼承的方式將Role集成起來,從而具備了扮演角色的能力。

圖片

DCI架構一方面通過角色扮演模型使得領域模型易于理解,另一方面通過“ 小類大對象 ”的手法避免了上帝類的問題,從而較好地解決了貧血模型和充血模型之爭。另外,將領域對象的行為根據Role拆分之后,模塊更加的高內聚、低耦合了。

使用DCI建模

回到前面的案例,使用DCI的建模思路,我們可以將“人”的幾種行為按照不同的角色進行劃分。吃完、睡覺、玩游戲,是作為人類角色的行為;學習、考試,是作為學生角色的行為;上班、下班,是作為員工角色的行為;購票、游玩,則是作為游玩者角色的行為。“人”在這個場景中,充當的是人類的角色;在學校這個場景中,充當的是學生的角色;在公司這個場景中,充當的是員工的角色;在公園這個場景中,充當的是游玩者的角色。

圖片

需要注意的是,學生、員工、游玩者,這些角色都應該具備人類角色的行為,比如在學校里,學生也需要吃飯。

最后,根據DCI建模出來的模型,應該是這樣的:

圖片

在DCI模型中,People不再是一個包含眾多屬性和方法的“上帝類”,這些屬性和方法被拆分到多個Role中實現,而People由這些Role組合而成。

另外,SchoolCompany也不再耦合,School只引用了Student,不能調用與Company相關的WorkerWork()OffWorker()方法。

圖片

代碼實現DCI模型

DCI建模后的代碼目錄結構如下;

- context: 場景
  - company.go
  - home.go
  - park.go
  - school.go
- object: 對象
  - people.go
- data: 數據
  - account.go
  - identity_card.go
  - student_card.go
  - work_card.go
- role: 角色
  - enjoyer.go
  - human.go
  - student.go
  - worker.go

從代碼目錄結構上看,DDD和DCI架構相差并不大,aggregate目錄演變成了context目錄;vo目錄演變成了data目錄;entity目錄則演變成了objectrole目錄。

首先,我們實現基礎角色HumanStudentWorkerEnjoyer都需要組合它:

package role

// 人類角色
type Human struct {
 data.IdentityCard
 data.Account
}
func (h *Human) Eat() {
 fmt.Printf("%+v eating\\n", h.IdentityCard)
 h.Account.Balance--
}
func (h *Human) Sleep() {
 fmt.Printf("%+v sleeping\\n", h.IdentityCard)
}
func (h *Human) PlayGame() {
 fmt.Printf("%+v playing game\\n", h.IdentityCard)
}

接著,我們再實現其他角色,需要注意的是, StudentWorkerEnjoyer不能直接組合Human ,否則People對象將會有4個Human子對象,與模型不符:

// 錯誤的實現
type Worker struct {
 Human
}
func (w *Worker) Work() {
 fmt.Printf("%+v working\\n", w.WorkCard)
 w.Balance++
}
...
type People struct {
 Human
 Student
 Worker
 Enjoyer
}
func main() {
 people := People{}
  fmt.Printf("People: %+v", people)
}
// 結果輸出, People中有4個Human:
// People: {Human:{} Student:{Human:{}} Worker:{Human:{}} Enjoyer:{Human:{}}}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編程語言
    +關注

    關注

    10

    文章

    1939

    瀏覽量

    34607
  • 應用程序
    +關注

    關注

    37

    文章

    3245

    瀏覽量

    57614
  • DCI
    DCI
    +關注

    關注

    0

    文章

    39

    瀏覽量

    6808
  • 面向對象編程

    關注

    0

    文章

    22

    瀏覽量

    1807
收藏 人收藏

    評論

    相關推薦

    DCI 顛覆光器件產業?

    從不成熟到成熟的推進劑,但是DCI肯定要為此付出一點代價!關于技術架構DCI早先采用一種分布式架構。但是不知道為什么DCI現在熱衷CWDM
    發表于 02-08 15:53

    Xilinx FPGA DCI使用方法

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

    DDR3控制器和SSTL15_T_DCI在同一個bank

    你好,我使用Virtex7的HP庫來實現DDR3控制器。我的控制器將以1600Mbps的速度運行,因此主控制器的VRN和VRP應連接一個80Ω電阻,以實現更高的性能。實現addr /
    發表于 03-25 11:04

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

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

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

    用作輸入時并聯施加GND和PWR設置?如何為我的電路板設計中使用的較低DCI阻抗正確配置IBIS文件?有人建議在設計添加外部終端電阻以進行仿真。但是,對于這些雙向線路,DCI僅在充當輸入時才有效。那些外部電阻會在輸出期間產生負
    發表于 07-14 09:10

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

    Xilinx 7系列FPGA的HP bank都支持DCI,目的是在高速單板信號傳輸中保持信號完整性,減少反射等因素影響,那么DCI是什么?digitally controlled impedance
    發表于 06-27 09:11 ?1.9w次閱讀
    <b class='flag-5'>DCI</b>是什么?Xilinx 7系列FPGA的HP bank都支持<b class='flag-5'>DCI</b>

    一種AUTOSAR軟件架構RTE的實現方法

    介紹了一種AUTOSAR軟件架構RTE的實現方法。
    發表于 07-13 16:02 ?6次下載

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

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

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

    DCI BOX出現之前,DCI通常使用WDM/OTN設備進行互連,那么兩者之間有什么區別呢?
    的頭像 發表于 03-27 15:37 ?1105次閱讀

    易飛揚全新升級DCI BOX,照亮DCI傳輸網絡

    易飛揚2U 6.4T DCI BOX
    的頭像 發表于 04-14 17:46 ?1112次閱讀
    易飛揚全新升級<b class='flag-5'>DCI</b> BOX,照亮<b class='flag-5'>DCI</b>傳輸網絡

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

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

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

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

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

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

    如何實現DCI架構(上)

    在面向對象編程的理念里,應用程序是對現實世界的抽象,我們經常會將現實的事物建模為編程語言中的類/對象(“ **是什么** ”),而事物的行為則建模為方法(“ **做什么** ”)。面向對象編程有
    的頭像 發表于 05-10 17:09 ?678次閱讀
    如何<b class='flag-5'>實現</b><b class='flag-5'>DCI</b><b class='flag-5'>架構</b>(上)

    如何實現DCI架構(下)

    在面向對象編程的理念里,應用程序是對現實世界的抽象,我們經常會將現實的事物建模為編程語言中的類/對象(“ **是什么** ”),而事物的行為則建模為方法(“ **做什么** ”)。面向對象編程有
    的頭像 發表于 05-10 17:10 ?574次閱讀