﻿<?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-&lt;font color="#FFFF00"&gt;金色闪电--陈彦虎（Ryan）&lt;/font&gt;-文章分类-软件工程</title><link>http://www.blogjava.net/kissyan4916/category/37696.html</link><description>哎哟 Orz，不错喔~~希望结识更多喜爱Java的朋友!&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QQ：95350863 MSN：chenyanhubusiness@gmail.com   E-mail：chenyanhu@vip.163.com</description><language>zh-cn</language><lastBuildDate>Tue, 31 Aug 2010 16:13:48 GMT</lastBuildDate><pubDate>Tue, 31 Aug 2010 16:13:48 GMT</pubDate><ttl>60</ttl><item><title>Applying UML and Patterners(Third Edition)学习笔记（十一）</title><link>http://www.blogjava.net/kissyan4916/articles/330213.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Sun, 29 Aug 2010 16:39:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/330213.html</guid><description><![CDATA[<p><a href="file:///C:/E:/学习笔记/Applying%20UML%20and%20Patterners(Third%20Edition).mm.html" target="_blank"><span class="l">~</span>&nbsp;第11章：操作契约 </a>
<ul>
    <li>
    <p><strong><font color="#000000">目标：1》定义系统操作2》为系统操作创建契约 </font></strong></p>
    <p>简介&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在UP中，用例和系统特性是用来描述系统行为的主要方式，并且足以满足要求。有时需要对系统行为进行更为详细和精确的描述。操作契约使用前置和后置条件的形式，描述领域模型里对象的详细变化，并作为系统操作的结果。领域模型是最常用的OOA模型，但是操作契约和状态模型也能够作为有用的与OOA相关的制品。 操作契约可以视为UP用例模型的一部分，因为它对用例指出的系统操作的效用提供了更详细的分析。图11-1所示的UP制品的相互影响强调了操作契约。该契约的主要输入时SSD中确定的系统操作、领域模型和领域专家的见解。该契约也可以作为对象设计的输入，因为他们描述的变化很可能是软件对象或数据库所需要的。 </p>
    <p><strong>示例&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>&nbsp;下面给出的是系统操作enterItem的操作契约。其中的关键元素是后置条件，其他部分虽然有用但重要性稍低。 </p>
    <p>契约CO2:enterItem </p>
    <p><font color="#cc0099">操作：</font>enterItem(itemID:ItemID,quantity:integer) </p>
    <p><font color="#cc0099">交叉引用：</font>用例 : 处理销售 </p>
    <p><font color="#cc0099">前置条件：</font>正在进行的销售 </p>
    <p><font color="#cc0099">后置条件：</font>1》创建了SalesLineItem的实例sli(创建实例)。2》sli与当前Sale关联（形成关联）3》sli.quantity赋值为quantity（修改属性）4》基于itemID的匹配，将sli关联到ProductDescription（形成关联） </p>
    <p>&#8220;（创建实例）&#8221;这样的分类是为了帮助学习，并不是契约的有效部分。 </p>
    <p><strong>定义：契约有哪些部分&nbsp;&nbsp;</strong>&nbsp;&nbsp;&nbsp;&nbsp;下面对契约中的每个部分进行了描述： </p>
    <p><font color="#cc0099">操作：</font>操作的名称和参数 </p>
    <p><font color="#cc0099">交叉引用：</font>会发生此操作的用例 </p>
    <p><font color="#cc0099">前置条件：</font>执行操作之前，对系统或领域模型对象状态的重要假设。这些假设比较重要，应该告诉读者。 </p>
    <p><font color="#cc0099">后者条件：</font>最重要的部分。完成操作后，领域模型对象的状态。后续章节将详细描述这个问题。 </p>
    <p><strong>定义：什么是系统操作</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以为<font color="#cc0000">系统操作</font>定义操作契约，系统操作时作为黑盒构件的系统在其公共接口中提供的操作。系统操作可以在绘制SSD草图时确定，如图11-2。更精确地讲，SSD展示了<font color="#cc0000">系统事件</font>，即涉及系统的事件或I/O消息。输入的系统事件意味着系统具有用来处理事件的系统操作，正如OO消息（一种事件或信号）要由OO方法（一种操作）来处理那样。 涉及所有用例的系统操作的完整集合将系统视为一个构件或类，定义了公共的<font color="#cc0000">系统接口</font>。在UML中，作为整体的系统可以表示成名称为（例如）System的类的一个对象。 </p>
    <p><strong>定义：后置条件&nbsp;&nbsp;&nbsp;&nbsp;</strong><font color="#cc0000">&nbsp; 后置条件（postcondition）描述了领域模型内对象状态的变化。领域模型状态变化包括创建实例、形成或消除关联以及改变属性。&nbsp;&nbsp;</font>&nbsp; <font color="#990099">后置条件不是在操作过程中执行的活动</font>，相反，它们是对领域模型对象的观察结果，当操作完成后，这些结果为真，就像浓烟散去后所能够清晰看到的事物。&nbsp;&nbsp; 概括说来，后置条件可以分为以下三种类型：<font color="#cc0000">（1》创建或删除实例 2》属性值的变化 3》形成或消除关联（精确地讲，是UML链接）</font>）。消除关联比较少见。删除实例的后置条件也十分少见，因为人们通常不会关心明确强制销毁现实世界中的事物。 </p>
    <p><font color="#0000cc">后置条件如何与领域模型相关</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这些后置条件主要是在领域模型对象的语境中表示的。可以创建什么实例？（来自于领域模型）可以形成什么关联？（来自于领域模型），等等。 </p>
    <p><font color="#0000cc">动机：为什么需要后置条件</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先，后置条件并不总是必要的。在大多数情况下，系统操作的效果对开发者而言是相对清晰的，他们可以通过阅读用例、与专家交流或根据自己的知识对此进行理解。但有时需要更详细和精确的描述。契约正提供了此类描述。注意，后置条件支持细粒度的细节和精确性，以声明操作必须具备的结果。在用例中也可以表示为这种详细级别，但并不适宜，因为过于冗长和详细。契约是优秀的需求分析或OOA工具，能够详细描述系统操作（就领域模型对象而言）所需的变化，而不需描述这些操作是如何完成的。换言之，设计可以被延迟，我们可以重点分析必须发生的事物，而不是如何实现这些事物。 </p>
    <p><font color="#0000cc">准则：如何编写后置条件</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用过去时态表达后置条件，以强调它们是由操作引起的状态变化的观察结果，而不是发生的活动。这也是后置条件名称的由来！例如<font color="#cc0000">&nbsp;（较好）</font>创建了SalesLineItem&nbsp;&nbsp;&nbsp;&nbsp;而不是<font color="#cc0000">&nbsp;&nbsp;（较差）</font>创建SalesLineItem或SalesLineItem被创建。 </p>
    <p><font color="#0000cc">准则：后置条件因该完善到何种程度？敏捷与重量级分析 </font>&nbsp; &nbsp;&nbsp;&nbsp; 契约有可能是无用的。这一问题将在后续章节中讨论。但是假设契约有用，则为所有系统操作生成完整详细的后置条件集合是不可能的，或是没有必要的。就敏捷建模的本质而言，只是将其视为初始最佳的猜测，在这种理解下，详尽的后置条件是无法完成的，而所谓&#8220;完善&#8221;的规格说明也是几乎不可能的或不可信的。但是要理解，进行轻量的分析是现实和有效的，这并不是意味着要在编程前放弃任何调查，这又是另一种极端的误解。 </p>
    <p><strong>示例：enterItem的后置条件&nbsp;</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以下内容剖析了enterItem系统操作后置条件的动机。 </p>
    <p><font color="#0000cc">创建和删除实例&nbsp;&nbsp;</font>&nbsp;&nbsp;&nbsp;&nbsp;输入itemID和商品项目的quantity后，会创建哪些新对象？SalesLineItem。因此： </p>
    <ul>
        <li>创建了SalesLineItem的实例sli(创建实例)。 </li>
    </ul>
    <p>注意对实例的命名。该名字简化了在其他后置条件语句中对该新实例的引用。 </p>
    <p><font color="#0000cc">属性修改&nbsp;&nbsp;&nbsp;</font>&nbsp;&nbsp; 在收银员输入商品项目标识和对应的商品数量后，应该修改了哪些新对象或现有对象的属性？SalesLineItem的quantity应该变为等于quantity参数。因此 </p>
    <ul>
        <li>sli.quantity赋值为quantity（修改属性） </li>
    </ul>
    <p><font color="#0000cc">准则：是否应该更新领域模型</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通常在创建契约的过程中会发现，需要在领域模型中记录新的概念类、属性或关联。不要局限于先前定义的领域模型，当你在思考操作契约过程中有新发现时，要对领域模型进行改进。<font color="#cc0000">在迭代和进化式方法中（并且反映了软件项目的真是情况），所有分析和设计制品都不是完善的，要根据新发现对其改进</font>。 </p>
    <p><font color="#0000cc">准则：契约在何时有效</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在UP中，用例是项目需求的主要知识库。用例可以为设计提供大部分或全部所需细节。这种情况下，契约就没有什么作用。但有时对于用例而言，所需状态变化的细节和复杂性难以处理或过于细节化。如果开发者在没有操作契约的情况下，能够准确地理解所需要完成的工作，则可以不编写契约。 </p>
    <p><font color="#0000cc">准则：如何创建和编写契约 </font>&nbsp; &nbsp;&nbsp;&nbsp; 创建契约时可以应用以下指导：1》从SSD中确定系统操作。2》如果系统操作复杂，其结果可能不明显，或者在用例中不清楚，则可以为其构造契约。3》使用以下几种类别来描述后置条件：1》创建和删除实例。 2》修改属性 3》形成清除关联。 </p>
    <p><font color="#990099">编写契约</font> </p>
    <ul>
        <li>如上所述，以说明性的、被动式的过去时态编写后置条件，以便强调变化的观察结果，而非其如何实现的设计。例如：（较好）创建了SalesLineItem。 （较差）创建SalesLineItem。
        <li>记住，要在已有或新创建的对象之间建立关联。例如，当enterItem操作发生时，仅创建SalesLineItem的实例是不够的。操作完成后，还应该将此信创建的实例与Sale关联。因此： 将SalesLineItem与Sale关联（形成关联）。 </li>
    </ul>
    <p><font color="#990099">最常见的错误 </font>&nbsp; 最常见的问题是遗漏了关联的形成。特别是当创建了新实例时，通常需要建立与若干对象的关联。不要遗忘这一点！ </p>
    <p><font color="#0000cc">应用UML：操作、契约和OCL</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UML正式地定义了操作（operation）。引证如下：操作是可以调用对象执行的转换或查询的规格说明。例如，在UML中，接口元素就是操作。操作是抽象而非实现。相比之下，方法是操作的实现。引证如下：操作的实现。它规定了与操作关联的算法或过程。在UML元模型中，操作具有<font color="#990099">特征标记</font>，在这种语境中最为重要的是，与一组UML约束对象关联，这些对象被分类为指定操作语义的前置条件和后置条件。概括一下，UML通过约束定义操作的语义，这些约束可以用前置或后置的形式指定。要注意，本章强调UML操作的规格说明不能表示算法或解决方案，而只能是状态的变化或操作的效果。契约除了用于指定整个System（也就是说，系统操作）的公共操作外，还能够用于任何粒度的操作：子系统的公共操作（或接口）、构件、抽象类等。例如，可以为Stack这样的单个软件类定义操作。本章讨论的粗粒度操作属于将整个系统作为黑盒构件的System类，但是UML操作可以属于任何类或接口，它们都具有前置和后置条件。 </p>
    <p><font color="#cc0000">用OCL表示的操作契约 </font>&nbsp;&nbsp;&nbsp; 本章中的前置后后置条件的格式是非正式的自然语言格式，完全可以被UML接受，并易于理解。但UML还具有正式、严谨的语言，成为对象约束语言（OCL），OCL可以用来表示UML操作的约束。<font color="#cc0000">准则：除非有不可避免的实际原因要求人们学习和使用OCL，否则要保持简单并使用自然语言。尽管我确信存在真实（且有效）的应用，但我从未见过使用OCL的项目，即便我调查了大量客户和项目</font>。 </p>
    <p>&nbsp;</p>
    <p><strong>过程：UP的操作契约&nbsp;</strong>&nbsp;&nbsp;&nbsp;&nbsp; 前置和后置条件契约式UML指定操作的常用风格。在UML中，操作在许多级别中存在，从System到细粒度的类。系统级别的操作契约式用例模型的一部分，尽管原始的RUP或UP文档中并没有正式地强调这一点。RUP作者证实了用例模型中包括操作契约。 </p>
    <p><font color="#0000cc">阶段&nbsp;&nbsp; </font>&nbsp; <font color="#990099">&nbsp;初始</font>--初始阶段不会引入契约，因为过于详细。 &nbsp; <font color="#990099">细化</font>--如果使用契约的话，大部分契约将在细化阶段进行编写，这时已经编写了大部分用例。只对最复杂和微妙的系统操作编写契约。 </p>
    <p>&nbsp;</p>
    </li>
</ul><img src ="http://www.blogjava.net/kissyan4916/aggbug/330213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2010-08-30 00:39 <a href="http://www.blogjava.net/kissyan4916/articles/330213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Applying UML and Patterners(Third Edition)学习笔记（十） </title><link>http://www.blogjava.net/kissyan4916/articles/329932.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Wed, 25 Aug 2010 16:28:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/329932.html</guid><description><![CDATA[<span class="l">
<p><a href="file:///E:/学习笔记/Applying%20UML%20and%20Patterners(Third%20Edition).mm.html" target="_blank"><span class="l">~</span>&nbsp;第10章：系统顺序图 </a>
<ul>
    <li>
    <p><strong>目标</strong>： 1》确定系统事件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2》为用例场景创建系统顺序图 </p>
    <p><font color="#0000cc">简介</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统顺序图（SSD）是为阐述与所讨论系统相关的输入和输出事件而快速、简单地创建的制品。它们是操作契约和（最重要的）对象设计的输入。UML包含以顺序图为形式的表示法，用以阐述外部参与者到系统的事件<font color="#cc0000">。图10-1</font>中所示的是强调系统顺序图的UP制品的相互影响。用例文本及其所示的系统事件是创建SSD的输入。SSD中的操作可以在操作契约中进行分析，在词汇表中被详细描述，并且（最重要的是）作为设计协作对象的起点。 </p>
    <p><font color="#000000"><strong>示例：NextGen SSD&nbsp;</strong></font><font color="#0000cc">&nbsp;</font>&nbsp;&nbsp;&nbsp; 对于用例中一系列特定事件，SSD展示了直接与系统交互的外部参与者、系统（作为黑盒）以及由参与者发起的系统事件（<font color="#cc0000">如图10-2</font>所示）。 </p>
    <p><font color="#000000"><strong>什么是系统顺序图&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</strong></font>用例描述外部参与者是如何与我们所希望创建的系统进行交互的。在交互中，参与者对系统发起系统事件(system event)，通常需要某些系统操作(system operation)对这些事件加以处理。&nbsp;&nbsp; UML包含了顺序图作为表示法，以便能够阐述参与者的交互及参与者引发的操作。&nbsp;&nbsp; 系统顺序图表示的是，对于用例的一个特定场景，外部参与者产生的事件，其顺序和系统之内的事件。所有系统被视为黑盒，该图强调的是从参与者到系统的跨越系统边界的事件。<font color="#0000cc">准则：应为每个用例的主成功场景，以及频繁发生的或者复杂的替代场景绘制SSD。</font> </p>
    <p><font color="#000000"><strong>动机：为什么绘制SSD&nbsp;&nbsp;&nbsp; </strong></font>&nbsp; &nbsp; 基本上，软件系统要对以下三种事件进行响应：1）来自于参与者（人或计算机）的外部事件，2）时间事件，3）错误或异常（通常源于外部）。因此，需要准确地知道，什么是外部输入的事件，即系统事件。这些事件是系统行为分析的重要部分。 &nbsp;&nbsp;在对软件应用将如何工作进行详细设计之前，最好将其行为作为&#8220;黑盒&#8221;来调查和定义系统行为(system behavior)描述的是系统做什么，而无需解释如何做。这种描述的一部分就是系统顺序图。其他部分包括用例和系统操作契约（稍后进行讨论）。 </p>
    <p><font color="#000000"><strong>应用UML：顺序图</strong></font><font color="#0000cc">&nbsp;</font>&nbsp;&nbsp;&nbsp;&nbsp; UML没有定义所谓的&#8220;系统&#8221;顺序图，而只是定义了&#8220;顺序图&#8221;。这一限定强调将系统的应用视为黑盒。之后，我们会在另一语境下使用顺序图，阐述完成工作的交互软件对象的设计。<font color="#0000cc">顺序图中的循环</font>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意在<font color="#cc0000">图10-2</font>中是如何使用交互框(interaction frame)来表示顺序图中的循环的。 </p>
    <p><font color="#000000"><strong>SSD和用例之间的关系&nbsp;&nbsp;</strong></font>&nbsp;&nbsp;&nbsp;&nbsp;SSD展示了用例中一个场景的系统事件，因此它是从对用例的考察中产生的（<font color="#cc0000">参见图10-3</font>）。<font color="#0000cc">应用UML：是否应该在SSD中显示用例文本 &nbsp;&nbsp;&nbsp;&nbsp; </font>&nbsp;通常不这么做。如果你为SSD适当地命名，可以指明对应用的用例。 </p>
    <p><font color="#000000"><strong>如何为系统事件和操作命名&nbsp;</strong></font>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;系统事件应该在意图的抽象级别而非物理的输入设备级别来表达。<font color="#cc0000">如图10-4</font>所示，系统事件的名称以动词开始（增加......，输入......，结束......，产生......），可以提高清晰程度，因为这样可以强调这些事件是命令或请求。 </p>
    <p><font color="#000000"><strong>如何为涉及其他外部系统的SSD建模</strong></font><font color="#0000cc">&nbsp; </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SSD也同样可以用来阐述系统之间的协作，但这个问题我们会在案例研究的猴戏迭代中讨论，因为被次迭代不包括远程系统协作。 </p>
    <p><font color="#000000"><strong>SSD的哪些信息要放入词汇表中</strong></font><font color="#0000cc">&nbsp; </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SSD中所示的元素（操作名称、参数、返回的数据）是简洁的。需要对这些元素加以适当的解释以便在设计时能够明确地知道输入了什么，输出了什么。词汇表是详细描述这些元素的最佳选择。 &nbsp;<font color="#0000cc">&nbsp;准则：对大多数制品来说，一般在词汇表中描述其细节。</font> </p>
    <p><font color="#000000"><strong>示例：Monopoly SSD&nbsp;</strong></font>&nbsp;&nbsp;&nbsp; <font color="#cc0000">&nbsp; 参见图10-5</font>。 </p>
    <p><font color="#000000"><strong>过程：迭代和进化式SSD &nbsp; </strong></font>&nbsp;&nbsp;&nbsp; 不用为所有场景创建SSD，除非你在使用需识别所有系统操作的预算技术（例如功能点计数）。相反，只需为下次迭代所用的场景绘制SSD。同时，不应该花费太长时间来绘制SSD，用几分钟或半小时来绘制即可。当需要了解现有系统的接口和协作时，或者将其架构记录在文档时，SSD也是十分有效的。<font color="#0000cc">&nbsp; UP中的SSD&nbsp; </font>&nbsp; SSD是用例模型的一部分，将用例场景隐含的交互可视化。尽管UP的创建者们意识到并理解这些图的用途，但最初的UP描述中并没有直接提到SSD。有大量可能有用和广泛使用的分析和设计制品或活动并没有在UP或RUP文档中提及，SSD就是其中之一。但是UP十分灵活，提倡引入任何能够增加价值的制品和实践。<font color="#0000cc">&nbsp; UP阶段</font><font color="#000000">&nbsp;&nbsp; </font><font color="#990099">初始--</font><font color="#000000">通常不会在该阶段引入SSD，除非你要对涉及的技术进行粗略的估算（不要指望初始阶段的估算是可靠的），这种估算的基础是对系统操作的识别。 &nbsp;</font><font color="#990099">&nbsp;细化--</font><font color="#000000">大部分SSD在细化阶段创建，这有利于识别系统事件的细节以便明确系统必须被设计和处理的操作，有利于编写系统操作契约，并且可能有利于对估算的支持。&nbsp;</font>&nbsp;&nbsp;&nbsp;</p>
    </li>
</ul>
<p><a href="file:///E:/学习笔记/Applying%20UML%20and%20Patterners(Third%20Edition).mm.html" target="_blank">&nbsp;</p>
</span></a><img src ="http://www.blogjava.net/kissyan4916/aggbug/329932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2010-08-26 00:28 <a href="http://www.blogjava.net/kissyan4916/articles/329932.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Applying UML and Patterners(Third Edition)学习笔记（九）</title><link>http://www.blogjava.net/kissyan4916/articles/329841.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Tue, 24 Aug 2010 17:00:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/329841.html</guid><description><![CDATA[<p><a href="file:///C:/Users/Ryan/Desktop/Applying%20UML%20and%20Patterners(Third%20Edition).mm.html" target="_blank"><span class="l">~</span>&nbsp;第9章：领域模型 </a>
<ul>
    <li>
    <p><strong>目标 </strong>1》确定与当前迭代相关的概念类 2》创建初始的领域模型 3》为模型建立适当的属性和关联。 </p>
    <p><strong>简介&nbsp;</strong>&nbsp;&nbsp;&nbsp;&nbsp; 领域模型是OO分析中最重要的和经典的模型。它阐述了领域中的重要概念。领域模型可以作为设计某些软件对象的灵感来源，也将作为在案例研究中所探讨的几个制品的输入。本章还将展示UML表示法上OOA/D知识的价值。基本表示法非常容易，但是对于有用模型的一些深奥的建模准则，则需要数周或数月才能掌握。 &nbsp;&nbsp;&nbsp;&nbsp; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;和敏捷建模和UP精神中的所有事物一样，领域模型也是可选制品。在<font color="#cc0000">图9-1</font>中所示的UP制品相互影响力中强调了领域模型。领域模型的范围限定于当前迭代所开发的用例场景，领域模型能够被不断地演进用以展示相关的重要概念。相关的用例概念和专家的观点将作为创建领域模型的输入。反过来，该模型又会影响操作契约、词汇表和设计模型，尤其是设计模型中<font color="#3300ff">领域层(domain layer)</font>的软件对象。 </p>
    <p><strong>示例</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#cc0000">图9-2</font>展示了以UML类图(class diagram)表示法绘制的部分领域模型。对领域模型应用UML类图表示法会产生<font color="#3300ff">概念透视图(conceptual perspective)</font>模型。 确定一组概念类是OO分析的核心。如果能够通过熟练和快速(就是说，每次早期迭代不超过几个小时)的调查来完成这项工作，那么通常会在设计过程中得到回报，因为领域模型能够支持更好的理解和沟通。<font color="#3300ff">准则：避免瀑布思维倾向，为完成详尽或&#8220;正确&#8221;的领域模型而进行大量建模工作。这些方式都应避免，并且这种过量的建模工作反而会导致分析停滞，这种调查几乎不会有什么回报。</font> </p>
    <p><strong>什么是领域模型&nbsp;&nbsp;</strong>&nbsp;&nbsp;&nbsp;&nbsp;这一精髓的面向对象分析步骤是从领域到重要概念或对象的分解。<font color="#0000cc">领域模型(domain model)</font>是对领域类或现实世界中对象的可视化表示。领域模型也称为概念模型、领域对象模型和分析对象模型。<font color="#0000cc">定义：在UP中，术语"领域模型"指的是对现实世界概念类的表示，而非软件对象的表示。该术语并不是指用来描述软件类、软件架构领域层或有职责软件对象的一组图</font>。UP对领域模型的定义是，可以在业务建模科目中创建的制品之一。更准确地讲，UP领域模型是UP业务对象模型(BOM)的特化，&#8220;专用于解释业务领域中重要的&#8216;事物&#8217;和产品&#8221;也就是说，领域模型专注于特定领域。更为广泛的BOM是扩展的、通常十分庞大和难以创建的多领域模型，BOM覆盖整个业务及其所有子域，本章并不涵盖这部分内容，并且也不提倡创建BOM（因为需要在是实现前进行大量建模）。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;应用UML表示法，领域模型被描述为一组没有定义操作（方法的特征标记）的类图)（class diagram）。它提供了概念透视图。它可以展示： </p>
    <ul>
        <li>领域对象或概念类。
        <li>概念类之间的关联
        <li>概念类的属性。 </li>
    </ul>
    <p><font color="#0000cc">定义：为什么把领域模型称为&#8220;可视化字典&#8221;</font> </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请仔细观察图<font color="#cc0000">9-2.</font>看看它是如何对领域词汇或概念进行可视化和关联的。领域模型还显示了概念类的抽象。因为这种抽象可以表达其他大量事物，例如登陆、销售等。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 领域模型（使用UML表示法）描述的信息也可以采用纯文本方式（UP词汇表）表示。但是在可视化预言中更容易理解这些术语，特别是它们之间的关系，因为我们的思维更擅长理解形象的元素和线条连接。因此，领域模型是可视化字典，表示领域的重要抽象、领域词汇和领域的内容信息。 </p>
    <p>定义：领域模型是软件业务对象图吗&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如图9-3所示，UP领域模型是对所关注的现实世界领域中事物的可视化，而不是诸如Java或C#类的软件对象，或有职责软件对象（参见图9-4）。因此以下元素不适用于领域模型： </p>
    <ul>
        <li>软件制品，例如窗口或数据库，除非已建模的领域是针对软件概念的，例如图形化用户界面的模型。
        <li>职责或方法。 </li>
    </ul>
    <p><font color="#3300ff">定义：&#8220;领域模型&#8221;的两个传统含义 </font>&nbsp;&nbsp;&nbsp;&nbsp; 在UP及本章中&#8220;领域模型&#8221;是现实世界中对象的概念透视图，而非软件透视图。但这一术语是多义的，也用来表示&#8220;软件对象领的领域层&#8221;也就是说，在表示层或UI层之下的软件对象层是由<font color="#3300ff">领域对象(domain object)</font>组成的--领域对象是表示问题领域空间事物的软件对象，并且与&#8220;业务逻辑&#8221;或&#8220;领域逻辑&#8221;方法相关。我通常会使用<font color="#3300ff">领域层(domain layer)</font>来表示领域模型针对软件的第二个含义，因为领域层也十分通用。 </p>
    <p>&nbsp;</p>
    <p><font color="#3300ff">定义：什么概念类<strong>&nbsp;</strong>&nbsp;&nbsp;</font>&nbsp;&nbsp;&nbsp;领域模型阐述领域中的概念类或词汇。概念类是思想、事物或对象。更正式的讲，概念类可以从其符号、内涵和外延来考虑。 </p>
    <ul>
        <li>符号：表示概念类的词语或图形
        <li>内涵：概念类的定义
        <li>概念类所适用的一组示例 </li>
    </ul>
    <p><font color="#3300ff">定义：领域模型和数据模型是一回事吗&nbsp;</font>&nbsp;<strong>&nbsp; </strong>&nbsp;&nbsp;&nbsp;领域模型不是<font color="#3300ff">数据模型</font>（通过对数据模型的定义来表示存储于某处的持久性数据），所以在领域模型里，并不会排除需求中没有明确要求记录其相关信息的类（这是对关系数据库进行数据建模的常见标准，但与领域建模无关），也不会排除没有属性的概念类。例如，没有属性的概念类是合法的，或者在领域内充当纯行为角色而不是信息角色的概念类也是有效的。 </p>
    <p><strong>动机：为什么要创建领域模型 </strong>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;领域模型和领域层使用相似的命名可以减少软件表示与我们头脑中的领域模型之间的差异。&nbsp; <font color="#0000cc">&nbsp; 动机：降低与OO建模之间的表示差异 </font>&nbsp; &nbsp;这是OO的关键思想：领域层软件类的名称要源于领域模型中的名称，以使对象具有源于领域的信息和职责。<font color="#cc0000">图9-6</font>阐述了这一思想。这样可以<strong>减少</strong>我们的思维与软件模型之间的<strong>表示差异</strong>。同事，这并非只是哲学上的考究--对时间与金钱也会有实际的影响。 </p>
    <p><strong>准则：如何创建领域模型 </strong>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;1、寻找概念类 2、将其绘制为UML类图中的类 3、添加关联和属性 </p>
    <p><strong>准则：如何找到概念类&nbsp; </strong>&nbsp; &nbsp;&nbsp;&nbsp;既然领域模型表示的是概念类，那么关键问题是如何才能找到概念类。<font color="#0000cc">找到概念类的三条策略 </font>&nbsp; 1、重用和修改现有的模型。这是首要、最佳且最简单的方法，如果条件许可，通常从这一步开始。在许多常见领域中都存已发布的、绘制精细的领域模型和数据模型（可以修改为领域模型），这些领域包括库存、金融、卫生等等。我所参考的书籍包括Martin Fowler的《分析模式》(Analysis Patterns)、David hay的Data Model Patterns和Len Silverston的Data Model Resource Book(卷1和卷2) 2、使用分类列表&nbsp;&nbsp;&nbsp;3、确定名词短语&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 重用现有的模型是最好的办法，但超出了本书的范围。第二个方法（使用分类列表）也很有效。&nbsp;&nbsp; <font color="#0000cc">方法2：使用分类列表 </font>&nbsp;&nbsp;我们可以通过制作概念类候选列表来开始创建领域模型。<font color="#cc0000">参看表9-1</font>。 &nbsp;<font color="#0000cc">&nbsp;方法3：通过识别名词短语寻找概念类 </font>&nbsp; &nbsp;在【Abbot83】中所建议的另一种有效(因为简单)技术是语言分析(linguistic analysis)，即在对领域的文本性描述中识别名词和名词短语，将其作为候选的概念类或属性。&nbsp; <font color="#cc0000">&nbsp; 准则：使用这种方法时必须小心。不可能存在名词到类的映射机制，并且自然语言中的词语具有二义性</font>。领域模型是重要领域概念和词汇的可视化。那么从哪里找到这些术语？其中某些术语来源于用例。另外一些术语则源于其他文档，或是专家的想法。无论如何，用例都是挖掘名词短语的重要来源之一。 </p>
    <p><strong>示例：寻找和描绘概念类 </strong>&nbsp; &nbsp;&nbsp; <font color="#cc0000">&nbsp;参见图9-7 图9-8</font> </p>
    <p><strong>准则：敏捷建模--绘制类图的草图 </strong>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;注意<font color="#cc0000">图9-8中</font>UML类图的这种草图风格，让类框的底部和右侧呈开发状态。这样可以在发现新元素时对类方便地进行扩展。 </p>
    <p><strong>准则：敏捷建模--是否要使用工具维护模型</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 敏捷模型在创建后通常很快就被抛弃了（即使这样，如果你使用白板的话，我还是建议用数据相机拍下来）。基于这种观点，则没有理由去维护或更新这些模型。但是这也不意味着更新模型就是错的。通常，进化的软件领域层对大部分重要术语会给予提示，而且长生命期的OO分析领域模型不会增加价值。 </p>
    <p><span style="font-family: SansSerif, sans-serif; font-weight: bold">准则：报表对象--模型中是否要包括&#8220;票据&#8221;</span>
    <p><strong>准则：像地图绘制者一样思考；使用领域术语</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;地图绘制者的策略既可用于地图，也可以用于领域模型。<font color="#cc0000">准则： 以地图绘制者的工作思维创建领域模型：1》使用地域中现有的名称 2》排除无关或超出范围的特性 3》不用凭空增加事物</font> </p>
    <p><strong>准则：如何对非现实世界建模</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有些软件系统的领域与自然领域或业务领域几乎没有类似之处，例如电信软件。然而还是有可能为这些领域创建领域模型。此时需要高度的抽象，对常见的非OO设计进行回归，并且认真吸取领域专家所使用的核心词汇和概念。 </p>
    <p><strong>准则：属性与类的常见错误&nbsp;&nbsp;</strong>&nbsp;&nbsp;&nbsp;&nbsp;在创建领域模型时最常见的错误是，把应该是概念类的事物表示为属性。 &nbsp; <font color="#0000cc">准则：如果我们认为某概念类X不是现实世界中的数字或文本，那么X可能是概念类而不是属性。</font> </p>
    <p><strong>准则：何时使用&#8220;描述&#8221;类建模</strong>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000cc">描述类（description class）</font>包含描述其他事物的信息。在[Coad92]中，这种类通常被命名为<font color="#0000cc">项目-描述符</font>模式。<font color="#cc0000">图9-9 &nbsp;</font>&nbsp;<font color="#0000cc">准则：何时需要描述类&nbsp;&nbsp;</font>&nbsp;在以下情况下需要增加描述类（例如，ProductDescription） </p>
    <ul>
        <li>需要有关商品或服务的描述，独立于任何商品或服务的现有实例
        <li>删除其所描述事物（如Item）的实例后，导致信息丢失，而这些信息是需要维护的，但是被错误地与所删除的事物关联起来。
        <li>减少冗余或重复信息。 </li>
    </ul>
    <p><font color="#cc0000">图9-10</font> </p>
    <p><strong>关联&nbsp;&nbsp;&nbsp; </strong>&nbsp; 找到并表示出关联是有助的，这些关联能够满足当前所开发场景的信息需求，并且有助于理解领域。<font color="#0000cc">关联（association）是类（更精确地说，是这些类的实例）之间的关系，表示有意义和值得关联的连接（图9-11）</font>在UML中，关联被定义为&#8220;两个或多个类元之间的语义联系，涉及这些类元实例之间的连接&#8221;。 &nbsp; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000cc">&nbsp;准则：何时表示关联</font>&nbsp;&nbsp;&nbsp;关联表示了需要持续一段时间的关系，根据语境，可能是几毫秒或数年。换言之，我们需要记录哪些对象之间的关系？ 由于领域模型是从概念角度出发的，所以是否需要记录关联，要基于现实世界的需要，而不是基于软件的需要，尽管在实现过程中，会有出现大量对关联的需要。<font color="#cc0000">图9-11关联</font>。 &nbsp;<font color="#3300cc">&nbsp;准则：在领域模型中要考虑如下关联：</font><font color="#000000">1》如果存在需要保持一段时间的关系，将这种语义表示为关联（&#8220;需要记住&#8221;的关联）2》从常见关联列表中派生的关联。 </font></p>
    <p><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#3300cc">准则：为什么应该避免加入大量关联</font>&nbsp; &nbsp; 在具有n个节点的图中，节点间有(n*(n-1))/2个关联，这可能是个非常大的数值。连线太多会产生&#8220;视觉干扰&#8221;，使图变的混乱，所以要谨慎地增加关联线。使用本章准则所建议的标准，并且重点关注&#8220;需要记住&#8221;的关联。 &nbsp;&nbsp; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp; <font color="#3300cc">&nbsp;观点：关联是否会在软件中实现</font>&nbsp;&nbsp; 在领域建模过程中，关联不是关于数据流、数据库外键联系、实例变量或软件方案中的对象连接语句；关联声明的是针对现实领域从纯概念角度看有意义的关系。也就是说，这些关系的大部分将作为（设计模型和数据模型中的）导航和可见性路径在软件中加以实现。但是，领域模型不是数据模型；添加关联是为了突出我们对重要关系的大致理解，而非记录对象或数据的结构。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#3300cc">应用UML：关联表示法</font>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关联被表示为类之间的连线，并冠以首字母大写的关联名称。<font color="#cc0033">见图9-12</font>。<font color="#cc0033">警告：阅读导向箭头对模型来说并不具有特别意义，只是对阅读图的人有所帮助</font>。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#3300cc">准则：在UML中如何对关联命名&nbsp;&nbsp;</font>&nbsp;&nbsp;&nbsp; 以&#8220;类名-动词短语-类名&#8221;的格式为关联命名，其中的动词短语构成了可读的和有意义的顺序。诸如&#8220;拥有&#8221;或&#8220;使用&#8221;这样简单关联名称通常是拙劣的，因为这种名称不会增强我们对领域的理解。关联名称应该使用首字母大写的形式，因为关联表示的是实例之间链接的类元。在UML中，类元应该首字母大写。以下是复合性关联名称的两种常见并且等价的合法格式：1》Records-current &nbsp;&nbsp;2》RecordsCurrent </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#3300cc">应用UML：角色</font>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关联的每一端称为角色(role)。角色具有如下可选项： 1》多重性表达式 2》名称 3》导航 多重性将在后面讨论。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#3300cc">&nbsp;应用UML：多重性 </font>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;多重性(multiplicity)定义了类A有多少个实例可以和类B的一个实例关联（<font color="#cc0033">见图9-13</font>）。在<font color="#cc0033">图9-14</font>中将给出一些多重性表达式的例子。多重性的值表示在特定时刻（而不是某个时间跨度内）有效关联的实例数量。多重性的值和建模者和软件开发者的关注角度有关，因为它表达了将要（或可能）在软件中反映的领域约束。<font color="#cc0000">见图9-15.</font> </p>
    <p><font color="#cc0033">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#0000cc">应用UML：两个类之间的多重关联&nbsp;&nbsp; </font>&nbsp;&nbsp;&nbsp;在UML类图中，两个类之间可能会有多重关联，这并不罕见<font color="#cc0000">见图9-16</font>。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000cc">&nbsp;准则：如何在常见关联列表中找到关联&nbsp; </font>&nbsp;&nbsp;&nbsp;&nbsp;通过使用<font color="#cc0000">表9-2</font>中的列表来开始添加关联。该列表中包含值得考虑的常见类别，对业务系统而言更是如此。 </p>
    <p>&nbsp;</p>
    <p><strong><font color="#000000">&nbsp;&nbsp;示例：领域模型中的关联 &nbsp;&nbsp;</font></strong>&nbsp;&nbsp;&nbsp;参见<font color="#cc0000">图9-17和图9-18</font>。 </p>
    <p><strong><font color="#000000">属性&nbsp;</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;确定概念类的属性是有助的，能够满足当前所开发场景的信息需求。属性(attribute)是对象的逻辑数据值。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000cc">&nbsp;准则：何时展示属性</font>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当需求（例如，用例）建议或暗示需要记住信息时，引入属性。 </p>
    <p><font color="#0000cc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;应用UML：属性表示法&nbsp; </font>&nbsp;&nbsp;&nbsp;&nbsp;属性在类框图的第二格中表示（<font color="#cc0000">参见图9-19</font>）。其类型和其他信息是可选的。在UML中，属性的完整语法是： <font color="#990099">&nbsp;visibility name:type multiplicity = default {property-string}</font>，对该表达式译为中文是： 可见性&nbsp;&nbsp;名称：类型&nbsp;&nbsp;多重性=默认值 {特性表}&nbsp;&nbsp; 参见图9-20。依照惯例，大部分建模者会假设属性的可见性为私有的（-），除非有另外表示，所以我通常不会显式地标出可见性符号。&nbsp;&nbsp; {readOnly}大概是属性的{property-string}部分最常用的值。&nbsp;&nbsp; 多重性用来指示可能出现的值，或者可以填充到（集合）属性中的对象数量。例如，许多领域要求知道某人的名和姓，但是中名是可选的。表达式middleName:[0..1]表示可选值，该属性可以出现0或1个值。<font color="#0000cc">准则：在哪里记录属性需求</font>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 有些建模者认可只在领域模型中保留这种规格说明，但是我发现这是一种错误倾向，并且被扩散了，因为人们往往不去仔细查看领域模型或需求指导。人们也通常不会维护领域模型。 &nbsp; 我建议把所有这种属性需求置于UP词汇表（UP词汇表可充当数据字典）。可能我已经花费了一个小时和领域专家一起画出领域模型的草图；之后，我可以花费15分钟浏览这个草图并将其中表示的属性需求转移到词汇表中。另一种方法是，使用工具将UML模型和数据字典统一起来；这样所有属性会自动显示为数据字典的元素。 &nbsp;<font color="#0000cc">导出属性</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sale中的total属性可以从SalesLineItems中的信息计算或导出。当我们需要表达：这是重要属性，但是导出的，那么可以使用UML的约定：在属性名称前加以"/"符号。 收银员输入的数量可以被记录为SalesLineItem的属性（<font color="#cc0000">参见图9-21</font>）。但该数量可以从关联的多重性的实际值计算出来，所以被表示为导出属性，即可以由其他信息导出的属性。 </p>
    <p>&nbsp;&nbsp;&nbsp; <font color="#0000cc">&nbsp;&nbsp;准则：什么样的属性类型是适当的</font>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <font color="#3333ff">关注领域模型中的数据类型属性</font>&nbsp; &nbsp;&nbsp;通俗的说，大部分属性类型应该是&#8220;简单&#8221;数据类型，例如数字和布尔。通常，属性的类型不应该是复杂的领域概念，例如Sale或Airport。<font color="#cc0000">图9-22</font>中Cashier类的currentRegister属性是不合适的，因为其类型是Register，并不是简单数据类型（例如Number或String）。表达Cashier使用Register的最有效的做法是使用关联，而不是使用属性。 &nbsp;<font color="#0000cc">&nbsp;准则</font>&nbsp; <font color="#0000cc">&nbsp;领域模型中属性的类型更应该是数据类型(data type)。十分常见的数据类型包括：Boolean,Date（或DateTime）、Number、Character、String(Text)和Time。其他常见的类型还有Address、Color、Geometrics(Point、Rectangle)、Phone Number、Social Security、Number、Universal Product Code(UPC)、SKU、ZIP或者是邮政编码、枚举类型</font>。 &nbsp; <font color="#0000cc">准则：通过关联而不是属性来表示概念类之间的关系</font>。<font color="#cc0000">参见图9-23</font>。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000cc">数据类型 </font>&nbsp;&nbsp;&nbsp; &nbsp;领域模型中的属性通常应该是数据类型(data type)。一般来说，数据类型是&#8220;基本&#8221;类型，诸如数字、布尔、字符、字符串和枚举(例如，尺寸={小，打})。更准确地讲，UML术语中的数据类型指的是一组值，而这组值的标识本身不具有任何含义（在我们的模型或系统的语境下）。换言之，对数据类型的等价性检验不是基于标识，而是根据值来判断的。 &nbsp;&nbsp;&nbsp;&nbsp; 数据类型值往往是恒定不变的，例如，Integer的实例"5"是不变的；Date的实例&#8220;Nov.13,1990&#8221;可能也是不变的。而Person实例的lastName属性可能对不同人有不同的值。 &nbsp; 从软件角度出发，很少会对Integer或Date实例的存储地址（标识）进行比较，一般是对值进行比较。另一方面，即使Person的不同实例具有相同的属性值，但还是可以区分和比较其存储地址，因为其唯一标识的重要性。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000cc">&nbsp;观点：代码中的属性 </font>&nbsp; &nbsp;&nbsp;&nbsp; 在领域模型中建议属性主要为数据类型，并不意味着C#或Java的属性只能是简单的基础数据类型。领域模型是概念透视图，不是软件透视图。在设计模型中，属性可以是任何类型。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000cc">准则：何时定义新的数据类型类 </font>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;NextGen POS系统需要itemID属性，可以作为Item或ProductDescription的属性。注意，该属性看起来只是数字或字符串，例如，itemID:Integer或itemID:String。 但实际上，该属性并不仅仅是字符串或数字（商品项目标识符具有子域），更有效的做法是在领域模型中加入类ItemID（或者ItemIdentifier），并且将这个类作为itemID属性的类型。例如，itemID:ItemIdentifier。<font color="#cc0000">表9-3</font>提供了一些准则，指明何时需要在模型中加入数据类型。 </p>
    <p>&nbsp;&nbsp; <font color="#0000cc">&nbsp;&nbsp;&nbsp;应用UML：在何处描述这些数据类型类&nbsp;&nbsp; </font>&nbsp;&nbsp; 在领域模型里，ItemID类应该表示为单独的类吗？这取决于你想要在图中强调的事物。既然ItemID是数据类型（实例的唯一标识不用于等价性检验），那么可能只会表示在类框的属性分格中，<font color="#cc0000">如图9-24</font>。采用哪种解决方式取决于如何使用作为沟通工具的领域模型以及领域里概念的重要性。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000cc">准则：任何属性都不表示外键&nbsp; </font>&nbsp;&nbsp;&nbsp;&nbsp;领域模型里的属性不应该用于表示概念类的关系。违反这一原则的常见情况是像在关系数据库设计中那样增加一种外键属性，用以关联两个类型。<font color="#cc0000">参见图9-25</font>。可以用许多方法来表示对象之间的关系，外键就是其中一种方法，我们将推迟到设计时在决定如何实现对象关系，以避免设计蠕变(design creep)。 </p>
    <p>&nbsp;<font color="#0000cc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;准则：对数量和单位建模&nbsp; </font>&nbsp; &nbsp;&nbsp; 大部分用数字表示的数量不应该表示为纯数字。应该给这些数量加上单位，并且通常还需要知道单位之间的转换关系。领域模型（和软件）应该具备处理数量的技巧。一般情况下，可以把数量表示为单独的Quantity类，并且关联到Unit类。通常可以对Quantity加以规格说明。<font color="#cc0000">参见图9-26</font>。 </p>
    <p><font color="#0000cc">实例：领域模型中的属性</font>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <font color="#cc0000">参见图9-27、 9-28</font> </p>
    <p>&nbsp;<font color="#0000cc">结论：领域模型是否正确</font>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 没有所谓唯一正确的领域模型。所有模型都是对我们试图要理解的领域的近似。领域模型主要是在特定群体中用于理解和沟通的工具。有效的领域模型捕获了当前需求语境下的本质抽象和理解领域所需要的信息，并且可以帮助人们理解领域的概念、术语和关系。 </p>
    <p><font color="#0000cc">过程：迭代和进化式领域建模 </font>&nbsp; &nbsp;&nbsp;&nbsp; 在迭代开发中，我们会通过若干迭代对领域模型进行增量地演进。在每个迭代中，领域模型都会限定于之前和当前要考虑的场景，而不是膨胀为瀑布风格的&#8220;大爆炸&#8221;模型，以过早试图捕获所有可能的概念类和联系。因此，只创建部分领域模型反映这一情形，而不涉及其他。 &nbsp; <font color="#0000cc">准则：避免瀑布思维倾向，为完成详尽或&#8220;正确&#8221;的领域模型而进行大量建模工作，这些方式都应避免，这种过量的建模工作反而会导致分析停滞，这种投入几乎不会有什么回报。每次迭代的领域模型建模时间不超过几个小时</font><font color="#000000">。 </font></p>
    <p><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#0000cc">&nbsp;UP中的领域模型</font><font color="#000000">&nbsp;&nbsp;</font><font color="#cc0000">&nbsp;如表9-4</font><font color="#000000">的建议所示，UP中的领域模型通常开始和完成于细化阶段。 </font></p>
    <p><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#0000cc">&nbsp;UP业务对象模型与领域模型 </font><font color="#000000">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;UP领域模型是较为少见的UP业务对象模型（BOM）的正式变体。不要与其他对BOM的定义混淆，UP BOM是一种描述整个业务的企业模型。BOM可以用来进行业务过程或再工程，而不依赖于任何软件应用。</font><font color="#990099">引证如下：【UP BOM】作为抽象，描述的是业务人员和业务实体应该怎样关联，以及它们如何协作以完成业务。</font><font color="#000000">&nbsp; &nbsp; BOM使用不同的图（类图、活动图和顺序图）来阐述整个企业是如何运转的（或应该如何运转）。BOM通常有助于进行企业范围的业务过程工程，而在创建单个软件应用时并不常见。因此，UP定义了领域模型，作为BOM的常用制品子集或特化。</font><font color="#990099">引证如下：你可以选择开发&#8220;非完整的&#8221;业务对象模型，重点解释领域中的重要&#8220;事物&#8221;和产品。【...】这些都成为领域模型。</font> </p>
    </li>
</ul><img src ="http://www.blogjava.net/kissyan4916/aggbug/329841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2010-08-25 01:00 <a href="http://www.blogjava.net/kissyan4916/articles/329841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Applying UML and Patterners(Third Edition)学习笔记（八）</title><link>http://www.blogjava.net/kissyan4916/articles/328626.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Thu, 12 Aug 2010 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/328626.html</guid><description><![CDATA[<title>第8章：迭代1-基础</title>
<style type="text/css">
li { list-style: none;  margin: 0; }
p { margin: 0; }
span.l { color: red; font-weight: bold; }
a.mapnode:link {text-decoration: none; color: black; }
a.mapnode:visited {text-decoration: none; color: black; }
a.mapnode:active {text-decoration: none; color: black; }
a.mapnode:hover {text-decoration: none; color: black; background: #eeeee0; }
</style>
<p><a href="Applying%20UML%20and%20Patterners%28Third%20Edition%29.mm.html" target="_blank">~&nbsp;第8章：迭代1-基础 </a>
</p>
<ul>
    <li>
    <p><strong>简介</strong>&nbsp;&nbsp;&nbsp;本章将概括案例研究在迭代1的需求，然后简要讨论初始和细化阶段的过程思想。为理解后续章节对本次迭代的讨论，阅读选择需求很重要。
    </p>
    <p><strong>迭代1的需求和重点：OOA/D技术的核心&nbsp;&nbsp; </strong>&nbsp; &nbsp;
    在这些案例中，细化阶段打得迭代1强调的是基础范围和在构建对象系统中所使用的常见OOA/D技术。当然，构建软件还需要其他许多技术，例如数据库设计、可用性工程、UI设计等，但是本书主要关注OOA/D和UML应用，其他技术不在本书涵盖范围之内。
    </p>
    <p><strong>在迭代开发中，我们并非一次就实现所有需求</strong>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;
    对迭代生命周期方法（例如UP、XP、Scrum等）的关键理解就是：我们对需求子集开始具有产品品质的编程和测试，并且我们在完成所有需求分析之前开始这些开发，这与瀑布过程相反。
    </p>
    <p><strong>在多个迭代里对同一用例进行增量式开发&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>&nbsp;注意，并不是在迭代1里要实现处理销售用例中的所有需求。通常是在若干迭代内对同一用例的各种场景进行开发，并且逐渐地扩展系统直到最终完成所有需要的功能性<font color="#ff0000">（图8-1）</font>另一方面，简短的用例可以在一次迭代中完成。 </p>
    <p><strong>过程：初始和细化&nbsp; </strong>&nbsp;&nbsp;&nbsp; <font color="#3300ff">在初始阶段发生了什么
    </font>&nbsp;&nbsp;案例研究的初始阶段大概只持续了一周。因为这不是项目的需求阶段，所创建的制品应该是简明和不完整的，该阶段用时很短，并且只经过轻量级的调查。
    </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    初始阶段是迈向细化阶段的一小步。在该阶段决定基本的可行性、风险和范围，对项目是否值得进行更深入的调查进行决策。并不是所有适合于初始阶段的活动都要涵盖在其中，这一阶段强调面向需求的制品。初始阶段中可能的活动和制品包括：
    </p>
    <ul>
        <li>简短的需求讨论会
        </li>
        <li>大多数参与者、目标和用例名称。
        </li>
        <li>大多数以摘要形式编写的用例。以详述形式编写10%~20%的用例，以加深对范围和复杂性的理解
        </li>
        <li>确定大多数具有影响和风险的质量需求。
        </li>
        <li>编写设想和补充性规格说明的第一个版本
        </li>
        <li>风险列表
        </li>
        <li>技术上的概念验证原型和其他调查，用以揭示特殊需求的技术可行性
        </li>
        <li>面向用户界面的原型，用于确定对功能需求的设想
        </li>
        <li>对购买/构建/复用构建的建议，在细化阶段进行精化。
        </li>
        <li>对候选的高层架构和构件给出建议。
        </li>
        <li>第一次迭代的计划
        </li>
        <li>候选工具列表 </li>
    </ul>
    <p><font color="#3300ff">细化之所在&nbsp; </font>&nbsp;&nbsp;&nbsp;
    细化阶段是最初的一系列迭代，在这一阶段，小组进行细致的调查、实现（编程和测试）核心架构、澄清大多数需求和应对高风险问题。在UP中，&#8220;风险&#8221;包含业务价值。因此，早期工作可能包括实现那些被认为重要的场景，而不是专门针对技术风险。
    </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;细化阶段通常由两个或多个迭代组成，建议每次迭代的时间为2~6周。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这一阶段，不是要创建可以丢弃的原型。与之相反，该阶段产生的代码和设计是具有产品品质的最终系统的一部分。在一些UP的描述中，会误解"<font color="#cc0033">架构原型</font>"(architectural
    prototype)这一术语用来描述局部系统。该术语不是指可废弃的、实验性的原型，在UP中，它表示最终系统的产品化子集。该术语更常见名称是<font color="#cc0033">可执行架构</font>(executable architecture)或<font color="#cc0033">架构基线</font>(architectural baseline)。&nbsp; <font color="#cc0033">用一句话来概括细化：构建核心架构，解决高风险元素，定义大部分需求，以及预计总体进度和资源</font>。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#3300ff">在细化阶段可能出现的一些关键思想和最佳实践包括</font>： </p>
    <ul>
        <li>实行短时间定量、风险驱动的迭代。
        </li>
        <li>及早开始编程
        </li>
        <li>对架构的核心和风险部分进行适应性的设计、实现和测试。
        </li>
        <li>尽早、频繁、实际地测试。
        </li>
        <li>基于来自测试、用户、开发者的反馈进行调整。
        </li>
        <li>通过一系列讨论会，详细编写大部分用例和其他需求，每个细化迭代举行一次。 </li>
    </ul>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在细化阶段会开始构建哪些制品&nbsp;&nbsp;&nbsp; <strong><font color="#cc0033">表8-1</font></strong>列出的是可能在细化阶段开始构建的制品样例，同时指明这些制品要解决的问题。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#3300ff">&nbsp;&nbsp;何时知道自己并没有理解细化阶段</font> </p>
    <ul>
        <li>对于大部分项目，细化阶段都比&#8220;几个&#8221;月更长。
        </li>
        <li>只有一次迭代（除极少数易于理解的问题外）
        </li>
        <li>在细化开始前就定义了大部分的需求
        </li>
        <li>没有处理具有风险的元素和核心架构。
        </li>
        <li>没有产生可执行架构，没有进行产品代码的编程。
        </li>
        <li>认为细化阶段主要是需求或设计阶段，为构造阶段的实现进行准备。
        </li>
        <li>试图在编程之前进行彻底和细致的设计
        </li>
        <li>只有少量的反馈和调整；用户没有持续地参与评估和反馈。
        </li>
        <li>没有尽早和实际的测试
        </li>
        <li>在编程之前推测性地结束架构设计
        </li>
        <li>认为细化阶段是进行概念验证编程的阶段，而不是对产品化核心架构编程的阶段。 </li>
    </ul>
    <p>如果在项目中出现这些现象，则表明你对细化阶段的理解是错误的，并且已经在UP之上强加了瀑布思想。 </p>
    <p><strong>过程：计划下一个迭代&nbsp;&nbsp;</strong>&nbsp;&nbsp;&nbsp;&nbsp;通过风险、覆盖范围和关键程度组织需求和迭代。 </p>
    <ul>
        <li><font color="#3300ff">风险</font>既包括技术复杂性、也包括其他因素，例如工作量或可用性的不确定性。
        </li>
        <li><font color="#3300ff">覆盖范围</font>意味着在早期迭代中至少要涉及系统的所有主要部分--或许是对大量构建进行&#8220;广泛和肤浅&#8221;的实现。
        </li>
        <li><font color="#3300ff">关键程度</font>是指客户认为具有高业务价值的功能。 </li>
    </ul>
    <p>在迭代1之前完成等级划分，但是在迭代2之前要重新划分，依此类推，因为新需求和新理解会对等级排列产生影响。也就是说，迭代的计划是可适应的，并不是项目开始之时必须固定下来的。
    </p>
    </li>
</ul><img src ="http://www.blogjava.net/kissyan4916/aggbug/328626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2010-08-12 11:25 <a href="http://www.blogjava.net/kissyan4916/articles/328626.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Applying UML and Patterners(Third Edition)学习笔记（七）</title><link>http://www.blogjava.net/kissyan4916/articles/319050.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Wed, 21 Apr 2010 16:17:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/319050.html</guid><description><![CDATA[<p>第7章：其他需求 </p>
<ul style="position: relative; visibility: visible;" id="fold1_4_4">
    <li>
    <p><strong>简介</strong>&nbsp;&nbsp;&nbsp;除用例之外，还有其他一些重要的UP需求制品，本章将介绍这些制品，这些内容与案例研究关系密切，并且提供了更为完整的需求示例。 </p>
    <p>其他需求制品&nbsp;&nbsp;&nbsp;用例不是要求的全部。 </p>
    <p><font color="#0000cc">》补充性规格说明&nbsp;</font>&nbsp; 捕获并确定了其他类型的需求，例如报表、文档、包装、可支持性说明、许可授权等 </p>
    <p><font color="#0000cc">》词汇表&nbsp;</font>捕获术语和定义，它也可起到数据字典的作用 </p>
    <p><font color="#0000cc">》设想&nbsp;</font>概括了对项目的&#8220;设想&#8221;，即执行摘要。该制品为 项目主要思想提供简洁描述 </p>
    <p><font color="#0000cc">》业务规则</font>（或领域规则）捕获了凌驾于特定应用之上的长期规则或政策，例如税法 </p>
    <p><strong>这些示例的详尽程度&nbsp;&nbsp;</strong>&nbsp;&nbsp;本书首要目标是介绍OOA/D基础知识，而不是本章所论述的次要POS需求细节。因此本章只展示部分示例，并不展示完整详尽的需求示例。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;某些小节将作为承上启下的过渡小节，突出重点问题，提供对内容的感性认识，然后就会快速进入下面的内容。 </p>
    <p><strong>准则：初始阶段是否应该对此彻底地进行分析&nbsp;</strong>&nbsp;&nbsp;&nbsp; 非也。UP是一种迭代和进化式方法，这意味着应该早在完整地分析和记录大多数需求之前，尽早进行具有产品品质的编程和测试。来自早期编程和测试的反馈使需求进化。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 研究表明，在开始阶段，高阶粗粒度需求的&#8220;前十&#8221;列表是有帮助的。同样，在早期花费一定时间去理解非功能性需求（例如性能或可靠性）也是有帮助的，因为这对架构选择具有重要影响。 </p>
    <p><strong>可靠性规格说明：是否矛盾？&nbsp;&nbsp;</strong>&nbsp; 接下来所编写的需求示例可能会造成以下错觉：既然理解并良好定义了真实的需求，那么也可以用它来对项目进行可靠的预算和计划。这种错觉对非软件开发者来说尤其强烈，程序员会从其惨痛教训中认识到这种计划和预算是多么不可靠。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;真正重要的是快速构建可以通过用户验收测试的软件，而且能够满足用户真实的目标，但在用户对软件进行评估或使用之前，无法确定这些目标。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编写设想和补充性规格说明是值得重视的，但是这些制品（或者任何需求）也并不是完全可靠的规格说明。只有编写代码、测试、获取反馈、进一步完成与用户和客户的协作并且对软件进行改写，才会真正达到目标。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这并不是要号召无序分析和思考就匆忙地去编码，而是建议轻度地处理需求，尽快开始编程，并且不断引入用户和测试以得到反馈。 </p>
    <p><strong>准则：这些制品是否应该放在项目Web站点上</strong>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;与普通的静态文档 不同，这些制品应该是超链接的，或者使用不用于字处理器或电子表格的其他工具进行记录。例如，其中大多数可以记录在WiKi Web上。 </p>
    <p><strong>NextGen示例：（部分）补充性规格说明</strong>&nbsp; &nbsp;&nbsp;P78 </p>
    <p><strong>注解：补充性规格说明&nbsp;&nbsp;</strong>&nbsp;&nbsp;<font color="#0000cc">补充性规格说明</font>（supplementary specification）捕获了用例和词汇表难以描述的其他需求、信息和约束，其中包括系统范围的"URPS+"（可用性、可靠性、性能、可支持性和其他）等质量属性或需求。 &nbsp; 在思考用例的时候，某用例专有的非功能性需求可以首先简要地写入用例，即用例的&#8220;特殊需求&#8221;小节。但是，在这种非正式描述后，应该将其归入补充性规格说明，以便所有非功能性需求集中在一处，避免重复。 </p>
    <p>补充性规格说明中的元素包括： </p>
    <p>》&#8220;FURPS+&#8221;需求--功能性、可用性、可靠性、性能和可支持性 </p>
    <p>》报表 </p>
    <p>》硬件和软件约束（操作系统和网络系统等） </p>
    <p>》开发约束（例如，过程或开发工具） </p>
    <p>》其他设计和实现约束 </p>
    <p>》国际化问题（货币单位、语言） </p>
    <p>》文档化（用户、安装和管理手册）和帮助 </p>
    <p>》许可和其他法律问题 </p>
    <p>》包装 </p>
    <p>》标准（技术、安全和质量） </p>
    <p>》物理环境问题（例如，热度或振动） </p>
    <p>》操作问题（例如，如何处理错误，或者每隔多久进行备份） </p>
    <p>》特定应用领域规则 </p>
    <p>》所关注领域的信息（例如，信用卡支付处理的整个过程） </p>
    <p><strong>质量属性&nbsp;</strong>&nbsp;&nbsp;有些需求可以称为系统的<font color="#0000cc">质量属性</font>（quality attribute，或qualities attribute），包括可用性、可靠性等等。需要注意的是，这些指的是系统的质量，而非属性本身的质量，属性本身并没有高质量之说。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000cc"><strong>当我们带上&#8220;架构师的帽子&#8221;时，系统范围的质量属性（记录于补充性规则说明中）将特别重要，因为架构分析和设计极为关心在功能性需求语境下质量属性的确定和选择，第33章将对此进行介绍。</strong></font> </p>
    <p><strong>补充性规格说明中有功能性吗？难道不应该在用例中吗？</strong>&nbsp;&nbsp;&nbsp;&nbsp;某些功能或特性并不适合采用用例的形式描述，可以采用特性的方式来描述功能性。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UP当然也允许使用这种面向特性的方法来描述需求，在这种情形下，应在补充性规格说明中描述特性列表。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UP提倡但不是强求对功能性使用用例。用例是一种优秀的方法，可以通过产品使用的典型场景把一组相关特性集中起来思考。但是用例并不是永远适用。 </p>
    <p><strong>应用专用的领域（业务）规则&nbsp;&nbsp;&nbsp;&nbsp;</strong>&nbsp;&nbsp; 一般来说，诸如税法等广泛应用的领域规则属于UP业务规则制品，UP将其作为核心的共享知识库。但是，对于更为局限的特定于应用的规则，例如如何计算某项商品折扣，可以记录在补充性规格说明中。 </p>
    <p><strong>所关注领域的信息&nbsp; </strong>&nbsp; &nbsp; 这对于主题问题专家是具有价值的，他们可以编写（或提供URI）一些与新软件系统有关的领域解释（销售和账务，地下油/水/气流量的地球物理学知识），以便为开发小组提供背景信息和更为深入的理解力 </p>
    <p><strong>NextGen示例：（部分）设想</strong>&nbsp; &nbsp;&nbsp;P82 </p>
    <p><strong>注解：设想&nbsp;</strong>&nbsp;&nbsp;编写执行摘要对项目运行进行简要的描述，使主要成员建立起对项目的共同设想，也是同样有帮助的。&nbsp; 设想不应该占据很长的篇幅，也不应该试图详细描述公司的需求。设想应该概括用例模型和补充性规格说明中的一些信息。 </p>
    <p><strong>涉众的关键高阶目标及问题</strong>&nbsp;&nbsp;&nbsp;该小节总结高阶（通常高于特定用例）目标和问题，并且揭示了重要的非功能和质量目标，这些目标可能属于某个用例或跨越多个用例。 </p>
    <p><strong>准则：有哪些简化的方法？&nbsp;</strong>&nbsp;&nbsp; 特别是在输入定义高阶问题和确定目标的活动过程中，会发生创造性、研究性的小组工作。对于发现根源问题及目标、启发思路和定义优先级，存在一些有助于小组工作的技术： </p>
    <p>》思维导图（mind mapping） </p>
    <p>》产品设想包装制作（product vision box creation） </p>
    <p>》鱼骨图（fishbone diagram） </p>
    <p>》排列图(pareto diagram) </p>
    <p>》集体讨论（brainstorming） </p>
    <p>》多次投票表决（multi-voting） </p>
    <p>》记点投票表决（dot voting） </p>
    <p>》提名小组过程（nominal group process） </p>
    <p>》集体编写（brainwritting） </p>
    <p>》相关性分组（affinity grouping） </p>
    <p>可以在Web上找到这些方法的具体介绍。推荐在同一讨论会上采用其中几种方法，以便从不同角度发现共同的问题和需求。 </p>
    <p><strong>系统特性概要</strong>&nbsp;&nbsp;&nbsp;&nbsp;为掌握主要特性而在设想文档中只列出用例名称是不够的，原因如下： </p>
    <p>1、太详细或层次太低。人们想要的是主要思想的概要 </p>
    <p>2、用例名称可能掩盖了涉众真正关心的主要特性 </p>
    <p>3、有些值得注意的特性跨越了多个用例或者与用例无关 </p>
    <p>因此，使用<strong>特性</strong>作为替代的、补充性的方式来表示系统的功能，在这种语境下，更准确地说法是<strong>系统特性</strong>，即以高阶、简洁的语句对系统功能加以概括。更为正式地，在UP中，<strong>系统特性</strong>是&#8220;由系统提供的外部可观察到的服务，可以直接实现涉众的需求&#8221; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp; <strong>&nbsp;定义：特性是系统能够实行的行为上的功能。特性应该通过如下语言上的测试：系统实行&lt;特性X&gt; </strong></p>
    <p>将功能上的系统特性与各种非功能性需求和约束进行对比，例如&#8220;系统必须运行于Linux&#8221;，显然不能通过上述语言上的测试。例如，系统实现Linux。 </p>
    <p>准则：如何编写功能列表&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通常可以使用两级层次结构来组织系统特性。但是，如果设想文档的层次多于两级，则显得过于详细。设想文档的系统特性应该对功能性进行概括，非不应分解为细粒度元素的冗长列表。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000cc"><strong>&nbsp; 准则：在设想文档中包含的特性最好少于10个，因为更多的特性不能够被快速掌握。如果存在更多的特性，则需考虑对这些特性进行分组和概括</strong>。</font> </p>
    <p><strong>准则：我们是否应该在设想文档中重复其他需求？<font color="#0000cc">&nbsp;&nbsp;准则：对于其他需求，要避免在设想和补充性规格说明（SS）中重复或近于重复。最好只在SS中记录这些需求。在设想文档中，可以指引读者到SS中阅读这些需求</font></strong> </p>
    <p><strong>准则：你应该先编写设想还是用例？ </strong>&nbsp; 不需要严格定义这种先后顺序。在开发者合作创建不同需求制品时，对一个制品的创建工作会影响并有利于澄清另一个制品。尽管如此，还是建议采用如下的顺序： </p>
    <p>1、首先编写简要的设想草案 </p>
    <p>2、确定用户目标和对应的用例名称 </p>
    <p>3、详细编写一些用例，并且开始编写补充性规格说明 </p>
    <p>4、精化设想，对以上制品中的信息进行概括。 </p>
    <p><strong>NextGen示例:（部分）词汇表 </strong>&nbsp; &nbsp;&nbsp;&nbsp;P87 </p>
    <p><strong>注解：词汇表（数据字典）</strong>&nbsp;&nbsp; <strong>词汇表</strong>（glossary）的最简形式是重要术语及其定义的列表。令人惊讶的一种常见情况是，不同涉众可以用略有不同的方式使用同一（通常是技术的或特定于领域的）术语。这一问题必须解决，以减少沟通上的问题和需求的二义性。 &nbsp;准则：及早开始编写词汇表。词汇表将很快成为关于细粒度元素细节信息的有效知识库。 </p>
    <p><strong>词汇表作为数据字典&nbsp;</strong>&nbsp;&nbsp;在UP中，词汇表也充当<font color="#0000cc">数据字典</font>（data dictionary）的角色，即记录关于数据之数据，也就是<strong>元数据</strong>（metadata）的文档。在初始阶段，词汇表应该是术语及其描述的简单文档。在细化阶段，词汇表可以扩展为数据字典。 </p>
    <p>术语的属性包括： </p>
    <p>&nbsp;&nbsp;》别名 </p>
    <p>&nbsp;&nbsp;》描述 </p>
    <p>&nbsp;&nbsp;》格式（类型、长度、单位） </p>
    <p>&nbsp;&nbsp;》与其他元素的关系 </p>
    <p>&nbsp;&nbsp;》值域 </p>
    <p>&nbsp;&nbsp;》验证规则 </p>
    <p>&nbsp;注意，词汇表中的值域和验证规则是反映系统行为的需求的组成部分。 </p>
    <p><strong>准则：我们是否可以在词汇表中记录组合术语&nbsp;&nbsp;</strong>&nbsp; 词汇表不仅用于记录原子术语，例如&#8220;产品价格&#8221;，它也能够并且也应该包括诸如&#8220;销售&#8221;（其中包含其他元素，例如日期和地点）的组合元素和用来描述用例参与者之间所传递的一组数据的简化名称。例如，在处理销售用例中，考虑如下陈述： 系统向外部支付授权服务发送<u>支付授权请求</u>，并请求批准支付。 &nbsp;&nbsp;&nbsp;&nbsp;&#8220;支付授权请求&#8221;是一组数据的别名，也需要在词汇表中加以解释。 </p>
    <p><strong>NextGen示例：业务规则（领域规则）</strong>&nbsp; P88 </p>
    <p><strong>注解：领域规则 </strong>&nbsp; <font color="#0000cc">&nbsp;领域规则</font>指出领域或业务是如何运作的。尽管应用需求通常都会受到领域规则的影响，但是这些规则不是任何一个应用的需求。公司政策、物理法则（例如油在地上如何流动）和政府法律都是常见的领域规则。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;领域规则通常称为<font color="#0000cc">业务规则</font>（business rule），这也是其最常见的类型，但是这一术语并不是恰当的，因为大量软件应用不是面向业务问题的。 &nbsp; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最好在单独的与应用无关的制品中确定和记录领域规则，这在UP中称为业务规则制品，这样便能够使分析在组织和项目范围内进行共享和重用，而不是只限定于特定项目的文档里。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;规则强调了情节的连续性而不是细节，有助于澄清用例中的歧义。例如，在NextGen POS中，如果有人问事否应该在处理销售用例中加入另一路径，即不允许不记录签名的信用卡支付，业务规则给出了答案，其表明任何信用卡授权公司都不允许这种情况。 </p>
    <p><strong>过程：迭代方法中的进化式需求</strong>&nbsp;&nbsp;&nbsp;PPT6概括了制品示例及其在UP中的时限。通常，大多数需求制品始于初始阶段，并且主要在细化阶段开发。 </p>
    <p><strong>初始阶段&nbsp;</strong>&nbsp;&nbsp; 涉众要决定项目是否值得深入调查。实质的调查活动在细化阶段发生，而不是初始阶段发生。在初始阶段，设想以某种形式概括了项目思想，以帮助决策者决定是否值得继续，并且从哪里着手。 </p>
    <p>&nbsp;&nbsp;&nbsp; 因为大多数需求分析发生在细化阶段，所以在初始阶段应该只对补充性规格说明稍作开发，只需要突出重要的质量属性用以揭示主要风险和挑战。这些制品的输入可以在初始阶段的需求讨论会上产生。 </p>
    <p><strong>细化阶段</strong>&nbsp;&nbsp; 通过细化阶段，基于对部分系统增量构建的反馈、调整以及在若干开发迭代中举行的多个需求讨论会，对&#8220;远景&#8221;和设想文档加以精化。通过进一步的需求调查和迭代开发，其他需求将更为清晰并且可以记录在补充性规格说明中。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp; 在细化阶段结束时，完成并提交用例、补充性规格说明和设想是切实可行的，因为在此时，这些文档能够合理地反映稳定的主要特性和其他需求。尽管如此，补充性规格说明和设想不等同于冻结并&#8220;签署&#8221;了的规格说明；改写--并非僵化--是迭代开发和UP的核心价值。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所谓的&#8220;冻结签署&#8221;是在细化阶段结束时，就项目剩余时间里所要完成的事项与涉众达成一致意见，并且就需求和进度给予承诺（可能是以合同形式），这是完全切合实际的。在某一时刻（在UP中是细化阶段的结束时刻），我们需要对&#8220;什么、多少、何时&#8221;有可靠的认识。从这种意义上说，签署关于需求的合约时正常的，也是有必要的。同时还需要具备变更控制过程（UP中明确的最佳实践之一），以便正式地考虑和批准需求变更，避免混乱和不受控的变更。 </p>
    <p>&nbsp;&#8220;冻结签署&#8221;的事实还意味着如下几点： </p>
    <p>&nbsp;》 在迭代开发和UP中，无论在需求规格说明上付出多少努力，还是不可避免地会存在一些变更，这应该可以被接受。这些变更可能是能够为所有者带来竞争优势的、新近发生的对系统投机性的改进，或者是由于加深了认识而引起的改进。 </p>
    <p>》&nbsp; 使涉众来进行评估、提供反馈以及掌握项目的方向以满足其真实意图，这是迭代开发的核心价值。&#8220;洗手不干&#8221;，不关注于参与项目，而是在一组冻结的需求上签字认可后就等待着项目结束，这样对涉众来说并没有好处，因为他们几乎不会得到真正满足其需要的结果。 </p>
    <p>构造阶段&nbsp;&nbsp;&nbsp; 通过构造阶段，主要需求（包括功能性需求和其他需求）应该已经稳定下来，虽然还不是终结，但是已经可以专注于次要的微扰事物了。因此，在此阶段，补充性规格说明和设想都不必进行大量改动。 </p>
    </li>
</ul><img src ="http://www.blogjava.net/kissyan4916/aggbug/319050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2010-04-22 00:17 <a href="http://www.blogjava.net/kissyan4916/articles/319050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Applying UML and Patterners(Third Edition)学习笔记（五）</title><link>http://www.blogjava.net/kissyan4916/articles/319047.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Wed, 21 Apr 2010 16:15:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/319047.html</guid><description><![CDATA[第5章：进化式需求
<ul style="position: relative; visibility: visible;" id="fold1_4_2">
    <li>
    <p><strong>简介&nbsp;&nbsp;&nbsp;&nbsp; </strong>本章简要介绍迭代和进化式需求，并且描述特定的UP需求制品，以此为后续的面向需求的章节做好铺垫。 </p>
    <p><strong>定义：需求&nbsp;&nbsp; </strong>&nbsp;需求(requirement)就是系统（更广义的说法是项目）必须提供的能力和必须遵从的条件。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000cc">&nbsp;UP提出了一系列的最佳实践，其中之一就是需求管理（manage requirement）</font>。需求管理不主张采用瀑布的观点，即在编程之前项目的第一个阶段就试图完全定义和固话需求。在变更不可避免，涉众意愿不明朗的情况下，UP更推崇用&#8220;一种系统的方法来寻找、记录、组织和跟踪系统不断变更的需求&#8221; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;简而言之，就是通过迭代巧妙地进行需求分析、而非草率和随意地为之。 需求分析的最大挑战是寻找、沟通和记住什么是真正需要的，并能够清楚地讲解给客户和开发团队的成员。 </p>
    <p><strong>进化式需求与瀑布式需求</strong>&nbsp;&nbsp;&nbsp;&nbsp; 注意，在UP的需求管理定义中使用了<font color="#0000cc"><strong>&#8220;不断变更&#8221;</strong></font>一词。UP能够包容需求中的变更，并将其作为项目的基本驱动力。这一点极为重要，也是迭代和进化式思想与瀑布思想的核心差异。 </p>
    <p><strong>寻找需求可以采用的方法</strong>&nbsp; &nbsp;&nbsp;&nbsp;除&#8220;不断变更&#8221;之外，另一个重要的词是&#8220;<font color="#0000cc"><strong>寻找</strong></font>&#8221;。也就是说，UP提倡使用一些有效的技巧以获得启示，例如与客户一同编写用例、开发者和客户共同参加需求讨论会、请客户代理参加焦点小组以及向客户演示每次迭代的成果以求得反馈。 &nbsp;&nbsp;UP欢迎任何能够带来价值并提高用户参与度的需求启发方法。 </p>
    <p><strong>需求的类型和种类</strong>&nbsp;&nbsp;&nbsp;&nbsp;在统一过程中，需求按照&#8220;FURPS+&#8221;模型进行分类，这是一种有效的记忆方法，其含义如下： </p>
    <p>&nbsp;&nbsp;&nbsp;<font color="#0000cc">》功能性（Functional）：</font>特性、功能、安全性。 </p>
    <p>&nbsp;&nbsp;&nbsp;<font color="#0000cc">》可用性（Usability）：</font>人性化因素、帮助、文档。 </p>
    <p>&nbsp;<font color="#0000cc">&nbsp;&nbsp;》可靠性（Reliability）：</font>故障频率、可恢复性、可预测性 </p>
    <p>&nbsp;&nbsp;&nbsp;<font color="#0000cc">》性能（Performance）：</font>响应时间、吞吐量、准确性、有效性、资源利用率。 </p>
    <p>&nbsp;&nbsp;&nbsp;<font color="#0000cc">》可支持性（Supportability）：</font>适应性、可维护性、国际化、可配置性 </p>
    <p>&#8220;FURPS+&#8221;中&#8220;+&#8221;是指一些辅助性的和次要的因素，比如： </p>
    <p>&nbsp;<font color="#0000cc">&nbsp;&nbsp;》实现（Implementation）：</font>资源限制、语言和工具、硬件等。 </p>
    <p>&nbsp;&nbsp;&nbsp;<font color="#0000cc">》接口（Interface）：</font>强加于外部系统接口之上的约束 </p>
    <p>&nbsp;<font color="#0000cc">&nbsp;&nbsp;》操作（Operation）：</font>对其操作设置的系统管理 </p>
    <p>&nbsp;&nbsp;<font color="#0000cc">&nbsp;》包装（Packaging）：</font>例如物理的包装盒 </p>
    <p><font color="#0000cc">&nbsp;&nbsp;&nbsp;》授权（Legal）：</font>许可证或其他方式 </p>
    <p>&nbsp;&nbsp;其中某些需求可以统称为<strong>质量属性（quality attribute）</strong>、<strong>质量需求(quality requirement)</strong>或系统的&#8220;某属性&#8221;。这些需求包括：可用性、可靠性、性能和可支持性。在一般使用中，需求按照<strong>功能性</strong>（行为的）和<strong>非功能性</strong>（其他所有的行为）来分类，有些人不喜欢这种宽泛的分类方式，但这种方式已被广泛采用。 </p>
    <p><strong>UP制品如何组织需求&nbsp;&nbsp;&nbsp;&nbsp;</strong>&nbsp;UP提供了一些需求制品。同所有UP制品一样，它们都是可选的。其中关键的制品包括： </p>
    <p><font color="#0000cc">》用例模型：</font>一组使用系统的典型场景。主要用于功能需求 </p>
    <p><font color="#0000cc">》补充性规格说明：</font>基本上是用例之外的所有内容。主要用于所有非功能需求，例如性能或许可发布。该制品也用来记录没有表示为用例的功能特性，例如报表生成 </p>
    <p><font color="#0000cc">》词汇表：</font>词汇表以最简单的形式定义重要的术语。同时也包含了<strong>数据字典（data dictionary）</strong>的概念，其中记录了关于数据的需求，例如有效性规则，容许值等。词汇表可以详述任何元素：对象属性、操作调用的参数、报表布局等。 </p>
    <p><font color="#0000cc">》设想：</font>概括了高阶需求，这些需求在用例模型和补充性规格说明中进行细化。设想也概括了项目的业务案例。设想是简短的执行概要文档，用以快速了解项目的主要思想。 </p>
    <p><font color="#0000cc">》业务规则：</font>业务规则（也称为领域规则）通常描述了凌驾于某一软件项目的需求或政策，这些规则是领域或业务所要求的，并且许多应用应该遵从这些规则。政府的税收法规是一个例子。领域规则的细节可以记录在补充性规格说明中，但是因为这些规则通常更为持久，并且对不止一个软件项目适用，所以应将其放入集中的业务规则制品（供公司的所有分析员共享），以便在这方面做出的分析工作能够被更好的重用。 </p>
    <p>&nbsp;&nbsp; </p>
    <p><strong>制品的正确格式&nbsp;&nbsp; </strong>在UP中，所有制品都是信息的抽象，它们可以存储在Web页，板报，或各种可以想象到的载体之上。</p>
    </li>
</ul><img src ="http://www.blogjava.net/kissyan4916/aggbug/319047.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2010-04-22 00:15 <a href="http://www.blogjava.net/kissyan4916/articles/319047.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Applying UML and Patterners(Third Edition)学习笔记（六）</title><link>http://www.blogjava.net/kissyan4916/articles/319049.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Wed, 21 Apr 2010 16:15:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/319049.html</guid><description><![CDATA[第6章：用例
<ul style="position: relative; visibility: visible;" id="fold1_4_3">
    <li>
    <p><strong>简介&nbsp;&nbsp; </strong>用例是文本形式的情节描述，广泛应用于需求的发现和记录工作中。用例会影响项目的众多方面（包括OOA/D），用例也将作为本书案例研究中许多后继制品的输入。<font color="#0000cc"><strong>图6-1</strong></font>描述了UP制品的影响力，其中特别强调了文本形式的用例。将高阶目标和用例图作为输入，来创建用例文本。反之，用例也能够影响其分析、设计、实现、项目管理和测试制品。 </p>
    <p><strong>示例&nbsp;&nbsp;</strong>&nbsp;&nbsp;图6-1中的用例<font color="#0000cc"><strong>不是图形，而是文本</strong></font>。用例初学者的常见错误就是注重于次要的UML用例图，而非重要的用例文本。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用例通常比上述例子更为详细或结构化更强，但其本质仍然是通过编写使用系统实现用户目标的情节来来发现和记录功能性需求，也就是使用的案例。用例不是什么复杂的概念，尽管发现需求，并适当地编写通常有一定的困难。 </p>
    <p><strong>定义：参与者、场景和用例&nbsp;&nbsp;</strong>&nbsp;&nbsp;<font color="#0000cc">参与者（actor）</font>是某些具有行为的事物，可以是人（由角色标识）、计算机系统或组织。 </p>
    <p><font color="#0000cc">场景（scenario）</font>是参与者和系统之间的一系列特定的活动和交互，也称为<font color="#0000cc">用例实例（use case instance）</font>。场景是使用系统的一个特定的情节或用例的一条执行路径。 </p>
    <p>&nbsp;&nbsp;&nbsp;通俗地讲，<font color="#0000cc">用例(use case)</font>就是一组相关的成功和失败场景集合，用来描述参与者如何使用系统来实现其目标。 </p>
    <p><strong>用例和用例模型 </strong>&nbsp;&nbsp;&nbsp; UP在需求科目中定义了用例模型（Use-Case Model）。首先，这是所有书面用例的集合；同时，它是系统功能性和环境的模型。&nbsp; 用例是文本文档，而非图形；用例建模主要是编写文本的活动，而非制图。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用例模型在UP中不是唯一的需求制品。其他制品还有补充性规格说明、词汇表、设想和业务规则。这些制品都有助于需求分析，但并不是最主要的。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用例模型还可以包含UML用例图，以显示用例和参与者的名称及其关系。UML用例图可以为系统及其环境提供良好的<font color="#000099"><strong>语境图（context diagram）</strong></font>，也为按名称列出用例提供了快捷方式。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用例不是面向对象的，编写用例时也不会进行OO分析。但这并不妨碍其有效性，用例可以被广泛应用。也就是说，用例是经典OOA/D的关键需求输入。 </p>
    <p><strong>动机：为什么使用用例</strong>&nbsp;&nbsp;&nbsp; 虽然这种方法看起来像随意的注释，但是极为重要。研究人员设计了他们自己能够理解的复杂分析方法，但是会使一般的业务人员迷惑不解。而在软件项目中，缺少用户参与是项目的主要原因之一，所以任何有利于用户参与的方法是绝对值得的。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用例的另一个价值是强调了用户的目标和观点。 我们会提出这样的问题：&#8220;谁使用系统？他们使用的典型场景是什么？他们的目的是什么？&#8221;与查询系统特性清单相比，以上问题更强调以客户为中心。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 富有创造力的人经常会将简单的思想变得晦涩并且过于复杂。我们经常会发现，用例建模新手过于关心那些次要的问题，比如用例图、用例关系、用例包等，而不是致力于简单地编写文本情节的实际工作中。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用例的优越性就在于，能够根据需要对复杂程度和形式化程度进行增减调节。 </p>
    <p><strong>定义：用例是功能性需求吗&nbsp;</strong>&nbsp;&nbsp; 用例就是需求，主要是说明系统如何工作的功能性或行为性需求。按照&#8220;FURPS+&#8221;需求类型，用例强调了&#8220;F&#8221;（功能性或行为性），但也可以用于其它类型，特别是与用例紧密相关的那些类型。在统一过程和其他现代方法中，用例被推荐作为发现和定义需求的核心机制。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;记住，用例是真正的需求（尽管不是所有的需求）。&nbsp;&nbsp; 用例的主要思想（通常）是：为功能性需求编写用例，从而降低详细的老式特性列表的重要性或减少这种列表的使用。 </p>
    <p><strong>定义：参与者的三种类型</strong>&nbsp;&nbsp;<font color="#0000cc">参与者（actor）</font>是任何具有行为的事物，在所讨论系统（System under Discussion ,SuD）调用其他系统的服务时，还包括其自身。主要参与者和协助参与者会出现在用例文本的活动步骤中。参与者不仅是人所扮演的角色，也可以是组织、软件和计算机。相对于SuD，有三种外部参与者： </p>
    <p><font color="#0000cc"><strong>》主要参与者（primary actor）：</strong></font>具有用户目标，并通过使用SuD的服务完成。例如，收银员 </p>
    <ul>
        <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为何确定主要参与者？发现驱动用例的用户目标 </li>
    </ul>
    <p><font color="#0000cc"><strong>》协助参与者（supporting actor）：</strong></font>为SuD提供服务（例如，信息服务）。自动付费授权服务即是一例。协助参与者通常是计算机系统，但也可以是组织或人。 </p>
    <ul>
        <li>为何确定协助参与者？为了明确外部接口和协议 </li>
    </ul>
    <p><font color="#0000cc"><strong>》幕后参与者（offstage actor）：</strong></font>在用例行为中具有影响或利益，但不是主要或协助参与者。例如，政府税收机构。 </p>
    <ul>
        <li>为何要确定幕后参与者？这是为了确保确定并满足所有必要的重要事物。如果不明确地对幕后参与者进行命名，则有时很容易忽略其影响或利益。 </li>
    </ul>
    <p><strong>表示法： 用例的三种常用形式&nbsp;</strong>&nbsp;&nbsp;&nbsp;用例能够以不同形式化程度或格式进行编写： </p>
    <p><font color="#0000cc">》<strong>摘要--</strong></font>简洁的一段式摘要，通常用于主成功场景，前例中的处理销售就是摘要形式的用例。 </p>
    <ul>
        <li>何时使用？ 在早期需求分析过程中，为快速了解主题和范围。可能只需要几分钟进行编写。 </li>
    </ul>
    <p><font color="#0000cc">》<strong>非正式-</strong></font><strong><font color="#000099">-</font></strong>非正式的段落格式。用几个段落覆盖不同场景。前例中处理退货就是非正式形式的用例。 </p>
    <ul>
        <li>何时使用？同上 </li>
    </ul>
    <p><font color="#0000cc">》<strong>详述--</strong></font>详细编写所有步骤及各种变化，同时具有补充部分，如前置条件和成功保证。 </p>
    <ul>
        <li>何时使用？确定并以摘要形式编写了大量用例后，在第一次需求讨论会中，详细地编写其中少量（例如10%）的具有重要架构意义和高价值的用例。 </li>
    </ul>
    <p><strong>示例：详述风格的处理销售&nbsp;</strong>&nbsp;&nbsp;&nbsp;<font color="#0000cc">详述用例（fully dressed use case）</font>是结构化的，它展示了更多细节，并且更为深入。（P50~P55） 在迭代和进化式UP需求分析中，第一次需求讨论会应该以这种形式编写10%的关键用例。随后，对这10%中最具有重要架构意义的用例或场景进行设计和编程。 </p>
    <p>&nbsp;&nbsp;&nbsp; 对于详细的用例有各种格式的模板。自20世纪90年代早期以来，使用最为广泛的格式是alistair.cockburn.us上提供的模板，该模板由Alistair Cockburn创建，他是用例建模方法和畅销书的作者，PPT3阐述了这种风格。 </p>
    <p><strong>各小节的含义 </strong></p>
    <p><font color="#000000">绪言元素 </font></p>
    <p><font color="#0000cc"><strong>》范围</strong>&nbsp; </font>&nbsp;范围界定了所要设计的系统。通常，用例描述的是对一个软件系统（或硬件加软件）的使用，这种情况下称之为<font color="#000000"><strong>系统用例（system use case）&nbsp;</strong></font>。在更广义的范围上，用例也能够描述顾客和有关人员如何使用业务。这种企业级的过程描述被称为<strong>业务用例（business use case）</strong>，这也是广泛使用用例的极好示例，但这并不是本书所要介绍的内容。 </p>
    <p><font color="#0000cc"><strong>》级别 </strong></font>&nbsp;&nbsp;在Cockburn的系统中，用例主要分为用户目标级别或子功能级别。 <strong>&nbsp; 用户目标级别</strong>（user-goal level）是通常所使用的级别，描述了实现主要参与者目标的场景，该级别大致相当于业务流程工程中的<strong>基本业务流程</strong>（Elementary Business Process，EBP）。<strong>子功能级别</strong>（subfunction-level）用例描述支持用户目标所需的子步骤，当若干常规用例共享重复的子步骤时，则将其分离出来，创建为子功能级别用例（以避免重复公共的文本）;信用卡支付就是子功能用例的例子，该用例可以被许多常规用例所共享。 </p>
    <p><font color="#0000cc"><strong>》主要参与者 </strong></font>&nbsp; 调用系统服务来完成目标的主要参与者 </p>
    <p><font color="#0000cc"><strong>》涉众及其关注点列表--重要！&nbsp;</strong></font>&nbsp;&nbsp;该列表比看上去要重要和实用的多。它建议并界定了系统必须要做的工作。见以下引用： &#8220;[系统]实现了涉众之间的契约，同时用例详细描述了该契约的行为部分.......用例作为行为的契约，专门和完整地捕获与满足涉众关注点相关的行为&#8221; &nbsp;&nbsp;&nbsp;这就回答了以下问题：用例应该包含什么？ 答案是：用例应该包含满足所有涉众关注点的事物 </p>
    <p><font color="#0000cc"><strong>》前置条件和成功保证（后置条件）&nbsp;</strong></font><strong>前置条件</strong>（precondition）给出在用例中场景开始之前必须永远为真的条件。要注意的是，有些条件也必须为真，但是不值得编写出来。前置条件传达的是编写者认为应该引起读者警惕的那些值得注意的假设。<strong>成功保证</strong>（或后置条件）给出用例成功结束后为真的事物，包括主成功场景及其替代路径。该保证应该满足 所有涉众的需求。 </p>
    <p><font color="#0000cc"><strong>》主成功场景和步骤（或基本流程）</strong></font>&nbsp; 也被称为&#8220;理想路径&#8221;场景，或更朴实的&#8220;基本流程&#8221;及&#8220;典型流程&#8221;。它描述了满足涉众关注点的典型成功路径。要注意的是，它通常不包括任何条件或分支。虽然包含条件或分支并不是错误，但是，保持一定的连贯性，并且将所有条件处理都推延至扩展部分，这种具有争议的做法更易于理解和扩展。 </p>
    <p>&nbsp;&nbsp;&nbsp;场景记录以下三种步骤： </p>
    <p>1、参与者之间的交互 </p>
    <p>2、确认过程（通常由系统来完成） </p>
    <p>3、系统完成的状态变更 </p>
    <p><font color="#0000cc"><strong>》扩展（或替代流程）</strong></font>&nbsp;&nbsp;扩展是重要的，并且通常占据了文本的大部分篇幅。扩展部分描述了其他所有场景或分支，包括成功和失败路径。 在整个用例编写当中，理想路径与扩展场景相结合应该满足&#8220;几乎&#8221;所有涉众所关注的问题。 </p>
    <p>&nbsp;&nbsp;&nbsp;扩展场景是主成功场景的分支，因此能够以对应的步骤1...N对其进行标识。 </p>
    <p>&nbsp;&nbsp;在扩展处理结束时，默认情况下，扩展场景将重新并入主成功场景，除非扩展指出了其他方式（例如，系统中断） 。&nbsp;&nbsp; 有时候，某个扩展点将非常复杂，例如&#8220;信用卡支付&#8221;扩展。在这种情况下可以使用单独的用例来表达该扩展。 </p>
    <p>&nbsp;&nbsp;&nbsp;如果想要描述在任何步骤（至少大多数步骤）都可能发生的扩展条件，那么可以使用&#8220;*a&#8221;、&#8220;*b&#8221;这样的标记。 </p>
    <p>&nbsp;&nbsp; 有时，用例会产生分支以执行其他用例场景。在Cockburn表示法中，使用下划线表示所执行的第二个用例。假设通常使用超链接工具编写用例，那么点击具有下划线的用例名称将会显示对应的文本。 </p>
    <p><font color="#0000cc"><strong>》特殊需求&nbsp;&nbsp; </strong></font>如果有用例相关的非功能性需求、质量属性或约束，那么应该将其写入用例。其中包含需要考虑的和必须包含的质量属性（如性能、可靠性和可用性）和设计约束（通常对于I/O设备） </p>
    <p><font color="#0000cc"><strong>》技术和数据变元表</strong></font>&nbsp; &nbsp; 需求分析中通常会发现一些技术变元，这些变元是关于必须如何实现系统的，而非实现系统哪些功能，这种变元需要记录在用例中。常见的例子是，涉众制定了关于输入或输出技术的约束。 </p>
    <p><font color="#0000cc"><strong>表示法：有其他格式吗？</strong></font>两栏变体 &nbsp;&nbsp;&nbsp;有时提倡使用两栏或对话的格式，这种格式强调参与者和系统之间的交互。P60 </p>
    <p><font color="#0000cc"><strong>准则：以无用户界面约束的本质风格编写用例 </strong></font>&nbsp; &nbsp;以本质风格编写用例；摒除用户界面并且关注参与者的意图。 这种对根源目标的发现过程能够拓展视野，以促成新的和改进的解决方案。 </p>
    <p><font color="#0000cc"><strong>准则：编写简洁的用例 </strong></font>&nbsp; &nbsp;删除&#8220;噪音&#8221;词汇，因为即使一些细微之处也会累积为繁琐，例如编写时应用&#8220;系统认证......&#8221;，而不是&#8220;这个系统认证......&#8221; </p>
    <p><strong>准则：编写黑盒用例&nbsp;&nbsp;&nbsp;</strong>&nbsp;&nbsp;&nbsp;<font color="#0000cc">黑盒用例（black-box use case）</font>是最常用和推荐使用的类型；它不对系统内部工作、构件或设计进行描述。反之，它以通过职责来描述系统，这是面向对象思想中普遍统一的隐喻主题--软件元素具有职责，并且与其他具有职责的元素进行协作。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过使用黑盒用例定义系统职责，人们可以规定系统必须做什么（行为和功能需求），而不必决定系统如何去做（设计）。实际上，&#8220;分析&#8221;与&#8220;设计&#8221;的区别就在于&#8220;什么&#8221;和&#8220;如何&#8221;的差异。这是在优秀软件开发中的重要主题：在需求分析中应该避免进行&#8220;如何&#8221;的决策，而是规定系统的外部行为，就像黑盒一样。此后，在设计过程中创建满足该规格说明的解决方案。 </p>
    <p><strong>准则：采用参与者和参与者目标的视点&nbsp;&nbsp;&nbsp;</strong>&nbsp;&nbsp;&nbsp;以下是RUP的用例定义，源于用例创立者Ivar Jacobson：【一组用例实例，每个实例是系统所执行的一系列活动，以此产生对特定参与者具有价值的可观察结果】&nbsp;&nbsp; 短语&#8220;对特定参与者具有价值的可观察结果&#8221;是细微而又重要的概念，Jacobson认为这是关键，因为它强调了需求分析的两个态度： </p>
    <p>&nbsp;&nbsp;&nbsp;》关注系统的用户或参与者来编写需求，询问其目标和典型情况 </p>
    <p>&nbsp;&nbsp;&nbsp;》关注理解参与者所考虑的有价值的结果&nbsp;&nbsp; </p>
    <p><strong>准则：如何发现用例&nbsp;&nbsp;&nbsp;&nbsp;</strong>&nbsp;&nbsp;为满足主要参与者的目标而定义用例。因此，基本的过程如下： </p>
    <p><font color="#0000cc">1》选择系统边界</font>&nbsp;&nbsp;&nbsp;系统仅仅是软件应用，还是将硬件和应用作为整体？是一个人使用，还是整个组织在使用？ </p>
    <p><font color="#0000cc">2》确定主要参与者</font>--通过使用系统的服务实现其目标的那些人或事物 </p>
    <p><font color="#0000cc">3》确定每个主要参与者目标</font> </p>
    <p><font color="#0000cc">4》定义满足用户目标的用例</font>，根据其目标对用例命名。通常，用户目标级的用例和用户目标是一一对应的，但这里至少有一个例外，后面将对此进行讨论。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;详细步骤1-4见P63~P65 </p>
    <p><strong>准则：什么样的测试有助于发现有用的用例&nbsp;</strong>&nbsp;&nbsp;&nbsp;&nbsp; 一般来说不要提出&#8220;什么是有效用例&#8221;这样的问题，更为实际的问题是&#8220;对应用需求分析来说，表示用例的有效级别是什么？&#8221;下面给出一些经验方法： </p>
    <p>&nbsp;&nbsp; <font color="#0000cc">老板测试&nbsp;&nbsp;&nbsp;&nbsp;EBP测试&nbsp;&nbsp;&nbsp;&nbsp;规模测试 </font></p>
    <p><font color="#0000cc"><strong>EBP测试</strong></font>&nbsp;&nbsp;&nbsp;&nbsp;EBP即基本业务过程（Elementary Business Process），是源于业务过程领域的术语，定义如下：【一个人于某一时刻在一个地点所执行的任务，用以响应业务事件。该任务能够增加可量化的业务价值，并且以持久状态留下数据，例如，批准信用卡的信用额或者确定订购的价格】ERP测试与老板测试类似，尤其是对业务价值可量化这一限制而言。用例是在会话过程中完成的任务。用例可能只需几分钟或一个小时就能完成。正如UP的定义，用例增强可观察或可量化的业务价值，由此形成了这样的解释：系统和数据具有稳定和持久状态。 </p>
    <p><font color="#0000cc"><strong>规模测试</strong></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用例很少由单独的活动或步骤组成，相反，用例通常包含多个步骤，在详述形式的用例通常需要3~10页文本。用例建模中的一个常见错误就是仅将一系列相关步骤中的一个步骤定义为用例。 </p>
    <p><strong>测试的合理违例&nbsp;</strong>&nbsp; 尽管应用中主要用例的定义和分析可以满足上述测试，但是常常会出现例外。有时，需要为子任务或常规EBP级别用例中的步骤编写单独的子功能级别用例。例如，诸如&#8220;信用卡支付&#8221;等子任务或扩展可能在多个基本用例中出现。如果有这种现象，即使不能真正满足EBP和规模测试，也需要考虑将其分离为单独的用例，并且将其连接到各个基本用例上，以避免文字上的重复。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;认证用户这一用例可能无法通过老板测试，但是其步骤极为复杂，需要引起重视进行细致的分析，例如需要考虑&#8220;单点登录&#8221;特性。 </p>
    <p><strong>应用UML：用例图&nbsp;</strong>&nbsp;&nbsp;&nbsp;UML提供了用例图表示法，用以描述用例名称和参与者及其之间的关系（图6-3）。 【用例图和用例关系在编写用例工作中是次要的。用例是文本文档。编写用例意味着编写文本】Flower和Cockburn等世界级的用例专家都对用例图和用例关系不予重视，而是注重编写文本。借鉴大师经验的同时，简单的用例图还是能够为系统提供简洁可视的语境图，能够阐述外部参与者及其对系统的使用。【准则：绘制简单的用例图，并与参与者-目标列表关联。】 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;用例图是一种优秀的系统<font color="#0000cc">语境图</font>(context diagram)；也就是说，用例图能够展示系统边界、位于边界之外的事物以及系统如何被使用。用例图可以作为沟通工具，用以概括系统及其参与者的行为。 </p>
    <p><strong>准则：制图</strong>&nbsp; 图6-4为制图提供了建议。为了明确起见，某些人建议使用其他表示法莱突出外部计算机系统参与者，图6-5所示。 </p>
    <p><strong>准则：不要倚重于制图，保持其简短</strong>&nbsp; &nbsp;&nbsp;&nbsp;再次重申，用例工作之重在于编写文本，而非图形或用例关系。 </p>
    <p><strong>应用UML：活动图</strong>&nbsp;&nbsp;&nbsp; UML包含一种有助于工作流和业务过程可视化的图：活动图。因为用例涵盖过程和工作流分析，所以活动图能够成为编写用例文本的有用的辅助措施，对于那些描述复杂工作流的业务用例来说更是如此，因为其中涉及大量参与者和并发活动。 </p>
    <p><strong>动机：用例还有其他益处么？语境中的需求&nbsp;&nbsp;</strong>&nbsp;&nbsp;&nbsp; 用例的动机在于关注谁是关键参与者，其目标和一般的任务是什么。除此之外，就其本质而言，用例是一种简单的、被广泛理解的形式（情节或场景形式）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;正如Uses Case:Requirements in Context的书名所暗示的那样，在使用系统的典型场所的语境下，用例组织了一组需求。这是件好事，以面向用户的场景（例如用例）作为公共线索，考虑并组织需求，可以增强对需求的理解，并且能够提高需求分组的内聚性。 &nbsp;&nbsp;&nbsp; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;无论用例多么重要，但它并不是唯一必要的需求制品。最好将非功能性需求、报表布局、领域规则和其他不知所置的元素写入UP的补充性规格说明中去。 </p>
    <p><strong>示例： Monopoly游戏&nbsp; </strong>&nbsp;&nbsp;见P70 </p>
    <p><strong>过程：在迭代方法中如何使用用例&nbsp;&nbsp;</strong>&nbsp;&nbsp;&nbsp;用例是UP和其他众多迭代方法的核心。UP提倡用例驱动开发（use-case driven development）这意味着： </p>
    <p>&nbsp;&nbsp;&nbsp;》功能需求首先记录在用例（用例模型）中；无论如何使用，其他需求技术（例如功能列表）都是上次要的 </p>
    <p>&nbsp;&nbsp;&nbsp;》用例是迭代计划的重要部分。迭代的工作是通过选择一些用例场景或整个用例来（部分地）定义的。同时，用例是预算的关键输入。 </p>
    <p>&nbsp;&nbsp;&nbsp;》<strong>用例实现</strong>（use-case realization）驱动设计。也就是说，小组设计协作对象和子系统是为了执行或实现用例。 </p>
    <p>&nbsp;&nbsp;&nbsp;》用例通常会影响用户手册的组织 </p>
    <p>&nbsp;&nbsp;&nbsp;》功能或系统测试应当符合用例的场景 </p>
    <p>&nbsp;&nbsp;&nbsp;》为重要用例的最常用场景创建UI "向导" 或快捷方式可以方便执行常用任务 </p>
    <p><strong>在迭代中如何演化用例和其他规格说明</strong>&nbsp;&nbsp; 本节重申了进化式迭代开发的关键思想：规格说明的工作任务在各迭代中的时间量和级别。PPT4展示了一个样例（而非真正的解决方案），表明了如何开发需求的UP策略。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;在UP中，提倡在需求讨论会上编写用例。<font color="#0000cc">图6-7</font>对完成此项工作提出了时间和地点方面的建议。 </p>
    <p><strong>何时创建各种UP制品（含用例）</strong>&nbsp; &nbsp;<font color="#0000cc">&nbsp;&nbsp;PPT5</font>描述了一些UP制品，及其开始和净化的时间表示例。 </p>
    <p>【在初始阶段如何编写用例？细化阶段如何编写用例？构造阶段如何编写用例？ 研究PPT3，参考P74】 </p>
    </li>
</ul><img src ="http://www.blogjava.net/kissyan4916/aggbug/319049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2010-04-22 00:15 <a href="http://www.blogjava.net/kissyan4916/articles/319049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Applying UML and Patterners(Third Edition)学习笔记（四）</title><link>http://www.blogjava.net/kissyan4916/articles/319046.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Wed, 21 Apr 2010 16:14:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/319046.html</guid><description><![CDATA[<p>第4章：初始不是需求阶段 </p>
<ul style="position: relative; visibility: visible;" id="fold1_4_1">
    <li>
    <p><strong>什么是初始阶段&nbsp;</strong>&nbsp;&nbsp;大多数项目需要一个简短的起始步骤，在该步骤中要考虑以下几类问题： </p>
    <p>1、项目的设想和业务案例是什么？ </p>
    <p>2、是否可行？ </p>
    <p>3、购买还是开发？ </p>
    <p>4、粗略估计一下成本：是一万还是十万美元，还是上百万美元？ </p>
    <p>5、项目应该继续下去还是停止？ </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;想要定义设想并大致得出所需的预算，就必须研究需求。但是，<strong>初始阶段的目标并不是定义所有需求</strong>，或产生可信的预算或项目计划。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于是否存在过于简化的风险，其理念是，就未来新系统的总体目标和可行性而言，只进行足以形成合理判断的调查，并能够确定是否值得继续深入研究即可，而深入研究室细化阶段的工作。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>&nbsp;&nbsp;大多数需求分析是细化阶段进行的，并且伴以具有产品品质的早期编程和测试。 </strong></p>
    <p><strong>&nbsp;&nbsp;&nbsp;&nbsp; </strong>因此，大多数项目的初始阶段的持续时间相对较短，例如耗时一周或几周。实际上，在许多 项目中，如果初始阶段的时间超过一周，那么&#8220;初始&#8221;就失去了它的意义，因为初始阶段只需确定这个项目是否值得认真研究，而不是真正去深入进行研究（这项工作应留待细化阶段进行）。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000cc">&nbsp;<strong>&nbsp;用一句话来概括初始阶段：</strong></font> </p>
    <p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong>预见项目的范围、设想和业务案例 </p>
    <p>&nbsp;&nbsp; <strong><font color="#0000cc">&nbsp;&nbsp;&nbsp;用一句话来概括初始阶段要解决的问题： </font></strong></p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;涉众是否就项目设想基本达成一致，项目是否值得继续进行认真研究 </p>
    <p>&nbsp; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;在迭代开发和UP中，初始阶段的预算和计划是不可靠的。它只不过提供了对工作量的粗略估计，帮助人们决定是否将项目继续下去。 </p>
    <p><strong>初始阶段的持续时间</strong>&nbsp; &nbsp;&nbsp; 初始阶段主要是为项目目标建立一些初始的共同构想，确定项目是否可行，并决定是否值得进入细化阶段加以认真研究。如果预先就决定项目必须进行，并且项目显然是可行的，那么初始阶段会<strong>更加</strong>短暂。这时候，初始阶段可能只包含第一次需求研讨会，并为第一次迭代制定计划，然后就快速地进入细化阶段。 </p>
    <p><strong>初始阶段会创建的制品&nbsp; </strong>&nbsp; PPT2列举了一般在初始阶段（或细化阶段早期）会创建的制品以及各个制品所解决的问题。后续几章将详细解释其中部分制品，特别是&#8220;用例模型&#8221;。&nbsp; <strong>迭代开发的一个重要观点是：</strong>在初始阶段只完成其中部分制品，在后继迭代中对其进行精化。而且，除非认定某制品很可能具有实用价值，否则不应该创建该制品。因为是在初始阶段，所以相关的研究和制品内容都不多。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp; 在初始阶段可能要进行一些编程工作，其目的是创建&#8220;概念验证&#8221;原型，（典型的）通过面向UI的原型来澄清一些需求，以及为关键的&#8220;显示阻塞&#8221;技术问题做一些编程实验。 </p>
    <p>&nbsp;</p>
    <p><strong>是否意味着大量的文档 </strong>&nbsp;&nbsp;记住，这些制品都是可选的。要有选择地创建对项目确有价值的制品。因为这是迭代开发，所以重要的不是在初始阶段创建完整的规格说明，而是形成初始、概略的文档。这些文档在细化迭代中精化，以便响应由早期编程和测试得到的极有价值的反馈。 &nbsp; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同样，创建制品或模型的重点不在于文档或图本身，而是其中蕴含的思想、分析和前期准备。这也正是敏捷建模的观点：建模的最大价值是增强理解，而非记录可靠的规格说明。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 还要注意的是，可以在以后的项目中部分重用以往项目中的制品。一般在不同项目中，风险、项目管理、测试和环境这些制品都可能存在大量相似之处。所有UP项目都应该用相同的名称，以相同方式来组织制品（例如风险列表、开发案例等）。这样就可以方便地从以往项目中找出能够在新项目中重用的制品。 </p>
    <p><strong>何时知道自己并不了解初始阶段</strong> </p>
    <p>1、当认为大部分项目的初始阶段会持续几周或更长时 </p>
    <p>2、在初始阶段试图定义大部分的需求时 </p>
    <p>3、期望初始阶段的预算和计划是可靠的 </p>
    <p>4、定义架构（应该在细化阶段以迭代方式来定义架构） </p>
    <p>5、认为正确的工作顺序应该是：1&gt;定义需求&nbsp;&nbsp;2&gt; 设计架构 3&gt;实现 </p>
    <p>6、没有业务案例或设想制品 </p>
    <p>7、详细编写所有用例 </p>
    <p>8、没有详细编写任何用例，与之相反，应该编写10%~20%的用例以便获得对问题范围的真实认知 </p>
    <p>&nbsp;<strong>初始阶段中有多少UML</strong>初始阶段的目的是收集足够的信息来建立共同设想，决定项目是否继续进行，以及项目是否值得进入细化阶段来认真研究。&nbsp;&nbsp; 初始阶段更关注对基本范围的理解以及10%的需求，这主要是以文字方式表达的。实际上，本书就是如此，大多数UML图将出现在下一个阶段--细化阶段 </p>
    </li>
</ul><img src ="http://www.blogjava.net/kissyan4916/aggbug/319046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2010-04-22 00:14 <a href="http://www.blogjava.net/kissyan4916/articles/319046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Applying UML and Patterners(Third Edition)学习笔记（三）</title><link>http://www.blogjava.net/kissyan4916/articles/319045.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Wed, 21 Apr 2010 16:12:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/319045.html</guid><description><![CDATA[第3章：案例研究
<ul style="position: relative; visibility: visible;" id="fold1_3">
    <li>
    <p><strong>案例研究中涵盖的内容</strong>&nbsp;&nbsp;通常，应用包括UI元素、核心应用逻辑、数据库访问以及与外部软硬构件的协作。尽管OO技术可以用于所有层，但是这里对OOA/D的介绍首要集中于核心应用逻辑层，同时会对其它层进行一些讨论。 </p>
    <p>&nbsp;</p>
    <p>对其他层（如UI层）设计的探讨只限于其与应用逻辑层的接口设计上。<strong><font color="#0000cc">为什么要重点探讨核心应用逻辑层的OOA/D</font></strong>？ </p>
    <p>&nbsp;&nbsp;&nbsp;1、其它层通常对技术/平台有极大的依赖性。例如，如果探讨基于Java的Web UI或胖客户UI层的OO设计，我们还需要了解Struts或Swing等框架的细节。但是对于.NET或Python，其选择和细节具有巨大差异。 </p>
    <p>&nbsp;&nbsp;&nbsp;2、相比之下，核心逻辑层的OO设计对各种技术来说是相似的 </p>
    <p>&nbsp;&nbsp;&nbsp;3、在应用逻辑层语境中学习到基本OO设计技巧适用于所有其他层或构件。 </p>
    <p>&nbsp;&nbsp;&nbsp;4、当新框架或技术出现时，其它层的设计方法和模式呈现出快速变化的趋势。 </p>
    <p><strong>案例研究策略：迭代开发+迭代学习&nbsp; </strong>&nbsp; &nbsp;本书的组织展现了迭代开发的策略。案例研究在多次迭代中应用OOA/D。第一次迭代用于一些核心功能，后续迭代扩展这些功能（图3-2） </p>
    <p>&nbsp;</p>
    <p>为了与迭代开发协同起来，本书以迭代和循环渐进的方式介绍分析和设计主题、UML表示法和模式。在第一次迭代里，介绍一组核心的分析设计主题和表示法。第二次迭代展开介绍信理念、UML表示法和模式。第三个迭代亦是如此。 </p>
    <p><strong>案例一：NextGen POS系统</strong> </p>
    <p><strong>案例二：Monopoly游戏系统</strong> </p>
    </li>
</ul>
<p><span style="position: absolute; visibility: hidden;" id="show1_4" class="foldclosed" onclick="show_folder('1_4')">+</span> </p><img src ="http://www.blogjava.net/kissyan4916/aggbug/319045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2010-04-22 00:12 <a href="http://www.blogjava.net/kissyan4916/articles/319045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Applying UML and Patterners(Third Edition)学习笔记（二）</title><link>http://www.blogjava.net/kissyan4916/articles/319044.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Wed, 21 Apr 2010 16:11:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/319044.html</guid><description><![CDATA[<li>第2章：迭代、进化和敏捷
<ul>
    <li>
    <p><strong>简介</strong>&nbsp;迭代开发是OOA/D成为最佳实践的核心，也是本书所介绍的OOA/D的核心。 敏捷实践（如敏捷建模）是有效地应用UML的关键。UP是相对流行的、示范性的迭代方法。本章将对这些主题进行介绍。 </p>
    <p>相对于顺序或<font color="#0000ff">&#8220;瀑布&#8221;（waterfall）</font>生命周期，<font color="#0000ff">迭代和进化式开发（interative and evolutionary development）</font>对部分系统及早地引入了编程和测试，并重复这一循环。这种方式通常会在还没有详细定义所有需求的情况下假设开发开始，同时使用反馈来明确和改进演化中的规格说明。 </p>
    <p>在迭代开发中，我们依赖于短时快速的开发步骤、反馈和改写来不断明确需求和设计。相比之下，瀑布模型提倡在编程之前就预先完成需求和设计步骤<font color="#0000ff">。一直以来，成功/失败的研究表明，瀑布模型和软件项目高失败率具有极大关系，对它的推广源于信念和风闻，而不是具有统计意义的证据。研究证实，迭代方法与较高的成功率、生产率和低缺陷率具有关系。</font> </p>
    <p><strong>什么事UP？ 其他方法能否对其进行补充</strong>&nbsp;&nbsp;&nbsp;软件开发工程描述了构造、部署以及维护软件的方式。 统一过程已经成为一种流行的构造面向对象系统的迭代软件开发过程。特别是，Rational统一过程（Rational Unified Process ,RUP）是对统一过程的详细精化，并且已经被广泛采纳。 </p>
    <p>UP是十分灵活和开放的，并且鼓励引进其他迭代方法中的有用的实践，诸如<font color="#0000ff">极限编程（Extreme Programming,XP）</font>、Scrum等等。 例如，在UP项目中可以引入XP的<font color="#0000ff">测试驱动开发（test-driven development）、重构（refactoring）</font>和<font color="#0000ff">持续集成（continuous integration）</font>等实践。同样，也可以引入Scrum的公共项目室（&#8220;作战室&#8221;）和Scrum日常会议等实践。 </p>
    <p><font color="#ff00cc">概括而言，本章介绍UP源于下述三个理由： </font></p>
    <p><font color="#000000">1、UP是迭代过程。迭代开发对本书介绍OOA/D的方式，以及OOA/D的最佳实践具有影响。 </font></p>
    <p><font color="#000000">2、UP实践提供了如何实施OOA/D的示范结构。这也形成了本书的结构。 </font></p>
    <p><font color="#000000">3、UP具有灵活性，可以应用于轻量级和敏捷方法，这些方法包括其他敏捷方法（诸如XP或Scrum）的实现，稍后将对此作更多介绍。</font> </p>
    <p><strong>什么是迭代和进化式开发</strong><font color="#0033ff">&nbsp;&nbsp;&nbsp;</font><font color="#0000cc"><strong>迭代开发(interative development)</strong></font>是UP和大多数其他现代方法中的关键实践。在这种生命周期方法中，开发被组织成一系列固定的短期（如三个星期）小项目，称为<font color="#0000cc"><strong>迭代(iterative)</strong></font>，每次迭代都产生经过测试、集成并可执行的局部系统。每次迭代都具有各自的需求分析、设计、实现和测试活动。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 迭代生命周期基于对经过多次迭代的系统进行持续扩展和精化，并以循环反馈和调整为核心驱动力，使之最终成为适当的系统。随着时间和一次又一次迭代的递进，系统增量式地发展完善，因此这一方法也被称为<font color="#0000cc"><strong>迭代和增量式开发(interative and incremental development)</strong></font>(参见图2-1)。因为反馈和调整使规格说明和设计不断进化，所以这种方法也称为<font color="#0000cc"><strong>迭代和进化式开发(interative and evolutionary development)。 </strong></font></p>
    <p><font color="#0000cc"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong></font>每次迭代都产生可执行的但不完整的系统，它不是已经准备好可以交付的产品。直到多次迭代之后，系统才能够合格的用于产品部署。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;迭代的输出不是实验性的或将丢弃的原型，迭代开发也不是构造原型。与之相反，其输出是最终系统的产品子集。 </p>
    <p>&nbsp;</p>
    <p><strong>如何在迭代项目中处理变更</strong> </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每次迭代选择一小组需求，并快速设计、实现和测试。在早期迭代中，对需求和设计的选择对于最终期望来说可能并不准确。但是，在最终确定所有需求或经过深思熟虑而定义完整设计之前，快速地实施一小步的方式可以得到快速反馈--来自用户、开发人员和测试的反馈。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这种反馈具有极高的价值。与&#8220;推测&#8221;完整、正确的需求或设计相反，团队可以从实际构造和测试的反馈中，挖掘出至关重要和实际的观点，并修改和调整对需求或设计的理解。 早期频繁地在&#8220;不错。。。但是&#8221;中循环，正是改进软件和发现什么对涉众有真正价值的实用方式。然而这并非对开发者不断变换方向的无序和反应式开发的认可，作为一条中间路线是可行的。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 除了明确需求之外，负载测试将验证局部设计和实现是否正确，或者是否需要在下次迭代中改变核心架构。最好及早解决和验证具有风险的、关键的设计决策，而迭代开发提供了完成这项工作的机制。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此，工作是通过一系列有序的构造--反馈--调整循环向前进展的。早期迭代中系统偏离&#8220;正确轨迹&#8221;的程度会大于后继迭代。随着时间的发展，系统将沿着这一轨迹收敛。如图2-2 </p>
    <p>&nbsp;</p>
    <p><strong>迭代开发的优点 </strong></p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;迭代开发的优点包括： </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、减少项目失败可能性，提高生产率，降低缺陷率。对迭代和进化式的研究表明了这一点。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、在早期（而不是晚期）缓解高风险（技术、需求、目标、可用性等等） </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、早期可见的进展 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、早期反馈、用户参与和调整，会产生更接近涉众真实需求的精化系统。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5、可控复杂性：团队不会被&#8220;分析瘫痪&#8221;或长期且复杂的步骤所淹没 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6、一次迭代中的经验可以被系统地用于改进开发过程本身，并如此反复进行下去。 </p>
    <p>&nbsp;</p>
    <p><strong>一次迭代的持续时间和时间定量</strong> </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大部分迭代方法建议迭代时间在2~6周之间。小步骤、快速反馈和调整时迭代开发的主要思想，迭代时间过长会破坏迭代开发的核心动机并增加项目风险。 迭代的一个关键思想是时间定量(timeboxed)，或时长固定。 </p>
    <p><strong>什么是瀑布生命周期&nbsp;</strong>&nbsp;&nbsp; 在瀑布生命周期过程中，试图在编程之前（详细定义所有或大部分需求）。而且在通常与编程之前创建出完整的设计。同样，会试图在开始前定义&#8220;可靠的&#8221;计划或时间表，但常常事与愿违。 </p>
    <p>&nbsp;</p>
    <p><strong>反馈和改写的必要性</strong> </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;在复杂、变更系统中（如大多数软件项目），反馈和调整是成功的关键要素。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、来自早期开发中的反馈，有助于程序设计人员理解规格说明，客户演示也有助于精化需求。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、来自测试中的反馈，有助于开发者精化设计或模型。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、来自团队处理早期特性过程中的反馈，有助于精化时间表和估计 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、来自客户和市场的反馈，有助于重新定义下一次迭代实现特性的优先级。 </p>
    <span style="position: absolute; visibility: hidden;" id="show1_2" class="foldclosed" onclick="show_folder('1_2')">+</span> <span style="position: relative; visibility: visible;" id="hide1_2" class="foldopened" onclick="hide_folder('1_2')">-</span>
    <p>如何进行进化和迭代式分析和设计&nbsp; 这里的介绍可能会给人留下这样的印象，即编程前的分析和设计毫无价值，但这是与瀑布思维同样偏激的误解。迭代和进化式分析设计师中庸之道。这里有个简短的例子，用以说明在运转良好的UP项目中，迭代方法是如何被运用的。这里假设在项目交付前，最终将有20次迭代。 </p>
    <ul style="position: relative; visibility: visible;" id="fold1_2">
        <li>
        <p>在第一次迭代之前，召开第一个时间定量的需求工作会议，例如确切的定义为两天时间。业务和开发人员（包括首席架构师）需要出席。 </p>
        <p>&nbsp;<strong>&nbsp;&nbsp;1&gt; </strong>在第一天上午，进行高阶需求分析，例如仅仅确定用例和特性的名称，以及关键的非功能性需求。这种分析不可能是完美的。 </p>
        <p>&nbsp;&nbsp;<strong>&nbsp;2&gt;</strong>&nbsp; 通过咨询首席架构师和业务人员，从高阶列表中选择10%列表项（例如，30个用例中的10%），这些项目要具备以下三种性质：A、具有重要的架构意义（如果要实现，我们必须设计、构造和测试的核心架构） B、具有高业务价值（业务真正关心的特性） C、具有高风险（例如&#8220;能够处理500个并发交易&#8221;等）。所选的三个用例可能被标识为:UC2、UC11和UC14。 </p>
        <p>&nbsp;&nbsp;&nbsp;<strong>3&gt;</strong>在剩下的一天半内，对这三个用例的功能和非功能性需求进行详细的分析。完成这一过程后，对10%进行了深入分析，90%进行了高阶分析。 </p>
        <p>在第一次迭代之前，召开迭代计划会议，选择UC2、UC11和UC14的子集，在特定时间内（例如，四周的时间定量迭代）进行设计、构造和测试。要注意的是，因为其中包含大量工作，所以并不是在第1次迭代中就要构造出全部三个用例。在选择了特定子集目标后，在开发团队的帮助下，将其分解为一系列更为详细的迭代任务。 </p>
        <p>在三到四周内完成第1次迭代（选择时间定量，并严格遵守时间）。 </p>
        <p>&nbsp;<strong>&nbsp;1&gt;</strong>&nbsp;在开始的两天内，开发者和其他成员分组进行建模和设计工作，在首席架构师的带领和指导 下，于&#8220;公共作战室&#8221;的众多白板上，画出UML的草图（及其他的模型）。 </p>
        <p>&nbsp;&nbsp;<strong>2&gt;</strong>&nbsp; 然后，开发者摘掉其"建模帽子"并带上"编程帽子"，开始编程、测试和集成工作并且剩余的时间均用于完成这项工作。开发者将建模草图作为其灵感的起点，但要清楚这些模型只是局部的，并且通常是含糊的。 </p>
        <p>&nbsp;&nbsp;<strong>3&gt;</strong>&nbsp;进行大量的测试，包括单元测试、验收测试、负载测试和可用性测试等。 </p>
        <p>&nbsp;&nbsp;<strong>4&gt;</strong>&nbsp; 在结束前的一周，检查是否能够完成初始的迭代目标；如果不能，则缩小迭代的范围，将次要目标置回任务列表中。 </p>
        <p>&nbsp;<strong>&nbsp;5&gt;</strong>&nbsp;在最后一周的星期二，冻结代码；必须检入、集成和测试所有代码，以建立迭代的基线。 </p>
        <p>&nbsp;<strong>&nbsp;6&gt;</strong>&nbsp;在 星期三的上午，向外部涉众演示此局部系统，展示早期可视进展，同时要求反馈。&nbsp; </p>
        <p>在第一次迭代即将结束时（如最后一周的星期三和星期四），召开第二次需求工作会，对上一次会议的所有材料进行复查和精化。然后选择具有重要架构意义和高业务价值的另外10%到15%的用例，用一到两天对其进行详细分析。这项工作完成后，会详细记录下大概25%的用例和非功能性需求。当然，这也不是完美的。 </p>
        <p>于周五上午，举行下一次的迭代计划会议。 </p>
        <p>以相同步骤进行第二次迭代 </p>
        <p>反复进行四次迭代和五次需求工作会，这样在第四次迭代结束时，可能已经详细记录了约80%~90%的需求但只实现了系统的10% （注意，这些大量、详细的需求集是基于反馈和进化的，因此其质量远高于纯粹依靠推测而得出的瀑布式规格说明） </p>
        <p>我们大概推进了整个项目过程的20%。在UP的术语里，这是<font color="#0000cc"><strong>细化阶段</strong></font>(elaboration phase)的结束。此时，可以估计这些精化的、高质量的需求所需工作量和时间。因为具有依据现实得出的调查、反馈结论并进行了早期编程和测试，因此估计能够做什么和需要多长时间的结果会更为可靠。 </p>
        <p>此后，一般不需要再召开需求工作会；需求已经稳定了（尽管需求永远不会被冻结）。接下来是一系列为期三周的迭代，在最后一个周五召开的迭代计划会议上选择适宜的下一步工作，每次迭代都要反复询问：&#8220;就我们现在所知，下一个三周应该完成的、最关键的技术和业务特性是什么？&#8221; </p>
        <p>&nbsp;&nbsp;PPT2-5 中描述了经过20次迭代的项目。 </p>
        <p>利用这种方式、经过早期探索式开发的几次迭代之后，团队将能够更准确地回答&#8220;什么、多少、何时&#8221;。 </p>
        </li>
    </ul>
    <p><strong>什么是风险驱动和客户驱动的迭代计划&nbsp;&nbsp;</strong>&nbsp; &nbsp;UP（及大多数新方法）提倡<font color="#0000cc"><strong>风险驱动（risk-driven）</strong></font>与<font color="#0000cc"><strong>客户驱动(client-driven)</strong></font>相结合的迭代计划。这意味着早期的迭代目标要能够识别和降低最高风险，并且能构造客户最关心的可视化特性。 </p>
    <p>&nbsp;&nbsp;风险驱动迭代开发更为明确地包含了以<font color="#0000cc"><strong>架构为中心（architecture-centric）</strong></font>迭代开发的实践，意味着早期迭代要致力于核心架构的构造、测试和稳定。为什么？因为没有稳固的架构就会带来高风险。 </p>
    <p><strong>什么是敏捷方法及其观点</strong>&nbsp; &nbsp;<font color="#0000cc"><strong>敏捷开发(agile development)</strong></font>方法通常应用时间定量的迭代和进化式开发、使用自适应计划、提倡增量交付并包含其他提倡敏捷性（快速和灵活的响应变更）的价值和实践。除此之外，他们还提倡反映简易、轻量、沟通、自组织团队等更多敏捷性的实践和原则。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;Scrum敏捷方法中的实践范例包括公共项目工作室和自组织团队，这些实践通过每日例行会议来协调工作，在例会上要求每位成员回答四个特定的问题。 &nbsp;极限编程（XP）方法中的实践范例包括结对编程和<font color="#0000cc"><strong>测试驱动开发（test-driven development）。 </strong></font></p>
    <p><font color="#0000cc"><strong>&nbsp;&nbsp;&nbsp; </strong></font>包括UP在内的任何迭代方法都可以施加以敏捷精神。 </p>
    <p><strong>什么是敏捷建模&nbsp;</strong>&nbsp;&nbsp;&nbsp;有经验的分析员和建模者了解以下这条建模的秘诀： 建模（构建UML草图）的目的主要是为了理解，而非文档。&nbsp;&nbsp;也就是说，建模的真正行为能够并且是应该能够对理解问题或解决方案空间提供更好的方式。&nbsp; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;在"Agile Modeling" 一书中，将这种观点及与之一致的敏捷方法称为敏捷建模(agile modeling)。 这其中包含了以下许多实践和价值： </p>
    <p><strong><font color="#0000cc">&nbsp;&nbsp;1、</font></strong>采用敏捷方法并不意味着不进行任何建模，这是个错误理解。Feature-Driven Development、DSDM和Scrum等许多敏捷方法、一般都包含重要的建模期。正如Ambler(XP 方法和敏捷建模的专家)所言，即便是XP（可能是最少强调建模的最为知名的敏捷方法）的奠基人也认可敏捷建模，并且多年来有大量建模者都在实践中采用了敏捷建模。 </p>
    <p><strong><font color="#0000cc">&nbsp;&nbsp;2、</font></strong>建模和模型的目的主要用于理解和沟通，而不是构建文档。 </p>
    <p><strong><font color="#0000cc">&nbsp;&nbsp;3、</font></strong>不要对所有或大多数软件设计建模或应用UML。可以将简单的设计问题推延到编程阶段，在编程和测试过程中解决这些问题。只需对设计空间中不常见、困难和棘手的一小部分问题建模和应用UML &nbsp; </p>
    <p><strong><font color="#0000cc">&nbsp;&nbsp;4、</font></strong>尽可能使用最简单的工具。建议使用支持快速输入和改变的&#8220;低能耗&#8221;创造力增强型的简易工具。同时，选择支持大可视空间的工具。例如，最好在白板上草图UML，使用数码相机捕获图形。（这里 并不是说UML CASE工具或字处理软件不可取或毫无价值，但是对于创造性工作来说，在白板上画草图更为流畅并便于修改。关键的规则是简单和敏捷，而不论使用何种技术） </p>
    <p><strong><font color="#0000cc">&nbsp;&nbsp;5、</font></strong>不要单独建模，而是结对在白板上建模，同时要记住建模的目的是发现、理解和共享大家的理解。小组成员要轮流画草图，以使每个人都参与其中。 </p>
    <p><strong><font color="#0000cc">&nbsp;&nbsp;6、</font></strong>并行的创建模型。例如，在一块白板上勾勒UML动态视图的交互图，同时在另一白板上勾画出补充性的UML静态视图的类图。同时开发这两种模型（视图），并不断交替。 </p>
    <p><strong><font color="#0000cc">&nbsp;&nbsp;7、</font></strong>在白板上用笔画草图时，应使用&#8220;足够好&#8221;的简单表示法。UML细节是否精准并不重要，关键是建模者能够互相理解，坚持使用简单、常用的UML元素。 </p>
    <p><strong><font color="#0000cc">&nbsp;&nbsp;8、</font></strong>要知道所有模型都可能是不准确的，最终代码或设计会与模型有差异，甚至具有极大的差异。只有测试过的代码才能证实真正的设计；先前绘制的模型图都是不完整的，最好只是将其视为一次探索。 </p>
    <p><strong><font color="#0000cc">&nbsp;&nbsp;9、</font></strong>开发者应该为自己进行OO设计建模，而不是创建模型图后交给其他编程者去实现--这是非敏捷的面向瀑布的方法。 </p>
    <p>&nbsp;</p>
    <p><strong>本书中的敏捷建模：为什么使用UML草图的快照</strong>&nbsp; 因为这些图是为了提高可读性而使用工具精心绘制的。为了让大家感受真实情况，本书有时会使用在白板绘制的UML草图的数码快照。这样虽然易读性差一些，但是可以提醒读者敏捷建模是很有用的，并且这种方式是案例研究所使用的实际工作方式。 </p>
    <p><strong>什么是敏捷UP</strong>&nbsp; UP的创始人并没有为其赋予重量级或非敏捷的含义，尽管其庞大的可选活动集和制品集会给人留下这种印象。实际上，UP可以采纳和应用可适应性和轻量级的精神--<strong>敏捷UP</strong>。以下是应用的一些示例： </p>
    <p><font color="#0000cc">&nbsp; <strong>1、</strong></font>推荐使用UP活动和制品的简集。虽然某些项目得益于使用较多的UML活动和制品，但一般来说应该保持简洁。要记住，所有UP制品都是可选的，除非它们能增加价值，否则避免创建这些制品。应该致力于早期的编程，而非构建文档。 </p>
    <p><strong><font color="#0000cc">&nbsp;&nbsp;2、</font></strong>UP是迭代和不断进化的，所以在实现前的需求和设计师不完整的。它们是在一系列迭代中，基于反馈而产生的。 </p>
    <p>&nbsp;<strong><font color="#0000cc">&nbsp;3、</font></strong>以敏捷建模实践应用UML </p>
    <p>&nbsp;&nbsp;<strong><font color="#0000cc">4、</font></strong>对于整个项目不应有详细的计划。应该制定估计结束日期和主要里程碑的高阶计划<font color="#000000">（称为</font><strong><font color="#0000cc">阶段计划</font></strong>），但是不要对这些里程碑详细定义细粒度的步骤。只能预先对一个迭代制定更为详细的计划（称为<strong><font color="#0000cc">迭代计划</font></strong>）。详细计划是由一次次迭代的调整而完成的。 </p>
    <p><strong>UP的其他关键实践</strong>&nbsp;&nbsp;&nbsp;UP所倡导的核心思想是：短时间定量迭代、进化和可适应性开发。其他一些UP的最佳实践和关键概念包括： </p>
    <p>&nbsp;&nbsp;&nbsp;1、在早期迭代中解决高风险和高价值的问题 </p>
    <p>&nbsp;&nbsp;&nbsp;2、不断地让用户参与评估、反馈和需求 </p>
    <p>&nbsp;&nbsp;&nbsp;3、在早期迭代中建立内聚的核心架构 </p>
    <p>&nbsp;&nbsp;&nbsp;4、不断的验证质量；提早、经常和实际地测试 </p>
    <p>&nbsp;&nbsp;&nbsp;5、在适当的地方使用用例 </p>
    <p>&nbsp;&nbsp;&nbsp;6、进行一些可视化建模（使用UML） </p>
    <p>&nbsp;&nbsp;&nbsp;7、认真管理需求 </p>
    <p>&nbsp;&nbsp;&nbsp;8、实时变更请求和配置管理 </p>
    <p><strong>什么是UP的阶段&nbsp;&nbsp;</strong>&nbsp;&nbsp;UP项目将其工作和迭代组织为四个主要阶段： </p>
    <p><font color="#0000cc">1、初始（Inception）</font>：大体上的构想、业务案例、范围和模糊评估 </p>
    <p><font color="#0000cc">2、细化（Elaboration）</font>：已精化的构想、核心架构的迭代实现、高风险的解决、确定大多数需求和范围以及进行更为实际的评估 </p>
    <p><font color="#0000cc">3、构造（Construction）</font>：对遗留下来的风险较低和比较简单的元素进行迭代实现，准备部署 </p>
    <p><font color="#0000cc">4、移交（Transition）</font>：进行beta测试和部署 </p>
    <p>&nbsp;&nbsp;图2-6说明了UP中常用的面向进度表的术语。注意，一个开发周期（以系统发布为产品作为结束标志）由多个迭代组成 </p>
    <p><strong><font color="#000000">什么是UP科目&nbsp;&nbsp;&nbsp;</font></strong>&nbsp;&nbsp;UP描述了<strong><font color="#0000cc">科目(discipline)</font></strong>中的工作活动，例如编写用例。科目是在一个主题域中的一组活动（及相关制品），例如需求分析中的活动。在UP中，<strong><font color="#0000cc">制品（artifact）</font></strong>是对所有工作产品的统称，如代码、Web图形、数据库模式、文本文档、图、模型等。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;UP中有几个科目，本书中只关注以下三个科目中的制品： </p>
    <p>&nbsp;&nbsp;&nbsp;1、<strong><font color="#0000cc">业务建模：</font></strong>&nbsp; 领域模型制品，使应用领域中的重要概念的可视化。 </p>
    <p>&nbsp;&nbsp;&nbsp;2、<strong><font color="#0000cc">需求</font></strong><font color="#0000cc">：</font>用以捕获功能需求和非功能需求的用例模型及其补充性的规格说明制品。 </p>
    <p>&nbsp;&nbsp;&nbsp;3、<strong><font color="#0000cc">设计：</font></strong>设计模型制品，用于对软件对象进行设计。 </p>
    <p>&nbsp;图2-7列出了更多的UP科目。&nbsp;&nbsp;在图中，<strong>实现</strong>表示编程和构建系统，而不是部署。<strong>环境</strong>科目是指建立工具并为项目定制过程，也就是说，设置工具和过程环境。 </p>
    <p>&nbsp;</p>
    <p><strong>科目和阶段之间的关系</strong>&nbsp; &nbsp; <strong>如图2-7</strong>所示，一次迭代的工作会遍历大部分或全部科目。然而，跨越这些科目的相对工作量会随着时间发生变化。自然而然，早期迭代倾向于更多的需求和设计，后期迭代则较少进行这方面的工作，因为通过反馈和改写过程，需求和核心已经趋向于稳定。 </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;就UP阶段（初始、细化等）的这一主题，<strong>图2-8</strong>阐述了对应于各阶段的相对工作量的变化。请注意，这只是建设性意见，而非强制。 </p>
    <p>&nbsp;</p>
    <p><strong>UP阶段和科目对本书结构的影响</strong>&nbsp;&nbsp; 案例研究强调初始和细化阶段。其重点是业务建模、需求和设计科目中的一些制品，因为这些都是需求分析、OOA/D、模式和UML的主要应用之处。 </p>
    <p>&nbsp;</p>
    <p>下面的列表和图2-9描述了本书关于UP阶段的组织。 </p>
    <p>1、初始阶段对应的章介绍需求分析的基本内容 </p>
    <p>2、迭代1介绍OOA/D基础和如何为对象分配职责 </p>
    <p>3、迭代2的重点是对象设计，特别介绍一些经常使用的&#8220;设计模式&#8221; </p>
    <p>4、迭代3介绍各种主题，例如架构分析和框架设计。 </p>
    <p><strong>如何定制过程和UP开发案例</strong> </p>
    <p>&nbsp;</p>
    <p><strong>UP中有可选制品或实践吗</strong>&nbsp;&nbsp;&nbsp;&nbsp;当然！ 几乎所有的制品和实践都是可选的。也就是说，某些UP实践和原则是一成不变的，例如迭代和风险驱动开发以及质量的持续验证。 然而，UP的一个关键内涵是，所有活动和制品（模型、图、文档。。。）都是可选的--或许除了代码！ </p>
    <p>&nbsp;</p>
    <p>UP中描述的一组可能的制品可以看作药房里的一组药剂。就像不会有人不加选择地随便吃药，而是要对症下药一样，对于UP项目，开发团队应该选择一组能够解决其特定问题和需要的制品。一般来说，要关注一组具有较高实践价值的制品。 </p>
    <p>&nbsp;</p>
    <p><strong>定义：什么是开发案例&nbsp;</strong>&nbsp; 为项目选择实践和UP制品可以编写为简短文档，这称为开发案例（环境科目中的制品）（PPT01）可以作为本书所探讨的"NextGen项目"案例研究中的开发案例 </p>
    <p><strong>判断你是否理解迭代开发或UP</strong>&nbsp;&nbsp;若出现以下迹象，表明你并没有理解以敏捷精神采用迭代开发和UP的真正含义。 </p>
    <p><strong>1、</strong>在开始设计或实现之前试图定义大多数需求。同样，在开始实现之前试图定义大多数设计；试图在迭代编程和测试之前定义和提交完整的架构 </p>
    <p><strong>2、</strong>在编程之前花费数日或数周进行UML建模，或者认为在绘制UML图和进行设计时要准确完整地定义及其详细的设计和模型。并且，认为编程只是简单机械地将其转换为代码的过程 </p>
    <p><strong>3、</strong>认为初始阶段=需求阶段，细化阶段=设计阶段，构造阶段=实现阶段（也就是说将瀑布模型叠加于UP之上） </p>
    <p><strong>4、</strong>认为细化的目的是完整仔细地定义模型，以能够在构造阶段将其转换为代码 </p>
    <p><strong>5、</strong>坚信合适的迭代时间长度为三个月之久，而不是三周 </p>
    <p><strong>6、</strong>认为采用UP就意味着要完成大量可能的活动和创建大量的文档，并且认为UP是需要遵循大量步骤的、正规和繁琐的过程 </p>
    <p><strong>7、</strong>试图对项目从开始到结束制定详细计划；试图预测所有迭代，以及每个迭代中可能发生的事情。 </p>
    </li>
</ul>
</li><img src ="http://www.blogjava.net/kissyan4916/aggbug/319044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2010-04-22 00:11 <a href="http://www.blogjava.net/kissyan4916/articles/319044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Applying UML and Patterners(Third Edition)学习笔记（一）</title><link>http://www.blogjava.net/kissyan4916/articles/319043.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Wed, 21 Apr 2010 16:05:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/319043.html</guid><description><![CDATA[<p><strong><font color="#ff0000"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/shupi.jpg" border="0" /><br />
<br />
关于作者：</font></strong>Craig Larman是Valtech公司的首席科学家。Valtech公司是一家国际性的咨询和技术转让公司，在欧洲，亚洲和北美洲都有分支结构。他还是《敏捷迭代开发：管理者指南》(Agile and Iterative Development: A Manager's Guide)一书的作者，这是一本关于软件工程和迭代、敏捷开发方面的畅销书籍。他在全球各地游历，足迹遍布从美国的印第安纳州到印度的很多地方，为开发团队和管理人员进行培训。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20世纪80年代中期以来，Craig帮助了数以千计的开发者，使他们能够应用OOA/D、熟练使用UML建模技术、采用迭代开发实践。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在结束其街头流浪音乐家生涯后，Craig在20世纪70年代开始使用APL、PL/I和CICS建立系统。从20世纪80年代初期开始，他开始对人工智能产生兴趣、并用Lisp机器、Lisp、Prolog和Smalltalk建立过知识系统。他也为使用Java、.NET、C++和Smalltalk建立系统的公司工作过。他在大部分业余时间里担任过Changing Requirement乐队的主音吉他手。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;他在加拿大温哥华Simon Fraser大学获得计算机科学学士和硕士学位。 </p>
&nbsp;<br />
<span class="foldspecial" onclick="fold_document()">&nbsp;All +</span> <span class="foldspecial" onclick="unfold_document()">All -</span>
<p><a href="file:///C:/E:/学习笔记/Applying%20UML%20and%20Patterners(Third%20Edition).mm.html" target="_blank"><span class="l">~</span>&nbsp;第1章：面向对象分析和设计 </a>
</p>
<ul>
    <li>
    <p><strong>本书的主要内容</strong>&nbsp; &#8220;拥有一把锤子未必能成为架构师&#8221;，这句谚语在对象技术领域同样适用。对创建对象系统来说，了解面向对象语言（例如Java）是必要的，但不是首先要做的。了解&#8220;对象思想&#8221;才是关键所在！ </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;本书是对应用了统一建模语言（UML）和模式的OOA/D的介绍。同时，对于迭代开发，本书使用统一过程（Unified Process）的敏捷方法作为示例迭代过程。 </p>
    <p><strong>UML和对象思想 </strong>UML并不是OOA/D，也不是方法，它只是图形表示法。<font color="#0000ff">如果没有真正掌握如何创建优秀的面向对象设计，或者如何评估和改进现有设计，那么学习UML或者UML CASE工具是毫无意义的。对象思想才是重点和难点。</font>因此本书重点阐述对象设计。 而且，我们需要一种用于OOA/D和&#8220;软件蓝图&#8221;的语言，这既是一种思考的工具，也是一种沟通的形式。因此，本书也将探讨如何在OOA/D中应用UML，并涵盖经常使用的UML表示法。 </p>
    <p><strong>OOD的原则和模式 </strong>应该如何为对象分配<font color="#0000cc"><strong>职责（responsibility）</strong></font>?对象之间应该如何协作？什么样的类应该做什么样的事情？这些都是系统设计中的关键问题，而本书将会讲授作为经典OO设计之象征<font color="#0000cc">的<strong>职责驱动设计（responsibility-driven design）</strong></font>。同时，某些针对设计问题的，经过反复验证的解决方案可以被表示成为最佳实践的原则、启示或<font color="#0000cc"><strong>模式（pattern）</strong></font>，即问题-解决方案公式，这些公式是系统化的、典型的设计原则。本书将会通过讲授如何应用模式或原则，使读者更快地学习和熟练使用这些基本的对象设计习惯用法。 </p>
    <p><strong>案例研究 </strong>本书对OOA/D的介绍是通过一些<font color="#0000cc">贯穿全书的案例研究（ongoing case study）</font>来阐述的，并且充分深入到分析和设计中，考虑和解决了现实问题中令人生畏但必须被考虑和解决的细节。 </p>
    <p><strong>用例 </strong>OOD(以及所有软件设计)与作为其先决活动的需求分析(requirement analysis)具有紧密联系，而在需求分析中通常包含用例（use case）的编写。因此，尽管这些主题并非是特定与面向对象的，但也会在案例研究的开始对其进行介绍。 </p>
    <p><strong>迭代开发、敏捷建模和敏捷UP </strong>&nbsp; 需求分析和OOA/D需要在某种开发过程的语境中进行描述和实践。在这种情况下，使用著名的<font color="#0000cc">统一过程</font>&nbsp; （Unified Process）的敏捷（轻量的、灵活的）方法作为迭代开发过程（iterative development process）的样例，并在这一过程中介绍需求需求分析和OOA/D的主题。然而，这里所涵盖的分析和设计主题对于许多开发过程是通用的，在敏捷UP的语境中学习它们并不影响这些技术对于其他方法的适用性，这些方法包括Srucm、Feature-Driven Development(FDD)、lean Development、Crystal Methods等等。 </p>
    <p><strong>重要的学习目标</strong>&nbsp;<font color="#0000cc">在OO开发中，至关重要的能力是熟练地为软件对象分配职责</font>。为什么？ 因为分配职责是必须要执行的一项活动（无论是画UML图时还是进行程序设计，都要为软件对象分配职责），并且它对软件构件的健壮性、可维护性和可重用性具有重要影响。 </p>
    <p><strong>什么是分析和设计</strong>&nbsp;<font color="#0000cc">分析（analysis）</font>强调的是对问题和需求的调查研究，而不是解决方案。&#8220;分析&#8221;一次含义广泛，最好加以限制，如需求分析（对需求的调查研究）或面向对象分析（对领域对象的调查研究）。 </p>
    <p><font color="#0000cc">设计 （design）</font>强调的是满足需求的概念上的解决方案（在软件方面和硬件方面），而不是其实现。与&#8220;分析&#8221;相同，对&#8220;设计&#8221;一词最好也加以限制，如面向对象设计或数据库设计。 </p>
    <p><strong>什么是面向对象分析和设计</strong><font color="#0000cc">&nbsp;在面向对象分析（object-oriented analysis）</font>过程中，强调的是在问题领域内发现和描述对象（或概念）。 </p>
    <p><font color="#0000cc">在面向对象设计(object-oriented design，简称对象设计)</font>过程中，强调的是定义软件对象以及它们如何协作以实现需求。 </p>
    <p><strong>1、定义用例 </strong><font color="#0000cc">需求分析可能包括人们如何使用应用的情节或场景，这些情节或场景可以被编写成用例（use case）</font>。用例不是面向对象制品，而只是对情节的记录。但用例是需求分析中的一种常用工具。 </p>
    <p><strong>2、定义领域模型</strong>&nbsp; <font color="#0000cc">面向对象分析关注从对象的角度创建领域描述。</font>面向对象分析需要鉴别重要的概念、属性和关联。&nbsp; 面向对象分析的结果可以表示为领域模型，在领域模型中展示重要的领域概念或对象。需要注意的是，领域模型模型并不是对软件对象的描述，它使真实世界领域中的概念和想象可视化。因此，它也被称为概念对象模型（conceptual object model）。 </p>
    <p><strong>3、分配对象职责并绘制交互图<font color="#0000cc">&nbsp; </font></strong><font color="#0000cc">面向对象设计关注软件对象的定义--它们的职责和协作</font>。顺序图(sequence diagram,UML的一种交互图)是描述协作的常见表示法。它展示出软件对象之间的消息流，和由消息引起的方法调用。 </p>
    <p><strong>4、定义设计类图 </strong>除了在交互图中显示对象协作的动态视图外、<font color="#0000cc">还可以用设计类图（design class diagram）来有效地表示类定义的静态视图。这样可以描述类的属性和方法。</font> </p>
    <p><strong>什么是UML</strong>&nbsp;<font color="#0000cc">&nbsp;统一建模语言（UML）是描述、构造和文档化系统制品的可视化语言。</font> </p>
    <p>在上面的UML定义中，关键点是可视化这个词，UML是图形化表示法的事实标准，用来绘制和展示与软件有关的图形（以及文字）。本书重点关注UML的常用图、这些常用图中的常用特性和在未来版本中不太可能变化的核心表示法。 </p>
    <p>UML定义了各种UML简档（UML profile），这些简档专用于某些常用主题领域的表示法子集，例如对EJB使用UML EJB简档。 </p>
    <p>在更深入的层次上，UML表示法的基础是UML元模型(meta-model)，它描述建模元素的语义，UML元模型主要对模型驱动架构（Model Driven Architecture，MDA）CASE工具供应商具有影响。开发者并不需要对其进行学习。 </p>
    <p><span class="foldclosed" id="show1_1" style="visibility: hidden; position: absolute;" onclick="show_folder('1_1')">+</span> <span class="foldopened" id="hide1_1" style="visibility: visible; position: relative;" onclick="hide_folder('1_1')">-</span> 1、应用UML的三种方式
    </p>
    <ul id="fold1_1" style="visibility: visible; position: relative;">
        <li>
        <p><strong>UML作为草图 </strong>非正式的、不完整的图（通常是在白板上手绘草图），借助可视化语言的功能，用于探讨问题或解决方案空间的复杂部分。 </p>
        <p><strong>UML作为蓝图 </strong>相对详细的设计图，用于：1）逆向工程，即以UML图的方式对现有代码进行可视化，使其易于理解。2）代码生成（前项工程）。 </p>
        <p><font color="#0000cc">对于逆向工程</font>，UML工具读取源文件或二进制文件，并生成UML包图、类图和顺序图（一般情况下）。这些&#8220;蓝图&#8221;能够帮助读者从整体上理解元素、结构和协作。 </p>
        <p><font color="#0000cc">无论是人工还是使用自动工具生成代码</font>，在此之间绘制一些详细的图都能够为生成代码的工作提供指导。一般情况下，代码生成工具使用图生成一些代码，然后由开发者编写并填充其他代码。 </p>
        <p><font color="#0000cc">UML作为编程语言</font>&nbsp; 用UML完成软件系统可执行规格说明。可执行代码能够被自动生成，但并不像通常一样为开发者所见或修改；人们仅使用UML&#8220;编程语言&#8221;进行工作。如此应用UML需要有将所有行为或逻辑进行图形化表示的实用方法，但是目前在理论、工具的健壮性和可用性方面仍然处于发展阶段。 </p>
        <p><strong>UML和银弹思想</strong>&nbsp; 时间检验真理。UML仅仅是标准的图形化表示法，使用常用符号的可视化建模能够带来极大的帮助，但它不可能与设计和对象思想同等重要。设计知识是极不寻常的且更为重要的技能，它并不是通过学习UML表示法或者CASE或MDA工具就可以掌握的。<font color="#0000cc">如果不具备良好的OO设计和编程技能那么即使使用UML，也只能画出挫劣的设计</font><font color="#ff00cc">。如果要深入了解这一主题，建议阅读&#8220;Death by UML Fever&#8221;(UML的发明者Grady Booch亦为认可)和"What UML Is and Isn't?" 因此，本书是对OOA/D和应用UML进行熟练OO设计的介绍</font> </p>
        <p><strong>敏捷建模（agile modeling）</strong>强调了UML作为草图的方式，这也是使用UML的普通方式，而且通常对时间投入具有高回报（一般费时较短）。虽然UML工具能够提供帮助，但是建议也考虑使用UML的敏捷建模方法。 </p>
        </li>
    </ul>
    <span class="foldclosed" id="show1_2" style="visibility: hidden; position: absolute;" onclick="show_folder('1_2')">+</span> <span class="foldopened" id="hide1_2" style="visibility: visible; position: relative;" onclick="hide_folder('1_2')">-</span>
    <p>2、应用UML的三种透视图 UML描述的是原始图类型，如类图和顺序图。它并没有在这些图上叠加建模的透视图。例如，同样的UML类图表示法既能够描绘现实世界的概念，又能够描绘Java中的软件类。 </p>
    <p>Systropy面向对象方法强调了这一观点。其主旨是，同一种表示法可以用来描述模型的三种透视图和类型 </p>
    <ul id="fold1_2" style="visibility: visible; position: relative;">
        <li>
        <p><font color="#000000"><strong>概念透视图</strong>&nbsp;</font>用图来描述现实世界或关注领域中的事物。 </p>
        <p><strong>规格说明（软件）透视图</strong>&nbsp; &nbsp;用图（使用与概念透视图中相同的表示法） 来描述软件的抽象物或具有规格说明和接口的构件，但是并不约定特定实现（例如，非特定为C#或Java中的类）。 </p>
        <p><strong>实现（软件）透视图</strong>&nbsp; 用图来描述特定技术中的软件实现。 </p>
        <p>在实际设计过程中，很少会使用规格说明透视图（推迟了目标技术的选择，例如使用Java还是使用.Net）；大多数面向软件的UML图都会采用实现透视图。 </p>
        <p><strong>不同透视图中&#8220;类&#8221;的含义</strong>&nbsp; 在原始的UML中，图1-6中的矩形被称为类（class），但这个术语包含各种现象，如物理事务、抽象概念、软件事物、事件等等。 </p>
        <p>一个方法在原始UML之上添加了另一个术语。例如，在UP中，领域模型中的UML框被称为<font color="#0000cc">领域模型(domain concept)</font>或<font color="#0000cc">概念类（conceptual class）</font>。领域模型表示的是概念透视图。设计模型中的UML框被称为设计类（design class），设计模型依据建模者的需要，表示的是规格说明透视图或实现透视图。 </p>
        <p>&nbsp;&nbsp;&nbsp;为清晰起见，本书中与类相关的术语将与UML和UP保持一致，这些术语如下： </p>
        <p><strong>1、概念类（conceptual class）</strong>--现实世界中的概念或事物。在概念或本质透视图中使用。UP领域模型中包含概念类。 </p>
        <p><strong>2、软件类（software class）</strong>--无论在过程还是方法中，都表示软件构件在规格说明或实现透视图中的类。 </p>
        <p><strong>3、实现类（implement class）</strong>--特定OO语言中的类。 </p>
        </li>
    </ul>
    <p><strong>为何在某些章中没有大量使用UML </strong>本书的主题并不是UML表示法，而是在OOA/D和相关需求分析的语境下，对UML应用、模式和迭代过程的全景揭示。需求分析通常先于OOA/D，因此，本书在开始几章先介绍关于用例和需求分析的重要主题，然后再后继各章中详细介绍OOA/D和UML。 </p>
    <p><strong>可视化建模的优点 </strong>用符号来表示说明问题所冒的风险是显而易见的，绘制或阅读UML意味着我们要以更加可视化的方式工作，开发我们的脑力，以便更快地掌握（主流）二维框-线表示法中的符号、单元及关系。 </p>
    <p>这个古老而朴素的道理常常会遗失在大量的UML细节和工具中。这是不应该的！<strong>图可以帮助我们更为便利地观察全景，发现软件元素或分析之间的联系，同时允许我们忽略或隐藏旁支末节。这是UML或其他图形化语言的本质价值。</strong> </p>
    </li>
</ul>
<script type="text/javascript">
fold_document();
</script><img src ="http://www.blogjava.net/kissyan4916/aggbug/319043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2010-04-22 00:05 <a href="http://www.blogjava.net/kissyan4916/articles/319043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>笔记之《未雨绸缪》</title><link>http://www.blogjava.net/kissyan4916/articles/254972.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 12:58:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254972.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254972.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254972.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254972.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Normal07.8 磅02falsefalsefalseMicrosoftInternetExplorer4/* Style Definitions */table.MsoNormalTable{mso-style-parent:"";font-size:10.0pt;font-family:"Times New Roman...&nbsp;&nbsp;<a href='http://www.blogjava.net/kissyan4916/articles/254972.html'>阅读全文</a><img src ="http://www.blogjava.net/kissyan4916/aggbug/254972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 20:58 <a href="http://www.blogjava.net/kissyan4916/articles/254972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>