DCI和繼承並不矛盾
DCI和繼承並不矛盾
DCI背後概念是將互動行為從領域模型中分離出來,這些互動行為被放置於另外一個Role角色物件中,只有在業務需要的一個場景下,角色在執行時刻被分配(注射)給這個領域模型。
文章列車Ruby的DCI實現
FootballGameContext和ShopContext是人分別參與的兩個場景:足球遊戲和購物,人還是那個人,只不過在這兩個場景下被賦予了角色的業務行為。
作者認為DCI是一個非常有前途的程式設計正規化,解決了一些OOP問題,但他說沒有看到什麼大程度應用是用DCI寫的,因此好像沒有證據就此證明DCI用mixin或等設計模式會比傳統OOP更清晰 更可讀。DCI因為不成熟缺乏模式遵循,主要問題之一是何時及如何定義一個場景上下文Context還比較模糊。(banq認為如果結合領域事件,場景隱含,由事件代表可解決這個問題)
繼承是OOp傳統基本技術,描述資料模型之間的"is-a"關係,繼承會導致不可維護的程式碼,被一些人認為是邪惡的,有很多方法可替代繼承,如Mixin 策略模式和介面卡模式。
作者認為以他的經驗,每種方式都有其最合適的使用前提和場景。
作者展示了繼承和DCI一起使用的案例。
banQ觀點:其實繼承和DCI是從不同角度的思考,繼承是從純業務角度思考,兒子繼承父親,這是業務領域正常的方式,你只能用繼承表達;而DCI則是一種軟體實現方法,不是業務的對映工具或方法,而是處理業務的方法和工具,可以讓業務更靈活一些,兩個邊界不同,無可比擬性。
DCI背後概念是將互動行為從領域模型中分離出來,這些互動行為被放置於另外一個Role角色物件中,只有在業務需要的一個場景下,角色在執行時刻被分配(注射)給這個領域模型。
文章列車Ruby的DCI實現
class Person attr_reader :[author]name[/author] def initialize([author]name[/author]) @[author]name[/author] = [author]name[/author] end end person = Person.new("Trygve Reenskaug") module Buyer def buy(item) # buying logic end end module FootballPlayer def kick_ball(ball) # kicking ball logic end def run # running logic end end def FootballGameContext person.mixin FootballPlayer person.run person.kick_ball(ball) person.unmix FootballPlayer end def ShopContext person.mixin Buyer person.buy(milk) end <p class="indent"> |
FootballGameContext和ShopContext是人分別參與的兩個場景:足球遊戲和購物,人還是那個人,只不過在這兩個場景下被賦予了角色的業務行為。
作者認為DCI是一個非常有前途的程式設計正規化,解決了一些OOP問題,但他說沒有看到什麼大程度應用是用DCI寫的,因此好像沒有證據就此證明DCI用mixin或等設計模式會比傳統OOP更清晰 更可讀。DCI因為不成熟缺乏模式遵循,主要問題之一是何時及如何定義一個場景上下文Context還比較模糊。(banq認為如果結合領域事件,場景隱含,由事件代表可解決這個問題)
繼承是OOp傳統基本技術,描述資料模型之間的"is-a"關係,繼承會導致不可維護的程式碼,被一些人認為是邪惡的,有很多方法可替代繼承,如Mixin 策略模式和介面卡模式。
作者認為以他的經驗,每種方式都有其最合適的使用前提和場景。
作者展示了繼承和DCI一起使用的案例。
banQ觀點:其實繼承和DCI是從不同角度的思考,繼承是從純業務角度思考,兒子繼承父親,這是業務領域正常的方式,你只能用繼承表達;而DCI則是一種軟體實現方法,不是業務的對映工具或方法,而是處理業務的方法和工具,可以讓業務更靈活一些,兩個邊界不同,無可比擬性。
[該貼被banq於2011-09-10 18:15修改過]
相關文章
- JS原型繼承和類式繼承JS原型繼承
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- 原型和繼承原型繼承
- 公有繼承、私有繼承和保護繼承之間的對比繼承
- es5繼承和es6類和繼承繼承
- 封裝和繼承封裝繼承
- Javascript 繼承和克隆JavaScript繼承
- Java繼承和介面Java繼承
- 【Maven】聚合和繼承Maven繼承
- 繼承和多型繼承多型
- JavaScript原型和繼承JavaScript原型繼承
- 多型和繼承多型繼承
- 原型,繼承——原型繼承原型繼承
- 菱形繼承,虛繼承繼承
- 征服 JavaScript 面試:類繼承和原型繼承的區別JavaScript面試繼承原型
- 多繼承 與 多重繼承繼承
- javascript的原型和繼承JavaScript原型繼承
- 類的繼承和派生繼承
- C++繼承詳解:共有(public)繼承,私有(private)繼承,保護(protected)繼承C++繼承
- css可繼承屬性和非繼承屬性一覽CSS繼承
- 從本質認識JavaScript的原型繼承和類繼承JavaScript原型繼承
- 三種繼承的方法:public 繼承/private繼承/protected繼承詳解及區別繼承
- Javascript繼承4:潔淨的繼承者—-原型式繼承JavaScript繼承原型
- Javascript繼承2:建立即繼承—-建構函式繼承JavaScript繼承函式
- 繼承繼承
- Python 繼承 和 多型Python繼承多型
- OOP的多型和繼承OOP多型繼承
- Java之繼承和抽象類Java繼承抽象
- JS的原型鏈和繼承JS原型繼承
- CSS的繼承和使用方式CSS繼承
- [C++]繼承和派生類C++繼承
- JavaScript中的原型和繼承JavaScript原型繼承
- 繼承 重寫和抽象類繼承抽象
- 封裝、繼承和多型封裝繼承多型
- C++繼承一之公有繼承C++繼承
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- day23:單繼承&多繼承&菱形繼承&__init__魔術方法繼承
- 類的繼承_子類繼承父類繼承