领域驱动设计与模型驱动开发精编版

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

致谢:此培训材料借鉴了来自参考文献以及互联网的大量资料,部分资料的参考来源未能尽数列举,谨在此对那些在网络中无私分享自己知识的人表达我的衷心感谢!培训内容领域驱动设计简介领域通用语言领域驱动设计的构造块领域驱动设计编程实践CQRS架构模型驱动开发领域驱动设计思想的发展2002年MartinFower在其出版《企业应用架构模式》中,归纳总结了40多种企业应用架构的设计模式。其中所提到的多种设计模式和概念,如事务脚本、活动记录和领域模型等,对业界产生了深远的影响。2004年著名建模专家EricEvans发表了他最具影响力的著名书籍:《Domain-DrivenDesign–TacklingComplexityintheHeartofSoftware》(中文译名:领域驱动设计—软件核心复杂性应对之道),书中提出了“领域驱动设计(简称DDD)”的概念。2010年GregYoung在“CQRS,TaskBasedUIs,EventSourcingagh!”一文中对BetrandMeyer的CQS模式进行改造,提出CQRS模式。此后JimmyNilsson的《ApplyingDomain-DrivenDesignandPatterns》、AbelAvram和FloydMarinescu合作的《Domain-DrivenDesignQuickly》、DanHaywood的《Domain-DrivenDesignUsingNakedObjects》、以及VaughnVernon的《ImplementingDomain-DrivenDesign》等书籍的出版,丰富了领域驱动设计的实践和指导。领域驱动设计是什么领域驱动设计事实上针对是OOAD的一个扩展和延伸,DDD基于面向对象分析与设计技术,对技术框架进行了分层规划,同时对每个类进行了策略和类型的划分。It’sasetofprovenmodelingtechniquesespeciallytargetedtocomplexapplications.It’sasetofprinciplesandpracticessupportingthedevelopmentprocess.It’sasetofpatternsthatsupportacleanandcoherentviewofthedomainmodel.It’sasetofpragmaticstrategiesallowingapplicationstoscaleinsizeandcomplexitymaintainingtheirintegrity.领域驱动设计的特性•成熟、清晰的分层架构•领域对象与现实世界的业务映射•明确的职责划分分层架构•领域对象是核心•领域对象复用:完整的业务对象描述•设计复用:设计基于领域对象而非数据库复用•具备复杂业务逻辑的软件开发•对设计和开发人员要求较高•不适用普通CRUD的业务•软件的维护性和扩展性良好(Testable)使用场景领域驱动设计分层规划(一)领域驱动设计分层规划用户界面/展现层负责向用户展现信息以及解释用户命令。展示层的组件实现用户与应用交互的功能。一般建议用MVC,MVP或者MVVM模式来分隔这些组件为子层应用层很薄的一层,用来协调应用的活动,实现协调应用的“通道”,例如事务、执行单位操作、调用应用程序的任务。它不包含业务逻辑。它不保留业务对象的状态,但它保有应用任务的进度状态。类似于Façade模式,调用领域层和基础设施层来完成应用的用例。领域层本层包含关于领域的信息。这是业务软件的核心所在。在这里保留业务对象的状态,对业务对象和它们状态的持久化被委托给了基础设施层。基础设施层本层作为其他层的支撑库存在。它提供了层间的通信,实现对业务对象的持久化,包含对用户界面层的支撑库等作用。领域驱动设计分层规划(二)领域驱动设计是对传统N层架构模式的继承和发展领域驱动设计分层规划(三)领域驱动设计是对传统N层架构模式的继承和发展《CoreJ2EEPatterns》例:J2EE参考分层架构传统J2EE或Spring+Hibernate等事务性编程模型只关心数据,这些数据对象除了简单sette/getter方法外,没有任何业务方法,被比喻成“失血模型”。领域驱动设计分层规划(四)分布式领域驱动设计领域驱动设计分层规划(五)分布式领域驱动设计与DotNET技术架构体系之间的关系映射面向对象分析与设计技术面向过程vs.面向对象事务脚本模式把业务逻辑组织成单个过程,在过程中直接调用数据库,业务逻辑在服务(Service)层处理。事务脚本模式的特点是简单容易理解,面向过程设计。对于少量逻辑的业务应用来说,事务脚本模式简单自然,性能良好,容易理解,而且一个事务的处理不会影响其他事务。不过缺点也很明显,对于复杂的业务逻辑处理力不从心,难以保持良好的设计,事务之间的冗余代码不断增多,通过复制粘贴方式进行复用。可维护性和扩展性变差。对类的策略和类型的划分对类进行StereoType(“构造型”)划分的好处在于:(1)指导设计(2)帮助命令对象(3)辅助理解按照策略和类型对类进行划分六边形架构以领域模型为核心的六边形架构领域驱动设计中的设计模式有助于获得柔性设计的设计模式每个元素的名称都提供了一次揭示设计意图的机会。站在客户开发人员的角度上来思考它。人们为了使所有类和操作都具有相似的规模而寻找一种一致的力度。粒度的大小并不是唯一要考虑的问题,我们还要考虑粒度在哪种场合下使用。随着代码重构不断适合新理解的概念或需求,概念轮廓也就逐渐形成了。搞内聚低耦合原则既适用于代码,也适用于概念。《领域驱动设计—软件核心复杂性应对之道》第10章任何对未来操作产生影响的系统状态的改变都可以成为副作用。把命令和查询严格地放到不同操作中;创建并返回ValueObject。允许我们安全地对多个操作进行组合。使用断言把副作用明确表示出来,使它们更易于处理。寻找在概念上内聚的模型,更易推出预期ASSERTION,从而加快学习过程并避免代码矛盾。尽一切可能保持低耦合。把所有无关概念提取到对象之外,类就变成完全孤立的了,使得我们可以单独地研究和理解它。每个孤立类都极大减轻了因理解Module而带来的负担。操作闭合:在适当的情况下,在定义操作时让它的返回类型与其参数相同。闭合操作提供了一个高层接口,同时又不会引入对其他概念的任何依赖性。培训内容领域驱动设计简介领域通用语言领域驱动设计的构造块领域驱动设计编程实践CQRS架构模型驱动开发使用通用语言的重要性Talkingdifferentlanguagesmakesprojectsfail.Programmersspeakusingtechnicaljargon(designpatterns,acronyms,geekyin-jokes)DomainexpertsuseterminologyspecifictotheirfieldofexpertiseComputersspeakprogramminglanguages大家必须妥协领域驱动设计的关键点关注核心领域(CoreDomain)领域专家和软件从业者共同开发模型在一个明确的限界上下文(BoundedContext)中使用领域通用语言(ubiquitouslanguage)通用语言(一)通用语言(UBIQUITOUSLANGUAGE)是团队共享的语言。领域专家和开发者使用相同的通用语言进行交流。事实上,团队中每个人都使用相同的通用语言。不管你在团队中的角色如何,只要你是团队的一员,你都将使用通用语言。通用语言是团队自己创建的公用语言。团队中同时包含领域专家和软件开发人员。通用语言更多地是关于业务本身如何思考和运作的,领域专家对通用语言有很大影响。不同领域专家会在概念和术语上产生分歧,甚至也会犯错,当领域专家和开发者一起创建领域模型的时候,他们有时会达成一致,有时会做一些妥协,但最终目的都是为了创造最适合项目的通用语言。团队成员们妥协的绝对不应是通用语言的质量,而是概念、术语和含义。最初的一致并不表示始终一致,通用语言也会随着时间推移而不断演化改变。领域驱动设计的一个核心思想就是使用基于模型的共同语言。因为模型是软件满足领域的共同点,它很适合作为这种通用语言的构造基础。使用模型作为语言的核心骨架,要求团队在进行所有的交流都是使用一致的语言,在代码中也是这样。在共享知识和推敲模型时,团队会使用语言、文字和图形。这儿需要确保团队使用的语言在所有的交流形式中看上去都是一致的,这种语言被称为“通用语言(UbiquitousLanguage)”。通用语言的词汇表包括类名称和主要操作。语言中包含术语,有些术语用来讨论模型中已经明确的规则,还有一些术语则来自施加于模型上的高级组织原则。最后,团队一致应用于领域模型的模式名称使这种语言更为丰富。模型之间的关系成为所有语言都具有的组合规则,词和短语的意义反映了模型的语义。通用语言(二)在应用通用语言时,应注意:将模型作为语言的中心。确保团队在所有交流活动和代码中坚持使用这种语言。在画图、写东西特别是讲话时也要使用这种语言。通过尝试不同的表示方法(它们反映了不同模型)来消除难点。然后重构代码,并对类、方法和模块重新命名,以便与新模型相一致。解决交谈中的术语混淆问题,就像我们对普通词汇形成一个公认的理解一样。要认识到UBIQUITOUSLANGUAGE中的更改就是对模型的更改。领域专家应该避免使用拗口或无法表达领域理解的术语或结构,开发人员应该密切监视那些将会妨碍设计的有歧义和不一致的地方有了通用语言,模型就不仅仅是一个设计工作了。它成为开发人员和领域专家共同完成的每项工作中的不可或缺的部分。语言以动态形式传递知识。使用这种语言进行讨论能够更清楚地表达图和代码背后的真实含义。通用语言是那些不以代码形式出现的设计方面的主要载体,这些方面包括把整个系统组织在一起的比例结构、定义了不同系统和模型之间关系的BoundedContext,以及在模型和设计中使用的其他模式。通用语言的应用通用语言贯穿于项目的各个环节UserStoriesProjectMeetingsTeamEmailsInstantMessagesSchedulePlanSoftwareDocuments在限界上下文中,保持语言的一致性(如口语、图形(如UML图等)、文字、代码等)。通用语言的应用示例(一)UserStoriesNOWhenUserlogsonwithvalidcredentials,anemptypanelisdisplayed.YESWhenPlayerlogsonwithvalidcredentials,anemptyboardgameisdisplayed.(fromaTicTacToeGamesoftwareexample)通用语言的应用示例(二)CodeExampleNO.Integeri=newInteger();.Stringchar1=newString();.publicclassGameDAO(){}.catch(Exceptione)YES.StringrealMeaningOfMyString=newString();.publicclassScoreDataLoader(){}.catch(ExceptionNotLoggedInException)NO.Ambiguities.Inconsistencies.Synonyms.AbbreviationsYES.Clarity.Precision.Reuse.FullNamespackagetictactoe.client.userInterface;/***AddthestringOorXtoacellinthegrid.*/publicclassShowCellGrid{publicstaticvoiddisplayUser(Gridgrid,Cellcell){if(

1 / 142
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功