﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-『一只小蚂蚁』的专栏-随笔分类-DDD</title><link>http://www.blogjava.net/qixiangnj/category/22109.html</link><description>&lt;strong&gt;生命不息，拼搏不止。&lt;/strong&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 07 Aug 2007 07:52:05 GMT</lastBuildDate><pubDate>Tue, 07 Aug 2007 07:52:05 GMT</pubDate><ttl>60</ttl><item><title>DDD Notes Draft(continuing update)</title><link>http://www.blogjava.net/qixiangnj/archive/2007/06/30/127250.html</link><dc:creator>Thomas</dc:creator><author>Thomas</author><pubDate>Sat, 30 Jun 2007 09:00:00 GMT</pubDate><guid>http://www.blogjava.net/qixiangnj/archive/2007/06/30/127250.html</guid><wfw:comment>http://www.blogjava.net/qixiangnj/comments/127250.html</wfw:comment><comments>http://www.blogjava.net/qixiangnj/archive/2007/06/30/127250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qixiangnj/comments/commentRss/127250.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qixiangnj/services/trackbacks/127250.html</trackback:ping><description><![CDATA[I'm reading <span style="font-style: italic; font-weight: bold;">Eric Evans</span>'s book: <span style="font-weight: bold;">Domain-Driven Design: Tackling Complexity in the Heart of Software</span>.<br>The page will record some notes about the book, they may be messy, confused. <img src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/images/emwink.gif" align="absmiddle" border="0"><br><br><span style="font-weight: bold;">2007/6/30</span><br>Domain-Driven Design<br><br>主要内容：<br>1. 隔离（Isolate）域<br>2. 实体、值对象、服务、模块（module）<br>3. 域对象的生命周期<br>4. Representing processes as domain objects<br>5. Creating functions free of side effects <br>6. 概述（Conceptual contours）<br>7. 单例类<br>8. 扩展规范<br>9. 应用分析模式<br>10. 关联设计模式到模型<br>11. 维持域的完整性<br>12. Formulating the domain vision statement<br>13. 选择重构目标<br>14. 职责层<br>15. 创建一个可插入性的组件（component）框架<br>16. Bringing together large-scale structures and bounded contexts<br>===========================================================================================<br>XP假设你可以经常地、快速地通过重构来改善设计<br>===========================================================================================<br>part1, DDD的目标、定义、意义（what）<br>part2, Model-Driven Design, best practices, OO domain model; 架起model和实践的桥梁；standard patterns, 术语 -&gt;common language, all team members; 保持model和实现排成一行的各种判定；（which？！）<br>part3, 强调发现过程（how）<br>part4, 原理（why）<br>===========================================================================================<br>Part I: 让领域模型发挥作用（Putting the Domain Model to Work）<br>模型是简化，是抽象。<br>用户应用问题域到程序中，这就是软件中的&#8220;域&#8221;。有些域涉及现实世界，订票业务；有些域是无形的，帐户程序的域是钱和财务；软件&#8220;域&#8221;很少与计算机有关，偶有例外，代码控制系统的域是软件开发本身。<br>模型是工具，用来减少负担——与用户活动相关的。一个合适的模型，使信息变得容易理解，集中于问题上。<br>域模型不是一张特别的图，而是这张图试图传达的观点；不是仅仅在领域专家脑中的知识，而是对知识的严格组织和选择性的抽象；<br>域模型不是只需尽可能地&#8220;现实化&#8221;一个模型，甚至在一个有形的真实世界的事物的域中，我们的模型也是一个人造的创造。（来源于生活，虚构）<br>///////////////////////////////////////////////////////////////////////////////////////////<br>DDD中模型的功用<br>DDD中，三种基本用法决定一个模型的选择：<br>1. 模型和设计核心相互定形。<br>模型和实现的绑定，有利于模型相关联，确保基于它的分析能够应用到最终产品中，也有利于维护和持续开发。<br>2. 模型是所有项目成员的语言支柱。<br>因为模型和实现的绑定，开发者能够以这种语言谈论程序；因为这种语言基于模型，我们的自然语言能力能够转为提纯这个模型本身。<br>3. 模型是知识精粹。<br>模型是项目组商定的方式，这种方式用来结构化域知识和区分感兴趣的元素；<br>///////////////////////////////////////////////////////////////////////////////////////////<br>软件的核心<br>软件的核心是它有为用户解决域关联问题的能力。<br>///////////////////////////////////////////////////////////////////////////////////////////<br>Ch1. 消化知识（Crunching Knowledge）<br><br><span style="font-weight: bold;">2007/7/2</span><br>消除术语中的冲突和歧义、技术观点的不一致。<br>头脑风暴、提纯；提问、解释。<br>代码模型<br>//////////////////////////////////////////////////////////////////////////////////////////<br>有效建模的因素<br>1. 绑定模型和实现<br>通过不断地迭代<br>2. 培养一门基于模型的语言<br>便于双方（无理解偏差）的交流<br>3. 开发一个富知识模型<br>模型不是用来看看的，需要它做事！<br>4. 提纯模型<br>5. 头脑风暴、试验<br><br><span style="font-weight: bold;">2007/7/3</span><br>知识消化<br>高效的领域建模者是知识消化者。他们消化大量的信息并且探索与之关联的点滴，尝试组织一个个的idea、寻求使其容易理解的简单方式。（化抽象为具体）。提纯过程是对发现最与之相关的特殊知识的一个严格表达。<br>//////////////////////////////////////////////////////////////////////////////////////////<br>知识消化不是一个孤独的行为。开发者和领域专家互相合作。未加工的资料可以来自领域专家的想法、已有系统的使用者、老系统开发组的经验或者同一个领域的另外一个项目。它们来自于文档和大量的交流。<br>//////////////////////////////////////////////////////////////////////////////////////////<br>在老的瀑布开发方式中，业务专家和分析员交谈，然后分析员消化、抽象并且将结果传达给开发者。这种方式的失败在于缺乏反馈。分析员对模型创建全权负责，而这仅仅依靠来自业务专家的&#8220;输入&#8221;。他们没有机会向开发者学习或者从软件的早期版本获得经验。知识流向了一个方向，但是没有汇集。<br>//////////////////////////////////////////////////////////////////////////////////////////<br>另外一些项目使用迭代开发的方式，但是他们在建立知识时失败了，因为他们没有抽象。开发者到业务专家那里询问他们想要的功能，然后就回去构建它，紧接着他们向业务专家们展示结果并询问接下来需要做什么。如果开发者进行重构的话，或许他们能够在持续扩展中保持软件&#8220;干净&#8221;，但是如果开发者对&#8220;域&#8221;没有兴趣，那么他们将只学到这个应用程序什么应该做，而不知道背后的原理。这样的方式可以建造出可用的软件，但是这个项目将永远不能达到通过对老功能推论，扩展出新的强大功能的程度。<br><br><span style="font-weight: bold;">2007/7/4</span><br>好的开发者将自然地开始抽象和建立一个模型，以使其可以做更多的事情。但是如果这些只是出现在技术层面，而没有和领域专家合作，那么这些想法无疑是天真的。知识的缺乏，可以生产出完成基本任务的软件产品，但是缺少了与领域专家思考方式的深度联系。<br>//////////////////////////////////////////////////////////////////////////////////////////<br>项目组成员间的交互作用在所有成员一起消化这个模型时发生变化。对领域模型的不断提纯强迫开发者来学习他们正在参加的项目的重要原理，而不是机械地完成一个个功能。领域专家通常以被迫来提纯他们了解的本质的方式来精炼他们自己的理解，进而得以理解软件项目所需的概念的苛刻。（？）<br>//////////////////////////////////////////////////////////////////////////////////////////<br>所有的这些使项目组成员更加胜任知识消化。他们剔除无关的，改造模型成更加有用的形式。分析员和开发者的介入，使得它被干净地组织和抽象，因此它对实现起到了杠杆作用。由于领域专家的介入，这个模型反射出业务的深层知识。这些抽象是真实的业务原则。<br>//////////////////////////////////////////////////////////////////////////////////////////<br>由于模型的改进，它变成一个组织不断流过项目的信息的工具。这个模型着力于需求分析。它与编码和设计亲密接触。在一个有效力的循环中，它深化项目组成员的视线到领域中，使他们看得更加清楚、达到对模型更进一步地提炼。这些模型从来都不是完美的；他们不断进化，他们必须对理解领域有实践性、有帮助，为了使应用程序可以被简单地实现和理解，他们必须严格。<br>     <img src ="http://www.blogjava.net/qixiangnj/aggbug/127250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qixiangnj/" target="_blank">Thomas</a> 2007-06-30 17:00 <a href="http://www.blogjava.net/qixiangnj/archive/2007/06/30/127250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>领域模型学习笔记</title><link>http://www.blogjava.net/qixiangnj/archive/2006/12/25/89791.html</link><dc:creator>Thomas</dc:creator><author>Thomas</author><pubDate>Mon, 25 Dec 2006 14:10:00 GMT</pubDate><guid>http://www.blogjava.net/qixiangnj/archive/2006/12/25/89791.html</guid><wfw:comment>http://www.blogjava.net/qixiangnj/comments/89791.html</wfw:comment><comments>http://www.blogjava.net/qixiangnj/archive/2006/12/25/89791.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qixiangnj/comments/commentRss/89791.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qixiangnj/services/trackbacks/89791.html</trackback:ping><description><![CDATA[<p>对&#8220;领域模型&#8221;有&#8220;忽如一夜春风来&#8221;的感觉，太多书籍在谈它。将学习心得记录下来，与大家分享。<br><br><strong>什么是领域模型？<br></strong>领域模型是对领域内的<font color="#ff0000"><strong>概念类</strong></font>或现实世界中对象的可视化表示。又称<strong>概念模型</strong>、<strong>领域对象模型</strong>、<strong>分析对象模型</strong>。<br><br>那<strong>什么是概念类</strong>呢？<br>概念类是思想、事物或对象。<br>这样的解释，仍然显得抽象。还是先看图吧！<br><img src="http://www.blogjava.net/images/blogjava_net/qixiangnj/18673/r_01.bmp"><br>（图一）<br>利用上图，我们可以从<strong>概念类</strong>的<strong>符号</strong>、<strong>内涵</strong>和<strong>外延</strong>三个方面来考虑。<br>符号：表示概念类的词语或图形。<br>内涵：概念类的定义。<br>外延：概念类所适用的一组示例。<br>对应于上图，我们使用符号Sale来<strong>表示购买交易事件的概念类</strong>；Sale的内涵可以陈述为&#8220;<strong>表示购买交易的事件，并且具有日期和时间</strong>&#8221;；Sale的外延为&#8220;<strong>世界上所有销售实例的集合</strong>&#8221;。<br><br><strong>为什么要创建领域模型？<br><font color="#ff0000">降低与OO建模之间的表示差异</font></strong>。<br>领域层软件类的名称要源于领域模型中的名称，以使对象具有源于领域的信息和职责。<br>打个比方，你可以用一长串0和1来表示&#8220;薪水册&#8221;，可是这种软件表示与我们脑中的薪水册领域模型之间存在巨大的差异，这将影响我们对软件的理解和修改。而OO建模则可以减小这一差异。<br><br>那又<strong>如何创建领域模型</strong>呢？<br>可以通过以下三个步骤：<br>一. 寻找概念类<br>二. 将其绘制为UML类图中的类<br>三. 添加关联和属性<br><br><strong>如何找到概念类？<br></strong>1）重用和修改现有的模型。<br>这是<strong>首要</strong>、<strong>最佳</strong>且<strong>最简单</strong>的办法。可以从已发布的领域模型和书籍中获得。<br>2）使用分类列表<br>示例：<br><img src="http://www.blogjava.net/images/blogjava_net/qixiangnj/18673/r_02-1.bmp"><br><img src="http://www.blogjava.net/images/blogjava_net/qixiangnj/18673/r_02-2.bmp"><br>（图二）<br>3）确定名词列表<br>在对<strong>领域的文本性描述</strong>中识别名词和名词短语，将其作为候选的概念类或属性。<br>缺点：自然语言的不精确性，不同名词短语可能表示同一概念类或属性，此外可能还有歧义。<br>建议与<strong>概念类分类列表</strong>一同使用。<br><br>在实践中，在发现概念类时，一般直接为其<strong>绘制UML类图</strong>。<br><br>常见错误：把应该是概念类的事物表示为属性。<br>准则：<strong>如果我们认为某概念类X不是现实世界中的数字或文本，那么X可能是概念类而不是属性</strong>。<br>考虑一下航空预定领域。destination应该作为Flight的属性，还是作为单独的概念类Airport?<br><img src="http://www.blogjava.net/images/blogjava_net/qixiangnj/18673/r_03.bmp"><br>（图三）<br>在现实世界里，目的地机场不会被看作是数字或文本，而是一占据大规模空间的事物。因此，Airport应该是个概念，而不是属性。<br><br><strong>描述类</strong>包含描述其他事物的信息。例如，ProductDescription记录Item的价格、图片和文字描述。<br><strong>为什么</strong>使用描述类？<br>假设：雀巢咖啡，大受欢迎，销售一空。这就意味着雀巢咖啡的所有Item实例都从计算机存储器中被删除。这时如果有人问：雀巢咖啡多少钱一盒？那将没法回答。因为价格是记录在实例上的，而这些实例都已经被删除。由此可以看出，需要其他事物来记录雀巢咖啡的<strong>描述</strong>（规格说明）。<br><img src="http://www.blogjava.net/images/blogjava_net/qixiangnj/18673/r_04.bmp"><br>（图四）<br><strong>何时需要？</strong><br>1. 需要有关商品或服务的描述，独立于任何商品或服务的现有实例。<br>2. 删除其所描述事物（如Item）的实例后，导致信息丢失，而这些信息是需要维护的，但是被错误地与所删除的事物关联起来。<br>3. 减少冗余或重复信息。<br><br><strong>关联<br>什么是关联？<br></strong>关联是类（类的实例）之间的关系，表示有意义和值得关注的连接。<br><img src="http://www.blogjava.net/images/blogjava_net/qixiangnj/18673/r_05.bmp"><br>（图五）<br><strong>何时表示关联？<br></strong>1. 如果存在需要保持一段时间的关系，将这种语义表示为关联（<strong><font color="#ff0000">&#8220;需要记住&#8221;</font></strong>的关联）。<br>2. 从常见关联列表中派生的关联。<br><br>准则：<strong><font color="#000000">要避免在领域模型中加入太多的关联</font></strong>。<br><br>在领域建模过程中，关联不是关于数据流、数据库外键联系、实例变量或软件方案中的对象连接的语句；关联声明的是针对现实领域<strong>从纯概念角度</strong>看有意义的关系。<br><br>在UML中如何对关联命名？<br>以&#8220;类名－动词短语－类名&#8221;的格式为关联命名，其中的动词短语构成了可读的和有意义的顺序。<br>图五对应于：<strong>VideoStore Stocks Video<br><br>多重性</strong>定义了类A有多少个实例可以和类B的一个实例关联。（见图五）<br><strong>多重性的值</strong>表示在<strong>特定时刻</strong>（而不是在某个时间跨度内）有效关联的实例数量。<br><img src="http://www.blogjava.net/images/blogjava_net/qixiangnj/18673/r_06.bmp"><br>（图六）<br><br>多重性是和语境有关的。<br><br>两个类之间的多重关联：<br><img src="http://www.blogjava.net/images/blogjava_net/qixiangnj/18673/r_07.bmp"><br>（图七）<br><br>常见关联列表：<br><img src="http://www.blogjava.net/images/blogjava_net/qixiangnj/18673/r_08.bmp"><br>（图八）<br><br><strong>属性<br>什么是属性？<br></strong>属性是对象的逻辑数据值。<br><br><strong>何时展示属性？</strong><br>当需求（例如，用例）建议或暗示<strong>需要记住</strong>信息时，引入属性。<br><img src="http://www.blogjava.net/images/blogjava_net/qixiangnj/18673/r_09.bmp"><br>（图九）<br><strong>导出属性</strong>（derived attribute）：可以由其他信息导出的属性。<br><br>准则：<strong>大部分属性类型应该是&#8220;简单&#8221;数据类型</strong>，例如数字和布尔。通常，<strong>属性的类型不应该是复杂的领域概念</strong>，例如Sale或AirPort。<br><br>准则：<strong>领域模型中属性的类型更应该是<font color="#ff0000">数据类型</font></strong>。<br><br>准则：<strong>通过关联而不是属性来表示概念类之间的关系</strong>。<br><img src="http://www.blogjava.net/images/blogjava_net/qixiangnj/18673/r_10.bmp"><br>（图十）<br><br><font color="#ff0000"><strong>领域模型是概念透视图，不是软件透视图。在设计模型中，属性可以是任何类型。<br><br></strong></font><font color="#000000">准则：<strong>任何属性都不表示外键</strong>。<br><img src="http://www.blogjava.net/images/blogjava_net/qixiangnj/18673/r_11.bmp"><br>（图十一）<br><br><strong>结论</strong>：<br>没有所谓唯一正确的领域模型。所有模型都是对我们试图要理解的领域的近似。领域模型主要是在特定群体中用于理解和沟通的工具。有效的领域模型捕获了当前需求语境下的本质抽象和理解领域所需要的信息，并且可以帮助人们理解领域的概念、术语和关系。<br><br><br>参考资料：<br>1. 《UML和模式应用》（第三版）</font></p><img src ="http://www.blogjava.net/qixiangnj/aggbug/89791.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qixiangnj/" target="_blank">Thomas</a> 2006-12-25 22:10 <a href="http://www.blogjava.net/qixiangnj/archive/2006/12/25/89791.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>