摄影网站排行,视频网站开发分析,网络服务合同定义,企业级网站开发模型的要素——用例、视图和构造块 模型的构建步骤 1#xff09;从用例场景开始#xff0c;给模型输入概念、属性、术语。 2#xff09;构建静态领域模型#xff08;类图#xff09;#xff0c;发现领域概念和对象属性。 3#xff09;构建动态领域模型#xff08;时序图…模型的要素——用例、视图和构造块 模型的构建步骤 1从用例场景开始给模型输入概念、属性、术语。 2构建静态领域模型类图发现领域概念和对象属性。 3构建动态领域模型时序图和协作图发现对象之间的关系、行为和事件步骤2、3交替进行。 4使用操作契约来检查和完善设计完成领域模型的单元测试用例。 -用例 用例是一组相关的成功和失败的场景集合用来描述参与者如何使用系统来实现其目标 参与者是某些具有行为的事物可以是人由角色表示、组织或其他计算机系统。 场景是参与者和系统之间的一系列特定活动和交互是使用系统的一个特定情节或用例的一条执行路径。 例如顾客下单、网络支付都属于一个场景 用例强调了用户的目标和观点。它回答了这样的问题“谁使用系统他们使用的典型场景是什么业务价值是什么” 用例由专门的UML图表示 用例图只描述了参与者与场景可以作为用例的概括和名称不能替代用例文本。 用例建模主要是编写文本的活动其中列举了各类条件和分支而不是简单绘制用例图 用例的主要作用如下。 1提供了模型的工作场景。 2提供重要概念、对象、属性、关联的输入。 3模型的测试和验收要基于用例。 4形成了最初的通用语言词汇表。 5作为领域专家和业务人员的绝佳切入点。 发现用例的系统过程如下。 1确定系统边界 2寻找参与者和目标 3定义用例 确定参与者和目标 ❑ 谁来启动和停止系统 ❑ 谁来完成用户管理和安全管理 ❑“时间”是参与者吗因为系统要响应时间事件来完成某些活动。 ❑ 除了人作为主要参与者外还有其他外部的系统调用该系统的服务吗 ❑ 谁来考察系统活动或性能 ❑ 谁来考察日志 用例的编写 1用例的参与者 1主要参与者具有用户目标使用系统完成该目标如顾客、管理员。主要参与者的目的是形成主要的有效用例集。 2协助参与者为系统和步骤1中的用例提供服务支持。支付授权服务即是一个例子还有为系统提供数据的用户或第三方系统。 比如你的手机定位为打车软件提供了服务。确定协助参与者将帮助我们明确外部接口和协议 3幕后参与者在用例行为中具有影响或利益但不属于前两者的参与者如审计部门。 2用例的三种常用形式 用例可以以不同的详略程度进行编写以满足不同的使用场景。 1摘要形式。 简洁的一段式概要通常用于主成功场景比如下单。 用于早期讨论阶段以使团队快速了解主题和范围几分钟即可完成。 目标清晰一般不会有什么歧义。 2非正式形式。非正式的段落格式用几个段落覆盖不同场景。 3详述形式。详细编写所有步骤及各种变化同时具有补充部分如前置和后置条件。 详述形式的用例有对应的模板展示了更多的细节并且更为深入。优先细化核心用例是设计领域模型的起点。 3好的用例风格 1拓展视野发现真正的客户目标 2以本质风格编写用例。不要过早地想象用户界面要摒弃用户界面思维集中于意图。 本质风格不涉及UI细节而集中于用户真实意图的编写风格。 具体风格表达的是用户旧的操作习惯 3采用用户价值的观点。
模型的数据类图 类图里的各个元素包括类名、属性和方法并展示了接口和类之间的继承与依赖关系。 类图中的大部分元素都是可选的例如/-可见性、参数和分栏建模者可根据建模的业务逻辑选择呈现、隐藏或定制化这些元素 属性 属性是类的重要成员是数据的载体处于类图的第一栏 属性一般分为3类 1语言层面的基本类型如布尔类型、日期、数字、字符、字符串、日期时间。 2通用的值类型非基本类型且不具有特定的业务含义即任何项目都通用如地址、电话号码、身份证号、自定义的枚举类型等。 3项目中的其他业务对象有专门的业务含义其中有唯一标识的称为实体没有标识的则为值类型。 2属性的表示方法 前两种类型的属性采用文本的方式进行展示即将其放在类图的第一栏中第三种类型采用关联线的方式进行展示。 文本表示法的完整格式如下 可见性公有/私有保护类型 多重性是否集合默认值{属性} 比如spanWeeks:int3{readonly}定义了一个公有的、整型的、默认值为3的只读属性spanWeeks跨越周数。 关联线表示法 关联线的箭头说明了从属关系。它可以包含定义的变量名称还可以附加多重性值如“”或“0…1”表示数量的对应关系关联线标识实际上已经在为业务逻辑建模了 “1…”的关系代码层面对应的是集合也可以添加相应的业务逻辑比如如果集合是排好序的可以加上{Ordered}特性 ** 方法** 方法是类的行为处于类图的第二栏。从某种程度上说它代表了类的行为和责任实际上是给“静态”的类图添加了“动态”元素 完整格式如下可见性公有/私有保护名称{参数列表}返回值{方法特性} 如 getPriceproductIDstringfloat{exception IOException}定义了一个公有的、以产品ID作为传入参数、返回值为浮点类型且方法内部可能抛出IO访问异常的名为getPrice获得价格的操作方法
注释、约束和关键字
UML注释标签显示为折角矩形并使用虚线连接到要注解的元素上 注释标签可以包括多种内容 注释和说明。任何需要说明业务的地方均可使用。 方法的代码实现。 操作的实现代码可以标记出来。注释可以采用伪代码或真 实代码的片段一般用关键字method标注。 需要注意图的空间限制并不一定要将代码完全粘贴在注释中只需要呈现你认为重要的部分即可。 注释标签的用法对于构建领域模型非常重要主要体现在以下两个方面 相对复杂找不到合适表示方法的领域逻辑都可以暂时放在注释标签里说明而作为模型和通用语言的一部分。 代码实现逻辑可以内置其中变为模型的一部分这完全符合三合一的原则 约束
约束是重要的领域逻辑可以完美地体现在类图上一般使用{…}形式来表示如{readonly}、{size0}。
关键字
UML关键字可以标记模型元素的类别。例如前面的 1依赖 类之间的相互依赖用连接的虚线箭头表示。当一个类依赖于另一个类时它们之间存在以下一种或多种关系 属性是被依赖的类。 使用了该类的类名、属性、方法、静态方法等。 参数是该类的类型。 继承该类接口则为实现。 总之当一个类的内部出现其他类的名字或其属性、方法时就与后者产生了依赖所有这些关系都可以用依赖线表示 但有些依赖类型已经有了自己的特殊线条表示法因此使用已经约定的方法而不是虚线箭头 限定关联
限定关联具有限定符这些限定符可依据键从规模较大的相对集合中选择一个或多个对象。加了限定符后关联对象间的多重性可能会改变通常是由多变一 Product为限定符之前订单与折扣之间是一对多关系即一个订单可以享受多种折扣但指定了商品Product后变为一对一的关系表现了对于一个商品只能享受一种折扣的需求含义。可以看到限定关联可以表达精确的业务逻辑是我们建模的利器 ** 聚合与组合** 类之间的聚合Aggregation与组合Composition都表示一种整体与部分的关系 两者的区别是聚合的部分可以脱离整体而存在而组合的部分必须依赖于整体而存在 组合关系有以下几层含义 在某一时刻部分实例只属于一个组合实例。 部分总是属于组合不存在脱离整体的部分脱离整体后的部分是无意义的。 组合要负责创建和删除其部分既可以自己来创建/删除部分又可以与其他对象协作来创建/删除部分。 如果组合被销毁其部分也必须被销毁。 聚合用空心的菱形箭头表示组合用实心的菱形箭头表示 模型的行为交互图
交互图是动态视图描述了在指定的用例场景下对象间的消息传递确定模型的行为和职责。交互图分为时序图和协作图 时序图具有更丰富的符号标记和更多含义 协作图更适合在白板上绘制 时序图通过栅栏格式描述交互在右侧添加新创建的对象。 协作图通过网络格式描述对象交互对象可以位于图中的任何位置 时序图 生命线框图表示交互的参与者可以将它理解为类的实例有两种表示法 生命线框图是框图之下的垂直延伸线代表对象的生命周期 新创建的对象的生命线高度与之前的对象不一样 被销毁的对象的生命线用“X”来标记 执行条是生命线上的空心长条表示对象的控制期。 在执行条的时间范围内该实体将完成一系列操作这些操作都是同步的意味着一个操作有了返回值才会执行下一个操作执行条消失意味着该实体的方法执行完毕。在用工具绘图时执行条是自动添加的。在绘制草图时我们一般将其忽略不绘制执行条 用带实心箭头的实线并附以消息表达式的方式表示对象间的每个消息同步消息生命线自上而下表示时间顺序。初始消息用实心圆作为起点初始消息图中没有发送者但每一个时序图都对应一个用例场景如果需要可以从对应的用例中找到发送者 消息表达式的标准语法 returnmessage(parameter:parameterType):returnType 如果明显或不重要可以省略类型信息。以下格式都是合法的 buyProduct(code) bookTicket() dgetProductDescription(id) dgetProductDescription(id:ItemId) dgetProductDescription(id:ItemId):ProductDescription 返回消息有以下两种表示法 使用上述消息表达式的标准语法即return varmessage(parameter)。 在活动条末端使用消息返回线。 实例的创建和销毁 创建对象的表示法。注意不同于消息对象的创建使用的是虚线 被创建的对象与创建它的对象不在同一高度时序图从上到下体现的是时间顺序低于被创建者意味着它是之后被创建的。 创建消息可以解释为“调用对象构造函数” 销毁对象如图4-21所示。一般在没有自动垃圾回收机制的语言中需要考虑销毁对象的操作如果我们使用的是完全的面向对象语言如Java、C#则可以忽略销毁对象的操作。 图框 有条件的消息和循环的逻辑时序图有图框表示法。 图框将作用于时序图的部分区域且左上角的标签表明图框的含义。 循环的图框顾客在有“更多商品”的前提下将循环地发送图框中的消息 同步和异步使用刺形箭头表示异步调用实心箭头表示同步调用生命线框图的两侧加竖线表示主动对象在独立的线程中运行的实例 Clock对象也称为主动对象即在其执行线程中运行或控制自己线程的实例 协作图1链路 链路是连接两个对象的路径它指明了对象间可能的导航和可见性 两个实体间只保留一条链路来代表关联关系不需要每一个消息都绘制一条链路。因此可以把链路理解为传送多种信息的导线。 消息和编号 对象间的消息可以使用消息表达式和指明消息方向的箭头来表示。因为缺少时序图的从上到下的时间顺序所以可以为消息添加编号以表示消息的次序。不要为初始消息编号只为两个实体间的消息编号这样可以简化编号的层级。 编号方案如下 第一个消息不编号因此msg1是未编号的。 使用合法编号方案来表示后续消息的顺序和嵌套其中嵌套的消息要使用附加数字在外部消息编号后前面添加引入消息编号来表示嵌套。如“1: msg2→1.1: msg3”是一条调用路径“2: msg4→2.1: msg5→2.2: msg6”是另外一条调用路径。 有条件的消息 可以在顺序编号后使用带有方括号的条件子句来表示有条件的消息 互斥的有条件路径1a和1b为互斥的消息test表达式为真时执行1a为假时执行1b。我们在编号之后添加字母表示互斥的分支路径 循环消息
当给集合的每个成员发送循环消息时实体要表示为集合形式如items[i]商品列表消息用“*”号表示循环发送。 异步和同步 与时序图一样协作图也使用刺形箭头表示异步调用使用实心箭头表示同步调用 交互图与类图的关系 模型的变化操作契约 操作契约采用前置条件和后置条件的形式描述领域模型中对象的详细变化作为用例的执行结果。 操作契约可以视为用例的一部分因为它对用例的执行效果提供了更详细的分析。 操作契约分为以下几个部分。 操作操作的名称和参数。 交叉引用发生此操作的用例一般引用编号。 前置条件执行操作之前对系统或领域模型对象状态的重要假设。如果这些假设比较重要需要告诉读者。 后置条件最重要的部分即完成操作后领域模型的状态 契约添加商品到购物车 操作addItemsToCart (productID:itemsID, quantity:int) 交叉引用用例——添加商品到购物车 前置条件登录用户在商品详情页。 后置条件 创建了新的商品条目。 如果是第一个商品条目创建购物车。 购物车关联了新的商品条目。 购物车新的商品条目的“数量”设为quantity。 购物车与账号相关联。 商品条目中的商品与商品库关联。 商品条目中的“库存”设为商品库存值。 操作契约的作用不仅限于提供模型的状态检查和支撑用例测试还适用于模型设计阶段 因为它详细描述了领域模型的状态变化而无须考虑模型的实现 后置条件可以分为以下三种类型 ❑ 创建或删除实例。 ❑ 属性值的变化。 ❑ 建立或消除关联UML图中的链接 操作契约准则 准则1促进设计而不是妥协 准则2只为复杂用例撰写操作契约 准则3遵循步骤编写 遵循以下步骤 1从用例中确定操作。 2如果操作复杂设计到的领域模型很多或状态变化点很多可为其构造操作契约。 3使用以下几种类别描述后置条件创建和删除实例修改属性值形成和消除关联。 4在交叉引用中关联相关用例。