一级毛片免费不卡在线视频,国产日批视频免费在线观看,菠萝菠萝蜜在线视频免费视频,欧美日韩亚洲无线码在线观看,久久精品这里精品,国产成人综合手机在线播放,色噜噜狠狠狠综合曰曰曰,琪琪视频

經(jīng)典的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)在代碼實(shí)踐方面的心得體會(huì)

時(shí)間:2023-04-28 11:24:37 心得體會(huì) 我要投稿
  • 相關(guān)推薦

經(jīng)典的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)在代碼實(shí)踐方面的心得體會(huì)

創(chuàng)建領(lǐng)域?qū)ο蟛捎脴?gòu)造函數(shù)或者工廠,如果用工廠時(shí)需要依賴于領(lǐng)域服務(wù)或倉(cāng)儲(chǔ),則通過(guò)構(gòu)造函數(shù)注入到工廠;

  領(lǐng)域服務(wù)可以依賴倉(cāng)儲(chǔ)或聚合根;

經(jīng)典的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)在代碼實(shí)踐方面的心得體會(huì)

  一個(gè)聚合根配備一個(gè)倉(cāng)儲(chǔ);

  倉(cāng)儲(chǔ)應(yīng)理解為一個(gè)在內(nèi)存中維護(hù)一系列聚合根的集合;

  一個(gè)聚合有一個(gè)聚合根,聚合根也是一個(gè)Entity,聚合內(nèi)還有其他Entity和Value Object;

  倉(cāng)儲(chǔ)提供的方法應(yīng)該總是接受聚合根或返回聚合根,不能返回聚合內(nèi)的其他Entity或Value Object;

  聚合內(nèi)的非跟的Entity以及Value Object之間不要相互引用,聚合內(nèi)的所有Child可以對(duì)根Entity持有引用,如果一個(gè)Child Entity需要和另外一個(gè)Child Entity交互,則因該通過(guò)聚合根完成;

  聚合根與聚合根之間應(yīng)避免直接對(duì)象引用,而應(yīng)該采用ID關(guān)聯(lián);聚合根與聚合根之間的關(guān)系不像聚合內(nèi)的Entity之間這么強(qiáng)烈內(nèi)聚,它們之間僅僅是某種比較弱的關(guān)聯(lián)關(guān)系,每個(gè)聚合根都有其獨(dú)立的生命周期;

  聚合根之間通過(guò)ID關(guān)聯(lián)的好處是:不會(huì)因?yàn)長(zhǎng)oad一個(gè)聚合根而把其他關(guān)聯(lián)的聚合根一起Load出來(lái),這樣也避免了Load一個(gè)聚合根會(huì)把整個(gè)數(shù)據(jù)庫(kù)Load出來(lái)的風(fēng)險(xiǎn);

  我們應(yīng)該盡量減少關(guān)聯(lián),盡量做到單向關(guān)聯(lián),只保留確實(shí)需要處理的經(jīng)常需要用到的遍歷方向的關(guān)聯(lián);

  如果一個(gè)操作僅由一個(gè)聚合根就可以完成,那么直接調(diào)用該聚合根完成即可;

  如果一個(gè)操作我們會(huì)遇見(jiàn)到會(huì)由多個(gè)聚合根相互協(xié)作完成,那么需要為該操作建立領(lǐng)域服務(wù),在領(lǐng)域服務(wù)中以過(guò)程化的方式來(lái)一步步調(diào)用相關(guān)的聚合根完成整個(gè)業(yè)務(wù)操作;

  切忌不要因?yàn)轭I(lǐng)域服務(wù)的引入讓聚合根變得貧血,聚合根應(yīng)該有職責(zé)還是必須要由聚合根來(lái)承擔(dān);

  聚合根內(nèi)不要依賴領(lǐng)域服務(wù)或倉(cāng)儲(chǔ),如果你發(fā)現(xiàn)一個(gè)聚合根的職責(zé)需要依賴于某個(gè)領(lǐng)域服務(wù)或倉(cāng)儲(chǔ)來(lái)幫忙完成一些其他的邏輯(像判斷業(yè)務(wù)規(guī)則之類),那么通常你要考慮這個(gè)職責(zé)不應(yīng)該由該聚合根來(lái)承擔(dān),而應(yīng)該建立合適的領(lǐng)域服務(wù)來(lái)承擔(dān);聚合根的主要職責(zé)是管理其內(nèi)聚的所有Child Entity或Value Object的業(yè)務(wù)完整性;

  領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)時(shí),為對(duì)象分配職責(zé)時(shí),可以參考信息專家模式:將職責(zé)分配給擁有執(zhí)行該職責(zé)所需信息的人;如果一個(gè)聚合根看起來(lái)?yè)碛袌?zhí)行某個(gè)職責(zé)所需的信息,但沒(méi)包含全部所需信息,此時(shí)則不應(yīng)該將該職責(zé)分配給該聚合根,因?yàn)閺?qiáng)行分配給它,會(huì)導(dǎo)致該聚合根沒(méi)有內(nèi)聚性,因?yàn)閯?shì)必會(huì)依賴于其它的領(lǐng)域?qū)ο蠡蝾I(lǐng)域服務(wù)或倉(cāng)儲(chǔ);

  聚合內(nèi)的所有實(shí)體和值對(duì)象應(yīng)該總是一起被取出來(lái)一起被保存,因?yàn)橐粋(gè)聚合是一個(gè)數(shù)據(jù)持久化的單元,不需要考慮將整個(gè)聚合根取出來(lái)有性能問(wèn)題,因?yàn)槿魏我粋(gè)聚合根都有明確的邊界。目前的內(nèi)存緩存框架都已發(fā)展的比較成熟,性能已經(jīng)不是問(wèn)題;如MongoDb,MemCache,NoSQL,等等;

  不要給倉(cāng)儲(chǔ)提供一些目的是為了為界面提供顯示數(shù)據(jù)的接口,倉(cāng)儲(chǔ)提供的所有接口僅為領(lǐng)域模型使用;

  要學(xué)習(xí)CQRS架構(gòu),要知道我們應(yīng)該將應(yīng)用程序的業(yè)務(wù)邏輯處理部分(即用戶命令響應(yīng)部分)和查詢部分分離;我們應(yīng)該用兩個(gè)不同的技術(shù)來(lái)實(shí)現(xiàn)這兩個(gè)部分的實(shí)現(xiàn);用DDD領(lǐng)域模型來(lái)實(shí)現(xiàn)命令部分;用最快的查詢引擎來(lái)實(shí)現(xiàn)查詢部分;

  如果要采用CQRS架構(gòu),我們需要考慮一個(gè)成熟可靠的底層框架,否則很容易導(dǎo)致命令端產(chǎn)生的領(lǐng)域?qū)ο蟮臓顟B(tài)無(wú)法同步(后者丟失)到查詢端的存儲(chǔ)中;

  領(lǐng)域服務(wù)依賴倉(cāng)儲(chǔ)時(shí),工廠依賴于領(lǐng)域服務(wù)或倉(cāng)儲(chǔ)時(shí),都因該采用構(gòu)造函數(shù)注入的方式,這樣可以避免領(lǐng)域模型中不會(huì)出現(xiàn)DependencyResolver.Resolve<T>()這樣的語(yǔ)句;

  不要把倉(cāng)儲(chǔ)理解為DAO,倉(cāng)儲(chǔ)屬于領(lǐng)域模型的一部分,代表了領(lǐng)域模型向外提供接口的一部分,而DAO是表示數(shù)據(jù)庫(kù)向上層提供的接口表示;

  領(lǐng)域?qū)ο笊系膶傩钥梢跃哂術(shù)et和set,因?yàn)槲覀兤綍r(shí)所理解的對(duì)象不是真正的對(duì)象,而是某個(gè)事實(shí)的描述,比如圖書(shū)管理系統(tǒng)中的一個(gè)Book對(duì)象,表示圖書(shū)管中放著一本書(shū),然后該書(shū)可能有一個(gè)入庫(kù)時(shí)間,F(xiàn)實(shí)生活正的話,書(shū)本的入庫(kù)時(shí)間絕對(duì)不可能變化,但是軟件中的Book因?yàn)椴皇钦嬲默F(xiàn)實(shí)生活中的書(shū)本,而只是表示圖書(shū)館中有一本書(shū)這個(gè)事實(shí)的描述,我們當(dāng)然可以修改這個(gè)事實(shí),因?yàn)槲覀兛赡芤驗(yàn)橹霸跁?shū)本入庫(kù)時(shí)所輸入的入庫(kù)時(shí)間是錯(cuò)的,需要修改該入庫(kù)時(shí)間,此時(shí)就有提供set的必要了。所以,理論上任何一個(gè)Entity,除了ID之外,其他所有屬性都可以更改,因?yàn)檫@些屬性并不表示現(xiàn)實(shí)生活中的真正對(duì)象的特征,而僅僅只是對(duì)一個(gè)事實(shí)的描述;剛開(kāi)始Book對(duì)象對(duì)書(shū)本入庫(kù)這個(gè)事實(shí)的描述可能有問(wèn)題,此時(shí)我們就需要修改該Book的屬性;我想這個(gè)例子已經(jīng)充分說(shuō)明為什么可以提供get和set了;

  不要總是零散的不加任何分組的設(shè)計(jì)Entity的屬性,因?yàn)橛行⿲傩栽谶壿嬌匣驑I(yè)務(wù)上就是內(nèi)聚的,代表一個(gè)完整的概念,比如Country,Province,City,Town,Street,等這些屬性表示一個(gè)地址的信息,此時(shí)我們應(yīng)該設(shè)計(jì)一個(gè)Address對(duì)象來(lái)表示該地址信息,此時(shí)該Address就是一個(gè)值對(duì)象。所以我們?cè)谠O(shè)計(jì)Entity的屬性時(shí),要好好想想,哪些子屬性其實(shí)在業(yè)務(wù)上是一個(gè)完整的概念,此時(shí)我們就需要考慮將這些相關(guān)的屬性設(shè)計(jì)為一個(gè)值對(duì)象;

  切忌值對(duì)象必須是只讀的,值對(duì)象之所以叫值對(duì)象最主要的是因?yàn)樗硎疽粋(gè)值,而不是一個(gè)對(duì)象;值是不會(huì)變化的,是一個(gè)明確含義的不變的事物,比如3表示一個(gè)值,表述數(shù)量是3,3永遠(yuǎn)不能變化;所以說(shuō),世界之所以存在,是因?yàn)橛羞@些永恒不變的值對(duì)象的存在;我們只要把值對(duì)象理解為3,“abcd”這樣的永恒不變的值就行了;

  不要讓領(lǐng)域模型去模擬現(xiàn)實(shí),模擬用戶(軟件使用者)與領(lǐng)域模型交互的過(guò)程;領(lǐng)域模型要實(shí)現(xiàn)的應(yīng)該是用戶的需求,領(lǐng)域模型中不應(yīng)該包含用戶的成分,想想只有空杯子才能裝水的道理,即無(wú)為以之用的道理就明白了;所以,我們?cè)谠O(shè)計(jì)領(lǐng)域模型時(shí)首先要明白領(lǐng)域模型要完成的事情是什么;這方面,多看看用例圖,就知道軟件該做的事情了,推薦大家看的書(shū)是:Craig Larman寫(xiě)的《UML和模式應(yīng)用》一書(shū),非常經(jīng)典;

  暫時(shí)就寫(xiě)這么多吧,以后想到什么再補(bǔ)上,呵呵。

【經(jīng)典的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)在代碼實(shí)踐方面的心得體會(huì)】相關(guān)文章:

幼兒園語(yǔ)言領(lǐng)域方面的教案(精選23篇)10-06

活動(dòng)設(shè)計(jì)健康領(lǐng)域教案12-19

活動(dòng)設(shè)計(jì)科學(xué)領(lǐng)域教案08-26

設(shè)計(jì)方崗位職責(zé)04-17

幼兒活動(dòng)設(shè)計(jì)健康領(lǐng)域教案02-16

活動(dòng)設(shè)計(jì)健康領(lǐng)域教案(7篇)12-24

活動(dòng)設(shè)計(jì)健康領(lǐng)域教案7篇12-20

健康領(lǐng)域心得體會(huì)02-20

任務(wù)驅(qū)動(dòng)型作文05-10

活動(dòng)設(shè)計(jì)健康領(lǐng)域教案通用7篇12-27