课件
顺序图与用例的关系
- 在使用 UML 的过程中,顺序图往往是和用例建模绑定使用的,可以用用例图来表达单个情景实例的行为,也就是说每一个用例它的交互过程都对应一个顺序图。
- 顺序图能够很清楚的表达对象间如何协作,完成用例所描述的交互功能。
- 顺序图表示的是为完成用例而在系统边界输入输出的数据以及消息。
- 顺序图也可以推进到系统的内部,表示系统内部对象间的消息传递。因此它的常用做法是在用例建模期间,用顺序图来表示参与者和系统在系统边界发生的交互活动,随着设计活动的深入,我们有了系统内部的类的结构和对象之间的交互行为的设计之后,可以再用顺序图进一步丰富打开系统内部的对象之间的交互活动的展开
- 通过顺序图的建模,可以逐步的对之前的用例描述进行扩展、细化和查缺补漏。
- 顺序图能够贯穿在软件开发周期的不同的阶段,服务于不同粒度的建模、不同目标的建模。
- 分析阶段的顺序图并不包含系统的设计对象,也不关注系统消息的参数和它的类型,更关注的是消息本身的目的和消息的内容。
从用例中抽取顺序图
在获取到初步的用例描述之后,我们将很容易从中间提取顺序图的建模元素,比如在用例描述的主体就可以将它提取为参与交互的对象,这里包括参与者 Customer 和提供搜索支持的界面类 Search page,以及返回的结果 Search Results Page,以及在后台提供的服务的目录系统和结果封装的实体类。
在这个建模的过程中能够得到用例交互它的交互流程首先是从界面外边的 Customer 提交了搜索请求,搜索页面在对搜索请求进行简单的语法验证以后,将向后台的实体对象发出按作者搜索这一请求,按作者搜索这一请求之后建立一个搜索结果的实体,并将其返回给结果显示页面。当搜索出错的时候显示出错信息,这样一个过程通过在顺序图中的横向和竖向的建模元素布局,很清楚的看到各自的职责以及他们之间交互的次序。
顺序图建模意义
顺序图的建模意义在于:
- 通过顺序图来描述算法的逻辑,在抽象层次上能够逐步逼近软件的代码表示
- 高质量的顺序图是代码的抽象,因为我们无需描绘每一行代码的信息
- 顺序图是与编程语言无关的一种表示,可以通过不同的编程语言来实现对应的算法逻辑
- 通过绘制顺序图来描述高于编码抽象层次的业务逻辑,即无需编码的这样的内容也可以通过顺序图来表达出来
- 顺序图的绘制可以通过团队协作完成
- 由于顺序图能够在同一个页面上显示多个对象和类实例的行为,它加宽了我们建模的视野,可以同时描述多个对象的行为
顺序图建模风格
建模风格 1:把注意力集中于关键的交互
顺序图的建模过程中把主要的注意力集中在关键的交互上,把无关的或者是不重要的细节忽略掉
比如如果我们顺序图建模的主要目的是为了描述业务逻辑,就没必要包括对象和数据库之间的详细交互,可能只包括保存、删除这样的消息就足够了,甚至可以简单的假定持久化问题已经被妥善的处理而不用考虑持久性相关的细节的每一个操作。
建模风格 2:对于参数,优先考虑使用参数名而不是参数类型。
在顺序图的建模过程中,需要优先考虑使用的是参数的名字而不是参数的类型。
比如我们将消息格式定义为 addDeposit(amount, target) 要比 addDeposit(Currency, Account) 传递更为丰富的信息。因为有前者的定义我们知道要存款那么我们需要知道存款的数额和目标帐户,而后者我们知道 addDeposit 它带有一个现金类和一个帐户类的参数,它并不能传递足够的关于领域的业务的信息。
关于参数的类型最好是放到 UML 的类图中定义。
建模风格 3:不要对明显的返回值建模。
在顺序图建模的时候,不要对明显的返回值做建模添加返回消息,比如在这个图中,创建安全登录对象 SecurityLogon 这个行为会导致生成一个新的顾客对象,这个返回值是不明显的,而且需要返回新建的顾客 ID 号,因此需要对它进行建模给出一个返回消息,返回 theCustomer 的 ID,而向订单对象发送请求计算总数,它的返回值就是一个显而易见的返回消息,就无需再对它进行建模了。返回消息 return Message 实际上是同步消息的一个部分,异步消息的返回值是另一个异步消息。
顺序图常见问题分析
顺序图中时间约束的表示
在顺序图中由于它表达的是系统的动态交互行为,因此往往会涉及到时间约束的表示,这里时间约束是通过定义约束表达式,并把它放在对应的消息之间来表达。
比如在这个图中,想表示的是消息 A 和消息 B 二者之间发生的时间间隔不能超过 2 秒。
控制焦点嵌套
控制焦点的建模是一个可选项,也就是说我们可以不画出对象的控制焦点和激活期,但是通过画出控制焦点可以更明确的说明一个消息的开始和结束位置。
比如在图中,对象 1 调用了对象 2 的操作 1,然后对象 2 在执行操作 1 期间又返过来调用了对象 1 的操作 2 这个方法,通过增加控制焦点的嵌套机制就可以更精确的说明消息的开始和结束位置,仿佛是一个消息调用的压占机制。
激话期(activation):表示对象执行一个动作的期间(直接操作或者通过下级操作),也即对象激活的时间段。控制焦点和激话期是同一个概念。
顺序图中递归的表示
顺序图中递归的消息调用可以采用嵌套的控制焦点来表示。
这里就是一个单个对象对自身操作的递归调用,比如首先由对象 C1 调用了 C2 的 Oper 这个方法,然后 Oper2 在执行 Oper 的过程中又调用了自己的 Opre 方法,这样我们就可以采用嵌套的控制焦点的方式来表达。
对多个对象之间相互递归调用也采用类以的方法,上图中对象 C1 调用了 C2 的 Oper1 方法,C2 又在执行 Opre1 的过程中调用了 C3 的 Opre2 方法,C3 在执行 Opre2 的过程中又调用了 C2 的 Opre1 方法,其实对每个消息调用来说它的拥有者都是消息的接收方,也就是说 C2 要对外提供 Oper1 服务,C3 对外提供 Oper2 服务,C2 在提供 Oper2 的调用的过程中又被返过来引用了自身的 Oper1 服务。
顺序图的作用
- 帮助分析人员对照检查用例中描述需求,是否己经落实给具体对象去实现
- 提醒分析人员去补充遺漏的对象类或操作
- 帮助分析人员识别哪些对象是主动对象,哪些对象是被动对象
- 通过对一个特定的对象群体的动态行为建模,能更加深入地理解对象之间的交互