领域驱动设计与模型驱动开发课件.ppt
《领域驱动设计与模型驱动开发课件.ppt》由会员分享,可在线阅读,更多相关《领域驱动设计与模型驱动开发课件.ppt(142页珍藏版)》请在三一办公上搜索。
1、领域驱动设计与模型驱动开发,致谢: 此培训材料借鉴了来自参考文献以及互联网的大量资料,部分资料的参考来源未能尽数列举,谨在此对那些在网络中无私分享自己知识的人表达我的衷心感谢!,培训内容,领域驱动设计简介领域通用语言领域驱动设计的构造块领域驱动设计编程实践CQRS架构模型驱动开发,领域驱动设计思想的发展,2002年Martin Fower在其出版企业应用架构模式中,归纳总结了40多种企业应用架构的设计模式。其中所提到的多种设计模式和概念,如事务脚本、活动记录和领域模型等,对业界产生了深远的影响。2004年著名建模专家Eric Evans发表了他最具影响力的著名书籍:Domain-Driven
2、Design Tackling Complexity in the Heart of Software(中文译名:领域驱动设计软件核心复杂性应对之道),书中提出了“领域驱动设计(简称DDD)”的概念。2010年Greg Young在“CQRS, Task Based UIs, Event Sourcing agh!”一文中对Betrand Meyer的CQS模式进行改造,提出CQRS模式。此后Jimmy Nilsson的Applying Domain-Driven Design and Patterns、Abel Avram和Floyd Marinescu合作的Domain-Driven De
3、sign Quickly、Dan Haywood的Domain-Driven Design Using Naked Objects、以及Vaughn Vernon的Implementing Domain-Driven Design等书籍的出版,丰富了领域驱动设计的实践和指导。,领域驱动设计是什么,领域驱动设计事实上针对是OOAD的一个扩展和延伸,DDD基于面向对象分析与设计技术,对技术框架进行了分层规划,同时对每个类进行了策略和类型的划分。Its a set of proven modeling techniques especially targeted to complex applica
4、tions.Its a set of principles and practices supporting the development process.Its a set of patterns that support a clean and coherent view of the domain model.Its a set of pragmatic strategies allowing applications to scale in size and complexity maintaining their integrity.,领域驱动设计的特性,领域驱动设计分层规划(一)
5、,领域驱动设计分层规划,领域驱动设计分层规划(二),领域驱动设计是对传统N层架构模式的继承和发展,大家有疑问的,可以询问和交流,可以互相讨论下,但要小声点,领域驱动设计分层规划(三),领域驱动设计是对传统N层架构模式的继承和发展,Core J2EE Patterns,例:J2EE参考分层架构,传统J2EE或Spring+Hibernate等事务性编程模型只关心数据,这些数据对象除了简单sette/getter方法外,没有任何业务方法,被比喻成“失血模型”。,领域驱动设计分层规划(四),分布式领域驱动设计,领域驱动设计分层规划(五),分布式领域驱动设计与DotNET技术架构体系之间的关系映射,面
6、向对象分析与设计技术,面向过程vs.面向对象,事务脚本模式把业务逻辑组织成单个过程,在过程中直接调用数据库,业务逻辑在服务(Service)层处理。 事务脚本模式的特点是简单容易理解,面向过程设计。对于少量逻辑的业务应用来说,事务脚本模式简单自然,性能良好,容易理解,而且一个事务的处理不会影响其他事务。 不过缺点也很明显,对于复杂的业务逻辑处理力不从心,难以保持良好的设计,事务之间的冗余代码不断增多,通过复制粘贴方式进行复用。可维护性和扩展性变差。,对类的策略和类型的划分,对类进行StereoType(“构造型”)划分的好处在于: (1)指导设计 (2)帮助命令对象 (3)辅助理解,按照策略和
7、类型对类进行划分,六边形架构,以领域模型为核心的六边形架构,领域驱动设计中的设计模式,有助于获得柔性设计的设计模式,每个元素的名称都提供了一次揭示设计意图的机会。站在客户开发人员的角度上来思考它。,人们为了使所有类和操作都具有相似的规模而寻找一种一致的力度。粒度的大小并不是唯一要考虑的问题,我们还要考虑粒度在哪种场合下使用。随着代码重构不断适合新理解的概念或需求,概念轮廓也就逐渐形成了。搞内聚低耦合原则既适用于代码,也适用于概念。,领域驱动设计软件核心复杂性应对之道第10章,任何对未来操作产生影响的系统状态的改变都可以成为副作用。把命令和查询严格地放到不同操作中;创建并返回Value Obje
8、ct。允许我们安全地对多个操作进行组合。,使用断言把副作用明确表示出来,使它们更易于处理。寻找在概念上内聚的模型,更易推出预期ASSERTION,从而加快学习过程并避免代码矛盾。,尽一切可能保持低耦合。把所有无关概念提取到对象之外,类就变成完全孤立的了,使得我们可以单独地研究和理解它。每个孤立类都极大减轻了因理解Module而带来的负担。,操作闭合:在适当的情况下,在定义操作时让它的返回类型与其参数相同。闭合操作提供了一个高层接口,同时又不会引入对其他概念的任何依赖性。,培训内容,领域驱动设计简介领域通用语言领域驱动设计的构造块领域驱动设计编程实践CQRS架构模型驱动开发,使用通用语言的重要性
9、,Talking different languages makes projects fail.Programmers speak using technical jargon (design patterns, acronyms, geeky in-jokes)Domain experts use terminology specific to their field of expertise Computers speak programming languages大家必须妥协,领域驱动设计的关键点,关注核心领域(Core Domain)领域专家和软件从业者共同开发模型在一个明确的限界上
10、下文(Bounded Context)中使用领域通用语言(ubiquitous language),通用语言(一),通用语言(UBIQUITOUS LANGUAGE)是团队共享的语言。领域专家和开发者使用相同的通用语言进行交流。事实上,团队中每个人都使用相同的通用语言。不管你在团队中的角色如何,只要你是团队的一员,你都将使用通用语言。通用语言是团队自己创建的公用语言。团队中同时包含领域专家和软件开发人员。通用语言更多地是关于业务本身如何思考和运作的,领域专家对通用语言有很大影响。不同领域专家会在概念和术语上产生分歧,甚至也会犯错,当领域专家和开发者一起创建领域模型的时候,他们有时会达成一致,有
11、时会做一些妥协,但最终目的都是为了创造最适合项目的通用语言。团队成员们妥协的绝对不应是通用语言的质量,而是概念、术语和含义。最初的一致并不表示始终一致,通用语言也会随着时间推移而不断演化改变。领域驱动设计的一个核心思想就是使用基于模型的共同语言。因为模型是软件满足领域的共同点,它很适合作为这种通用语言的构造基础。使用模型作为语言的核心骨架,要求团队在进行所有的交流都是使用一致的语言,在代码中也是这样。在共享知识和推敲模型时,团队会使用语言、文字和图形。这儿需要确保团队使用的语言在所有的交流形式中看上去都是一致的,这种语言被称为“通用语言(Ubiquitous Language)”。通用语言的词
12、汇表包括类名称和主要操作。语言中包含术语,有些术语用来讨论模型中已经明确的规则,还有一些术语则来自施加于模型上的高级组织原则。最后,团队一致应用于领域模型的模式名称使这种语言更为丰富。模型之间的关系成为所有语言都具有的组合规则,词和短语的意义反映了模型的语义。,通用语言(二),在应用通用语言时,应注意:将模型作为语言的中心。确保团队在所有交流活动和代码中坚持使用这种语言。在画图、写东西特别是讲话时也要使用这种语言。通过尝试不同的表示方法(它们反映了不同模型)来消除难点。然后重构代码,并对类、方法和模块重新命名,以便与新模型相一致。解决交谈中的术语混淆问题,就像我们对普通词汇形成一个公认的理解一
13、样。要认识到UBIQUITOUS LANGUAGE中的更改就是对模型的更改。领域专家应该避免使用拗口或无法表达领域理解的术语或结构,开发人员应该密切监视那些将会妨碍设计的有歧义和不一致的地方有了通用语言,模型就不仅仅是一个设计工作了。它成为开发人员和领域专家共同完成的每项工作中的不可或缺的部分。语言以动态形式传递知识。使用这种语言进行讨论能够更清楚地表达图和代码背后的真实含义。通用语言是那些不以代码形式出现的设计方面的主要载体,这些方面包括把整个系统组织在一起的比例结构、定义了不同系统和模型之间关系的Bounded Context,以及在模型和设计中使用的其他模式。,通用语言的应用,通用语言贯
14、穿于项目的各个环节User StoriesProject MeetingsTeam EmailsInstant MessagesSchedule PlanSoftware Documents在限界上下文中,保持语言的一致性(如口语、图形(如UML图等)、文字、代码等)。,通用语言的应用示例(一),User Stories,NOWhen User logs on with valid credentials, an empty panel is displayed.,YESWhen Player logs on with valid credentials, an empty board gam
15、e is displayed. (from a Tic Tac Toe Game software example),通用语言的应用示例(二),Code Example,NO. Integer i = new Integer();. String char1 = new String();. public class GameDAO() . catch (Exception e),YES. String realMeaningOfMyString = new String();. public class ScoreDataLoader() . catch (Exception NotLogg
16、edInException),NO. Ambiguities. Inconsistencies. Synonyms. Abbreviations,YES. Clarity. Precision. Reuse. Full Names,package tictactoe.client.userInterface;/* Add the string O or X to a cell in the grid.*/public class ShowCellGridpublic static void displayUser (Grid grid, Cell cell) if (!Initializati
17、on.flag(.),A class BEFORE and AFTER Ubiquitous Language,package tictactoe.client.userInterface;/* Performs a move in the game.*/public class PlayerMove /* When the player clicks in a cell, the game draws an O or a X on the * game grid depending on which players turn it is.*/public static void makeMo
18、ve (GameGrid gameGrid, Cell cell) if (!GameInitialization.waitingMoveFlag(.),(Excerpted from a Tic Tac Toe Game source code),Which one would a Stakeholder better understand?,Player Move Performs a move in the game.Make MoveWhen the player clicks in a cell, the game draws an O or a X on the game grid
19、 depending on which players turn it is.Is Cell EmptyThe Player can select a cell only if it wasnt already selected.,Show Cell Grid Add the String O or X to a cell in the grid.Display UserIs Empty,(Excerpted from a Tic Tac Toe Game source code),模型的统一,模型的内部一致性又叫做“统一”,这样每个术语都不会有模棱两可的意义,也不会有规则冲突。除非模型在逻辑
20、上是一致的,否则它就没有意义。识别限界上下文中的不一致:重复的概念和假同源重复的概念是指两个模型元素(以及伴随的实现)实际上表示同一个概念。每当这个概念的信息发生改变时,都必须要更新两个地方。每次由于新的知识导致一个对象被修改时,也必须重新分析和修改另一个对象。如果不进行实际的重新分析,结果就会出现同一个概念的两个版本,它们遵守不同的规则,甚至不同的数据。更重要的是,团队成员必须学习同一操作的两种方法,以及保持这两种方法同步的各种方式。假同源是指使用相同术语(或已实现的对象)的两个人认为他们是在谈论同一件事情,但实际上并不是这样。但是,当两个定义都与同一个领域方面相关,而只是在概念上稍有区别时
21、,这种冲突更难以发现。假同源会导致开发团队互相干扰对方的代码,也可能导致数据库中含有奇怪的矛盾,还会引起团队沟通的混淆。注意用词词汇注意正确用词,不要歪曲词义开发人员经常习惯于使用增/删/改/查(CRUD)此类动词词汇,也许有时候它们也确实属于通用语言,但大多数情况下,它们并不能正确反映业务,用词上混淆了业务概念。,模型的分裂,在理想的世界中,我们可以有一种把整个企业领域包含进来的单一模型;这个模型将是统一的,没有任何相互矛盾或相互重叠的术语定义;每个有关领域的逻辑声明都将是一致的。但大型系统开发并不是这样理想。大型系统领域模型的完全统一是不可行的,也不是一种经济有效的做法。我们可以采用限界上
22、下文(Bounded Context)定义每个模型的应用范围,采用上下文映射(Context Map)给出项目上下文以及它们之间关系的总体视图。任何一个大型项目都会存在多个模型。而当基于不同模型的代码被组合到一起后,软件就会出现bug、变得不可靠和难以理解。团队成员之间的沟通变得混乱。人们往往弄不清楚一个模型不应该在哪个上下文中使用。明确地定义模型所应用的上下文。根据团队的组织、软件系统的各个部分的用法以及物理表现(代码和数据库模式等)来设置模型的边界。在这些边界中严格保持模型的一致性,而不要受到边界之外问题的干扰和混淆。在Context中,要保证模型在逻辑上统一,而不用考虑它是不是适用于边界
23、之外的情况。在其他Context中,会使用其他的模型,这些模型具有不同的术语、概念、规则和UBIQUITOUS LANGUAGE的技术行话。定义Bounded Context:视察项目的现状,而不是它的理想状态。,领域、子域和限界上下文,核心域、支撑域和通用域,A Core Domain is a part of the business Domain that is of primary importance to the success of the organization. It is of utmost importance to the ongoing success of the
24、 business.If a domain models some aspect of the business that is essential, yet not Core, it is a Supporting Subdomain.if a domain captures nothing special to the business, yet is required for the overall business solution, it is a Generic Subdomain.Focus on the core domain,战术建模与战略建模,领域驱动设计的综合应用,共享内
25、核(Shared Kernel),当不同团队开发一些紧密相关的应用程序时,如果团队之间不进行协调,即使短时间内能够取得快速进展,他们开发出的产品也可能互相不适合,最后可能不得不在转换层上花费大量时间,而且得到的产品也五花八门。从领域模型中选出两个团队都同意共享的一个子集。当然,除了模型的这个子集以外,这还包括与该模型部分相关的代码子集,或数据库设计的子集。这部分明确共享的内容具有特殊的状态,而且一个团队在没与另一个团队商量的情况下不应擅自更改它。功能系统要经常进行集成,但集成的频率应该比团队中Continuous Integration的频率低一些。在进行这些集成的时候,两个团队都要运行测试。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 领域 驱动 设计 模型 开发 课件
链接地址:https://www.31ppt.com/p-1518251.html