领域驱动设计与模型驱动开发-PPT课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《领域驱动设计与模型驱动开发-PPT课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 领域 驱动 设计 模型 开发 PPT 课件
- 资源描述:
-
1、领域驱动设计与模型驱动开发致谢: 此培训材料借鉴了来自参考文献以及互联网的大量资料,部分资料的参考来源未能尽数列举,谨在此对那些在网络中无私分享自己知识的人表达我的衷心感谢!培训内容领域驱动设计简介领域通用语言领域驱动设计的构造块领域驱动设计编程实践CQRS架构模型驱动开发领域驱动设计思想的发展 2002年Martin Fower在其出版企业应用架构模式中,归纳总结了40多种企业应用架构的设计模式。其中所提到的多种设计模式和概念,如事务脚本、活动记录和领域模型等,对业界产生了深远的影响。 2004年著名建模专家Eric Evans发表了他最具影响力的著名书籍:Domain-Driven Des
2、ign 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基于面向对象分析与设计技术,对技术框架进行了分层规划,同时对每个类进行了策略和类型的划分。nIts a set of proven modeling techniques especially targeted to complex applica
4、tions.nIts a set of principles and practices supporting the development process.nIts a set of patterns that support a clean and coherent view of the domain model.nIts 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技术架构体系之间的关系映射面向对象分析与设计技术 面向过程vs.面向对象 事务脚本模式把业务逻辑组织
6、成单个过程,在过程中直接调用数据库,业务逻辑在服务(Service)层处理。 事务脚本模式的特点是简单容易理解,面向过程设计。对于少量逻辑的业务应用来说,事务脚本模式简单自然,性能良好,容易理解,而且一个事务的处理不会影响其他事务。 不过缺点也很明显,对于复杂的业务逻辑处理力不从心,难以保持良好的设计,事务之间的冗余代码不断增多,通过复制粘贴方式进行复用。可维护性和扩展性变差。对类的策略和类型的划分对类进行StereoType(“构造型”)划分的好处在于: (1)指导设计 (2)帮助命令对象 (3)辅助理解 按照策略和类型对类进行划分六边形架构 以领域模型为核心的六边形架构领域驱动设计中的设计
7、模式 有助于获得柔性设计的设计模式每个元素的名称都提供了一次揭示设计意图的机会。站在客户开发人员的角度上来思考它。人们为了使所有类和操作都具有相似的规模而寻找一种一致的力度。粒度的大小并不是唯一要考虑的问题,我们还要考虑粒度在哪种场合下使用。随着代码重构不断适合新理解的概念或需求,概念轮廓也就逐渐形成了。搞内聚低耦合原则既适用于代码,也适用于概念。领域驱动设计软件核心复杂性应对之道第10章任何对未来操作产生影响的系统状态的改变都可以成为副作用。把命令和查询严格地放到不同操作中;创建并返回Value Object。允许我们安全地对多个操作进行组合。使用断言把副作用明确表示出来,使它们更易于处理。
8、寻找在概念上内聚的模型,更易推出预期ASSERTION,从而加快学习过程并避免代码矛盾。尽一切可能保持低耦合。把所有无关概念提取到对象之外,类就变成完全孤立的了,使得我们可以单独地研究和理解它。每个孤立类都极大减轻了因理解Module而带来的负担。操作闭合:在适当的情况下,在定义操作时让它的返回类型与其参数相同。闭合操作提供了一个高层接口,同时又不会引入对其他概念的任何依赖性。培训内容领域驱动设计简介领域通用语言领域驱动设计的构造块领域驱动设计编程实践CQRS架构模型驱动开发使用通用语言的重要性Talking different languages makes projects fail.nP
9、rogrammers speak using technical jargon (design patterns, acronyms, geeky in-jokes)nDomain experts use terminology specific to their field of expertise nComputers speak programming languagesn大家必须妥协领域驱动设计的关键点 关注核心领域(Core Domain) 领域专家和软件从业者共同开发模型 在一个明确的限界上下文(Bounded Context)中使用领域通用语言(ubiquitous langua
10、ge)通用语言(一)通用语言(UBIQUITOUS LANGUAGE)是团队共享的语言。领域专家和开发者使用相同的通用语言进行交流。事实上,团队中每个人都使用相同的通用语言。不管你在团队中的角色如何,只要你是团队的一员,你都将使用通用语言。n通用语言是团队自己创建的公用语言。团队中同时包含领域专家和软件开发人员。n通用语言更多地是关于业务本身如何思考和运作的,领域专家对通用语言有很大影响。不同领域专家会在概念和术语上产生分歧,甚至也会犯错,当领域专家和开发者一起创建领域模型的时候,他们有时会达成一致,有时会做一些妥协,但最终目的都是为了创造最适合项目的通用语言。团队成员们妥协的绝对不应是通用语
11、言的质量,而是概念、术语和含义。最初的一致并不表示始终一致,通用语言也会随着时间推移而不断演化改变。n领域驱动设计的一个核心思想就是使用基于模型的共同语言。因为模型是软件满足领域的共同点,它很适合作为这种通用语言的构造基础。使用模型作为语言的核心骨架,要求团队在进行所有的交流都是使用一致的语言,在代码中也是这样。在共享知识和推敲模型时,团队会使用语言、文字和图形。这儿需要确保团队使用的语言在所有的交流形式中看上去都是一致的,这种语言被称为“通用语言(Ubiquitous Language)”。n通用语言的词汇表包括类名称和主要操作。语言中包含术语,有些术语用来讨论模型中已经明确的规则,还有一些
12、术语则来自施加于模型上的高级组织原则。最后,团队一致应用于领域模型的模式名称使这种语言更为丰富。模型之间的关系成为所有语言都具有的组合规则,词和短语的意义反映了模型的语义。通用语言(二) 在应用通用语言时,应注意:n将模型作为语言的中心。确保团队在所有交流活动和代码中坚持使用这种语言。在画图、写东西特别是讲话时也要使用这种语言。n通过尝试不同的表示方法(它们反映了不同模型)来消除难点。然后重构代码,并对类、方法和模块重新命名,以便与新模型相一致。解决交谈中的术语混淆问题,就像我们对普通词汇形成一个公认的理解一样。n要认识到UBIQUITOUS LANGUAGE中的更改就是对模型的更改。n领域专
13、家应该避免使用拗口或无法表达领域理解的术语或结构,开发人员应该密切监视那些将会妨碍设计的有歧义和不一致的地方 有了通用语言,模型就不仅仅是一个设计工作了。它成为开发人员和领域专家共同完成的每项工作中的不可或缺的部分。语言以动态形式传递知识。使用这种语言进行讨论能够更清楚地表达图和代码背后的真实含义。 通用语言是那些不以代码形式出现的设计方面的主要载体,这些方面包括把整个系统组织在一起的比例结构、定义了不同系统和模型之间关系的Bounded Context,以及在模型和设计中使用的其他模式。通用语言的应用 通用语言贯穿于项目的各个环节nUser StoriesnProject Meetingsn
14、Team EmailsnInstant MessagesnSchedule PlannSoftware Documents 在限界上下文中,保持语言的一致性(如口语、图形(如UML图等)、文字、代码等)。通用语言的应用示例(一) User StoriesNOWhen User logs on with valid credentials, an empty panel is displayed.YESWhen Player logs on with valid credentials, an empty board game is displayed. (from a Tic Tac Toe
15、Game software example)通用语言的应用示例(二) Code ExampleNO. Integer i = new Integer();. String char1 = new String();. public class GameDAO() . catch (Exception e)YES. String realMeaningOfMyString = new String();. public class ScoreDataLoader() . catch (Exception NotLoggedInException)NO. Ambiguities. Inconsis
16、tencies. Synonyms. AbbreviationsYES. Clarity. Precision. Reuse. Full Namespackage 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 (!Initialization.flag & Initialization.gameStatus.getSeq
17、uence() = null & isEmpty(grid, cell) Initialization.flag = true; String mk= showString(Initialization.gameStatus .getCurrentUser().getUserString(); grid.setHTML(cell.getRowIndex(), cell.getCellIndex(), mk); Initialization.gameStatus.getStatus()cell.getRowIndex()cell .getCellIndex() = Initialization.
18、gameStatus .getCurrentUser(); GameEnd.checkEnd(Initialization.gameStatus, cell.getRowIndex(), cell.getCellIndex(); (.)A class BEFORE and AFTER Ubiquitous Languagepackage tictactoe.client.userInterface;/* Performs a move in the game.*/public class PlayerMove /* When the player clicks in a cell, the g
19、ame draws an O or a X on the * game grid depending on which players turn it is.*/public static void makeMove (GameGrid gameGrid, Cell cell) if (!GameInitialization.waitingMoveFlag & GameInitialization.currentGameStatus.getSequenceWinner() = null & isCellEmpty(gameGrid, cell) GameInitialization.waiti
20、ngMoveFlag = true; String marker = showPlayerIcon(GameInitialization.currentGameStatus .getCurrentPlayer().getPlayerIcon(); gameGrid.setHTML(cell.getRowIndex(), cell.getCellIndex(), marker); GameInitialization.currentGameStatus.getGameMoves()cell.getRowIndex()cell.getCellIndex() = GameInitialization
21、.currentGameStatus.getCurrentPlayer(); CheckWinner.checkForWinner(GameInitialization.currentGameStatus, cell.getRowIndex(), cell.getCellIndex(); (.)(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 Move When t
22、he player clicks in a cell, the game draws an O or a X on the game grid depending on which players turn it is. Is Cell Empty The 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 User Is Empty(Excerpted from a Tic Tac Toe G
23、ame source code)模型的统一模型的内部一致性又叫做“统一”,这样每个术语都不会有模棱两可的意义,也不会有规则冲突。除非模型在逻辑上是一致的,否则它就没有意义。 识别限界上下文中的不一致:重复的概念和假同源n重复的概念是指两个模型元素(以及伴随的实现)实际上表示同一个概念。每当这个概念的信息发生改变时,都必须要更新两个地方。每次由于新的知识导致一个对象被修改时,也必须重新分析和修改另一个对象。如果不进行实际的重新分析,结果就会出现同一个概念的两个版本,它们遵守不同的规则,甚至不同的数据。更重要的是,团队成员必须学习同一操作的两种方法,以及保持这两种方法同步的各种方式。n假同源是指使
24、用相同术语(或已实现的对象)的两个人认为他们是在谈论同一件事情,但实际上并不是这样。但是,当两个定义都与同一个领域方面相关,而只是在概念上稍有区别时,这种冲突更难以发现。假同源会导致开发团队互相干扰对方的代码,也可能导致数据库中含有奇怪的矛盾,还会引起团队沟通的混淆。注意用词词汇n注意正确用词,不要歪曲词义n开发人员经常习惯于使用增/删/改/查(CRUD)此类动词词汇,也许有时候它们也确实属于通用语言,但大多数情况下,它们并不能正确反映业务,用词上混淆了业务概念。模型的分裂在理想的世界中,我们可以有一种把整个企业领域包含进来的单一模型;这个模型将是统一的,没有任何相互矛盾或相互重叠的术语定义;
25、每个有关领域的逻辑声明都将是一致的。但大型系统开发并不是这样理想。大型系统领域模型的完全统一是不可行的,也不是一种经济有效的做法。我们可以采用限界上下文(Bounded Context)定义每个模型的应用范围,采用上下文映射(Context Map)给出项目上下文以及它们之间关系的总体视图。n任何一个大型项目都会存在多个模型。而当基于不同模型的代码被组合到一起后,软件就会出现bug、变得不可靠和难以理解。团队成员之间的沟通变得混乱。人们往往弄不清楚一个模型不应该在哪个上下文中使用。n明确地定义模型所应用的上下文。根据团队的组织、软件系统的各个部分的用法以及物理表现(代码和数据库模式等)来设置模
展开阅读全文