用例图中的泛化技术
1 用例图的四个组件:系统、参与者、用例、关系
2 用例可以放到包中,包名::用例名字
3 泛化可以被分成多个子用例
4 泛化可以分层
如果已经泛化了用例,并且一个参与者使用了一个已泛化用例,那么那个参与者就不应该是使用泛化用例的父用例的参与者。例如,参与者使用了1.1.1,就不应该让参与者使用1.1或1。
5 用例的包含关系
这个例子说明,教师必须记录和更新成绩。同时,这两个用例都包含了一项save grades的功能。每当教师更新成绩和记录成绩时,成绩总会被保存下来。
6 用例的扩展关系
这个例子中,save grades由notify guardians用例扩展。当老师记录和修改成绩时,成绩被保存,而“有时”管理员会被提醒。箭头为什么从notify到save?因为notify扩展了save,这个时候notify是添加到save中的一项功能。而save没有把功能添加到notify中。
如果每次成绩保存后都要提醒管理员,那么就要用包含关系。例如:
了解了扩展,我们知道管理员只是在“有时”会被提醒,那么什么时候提醒呢?我们用扩展点(Extension Points)来记录提醒的条件,比如在成绩不及格时才提醒:
7 描述用例
用例细节的描述没有一定的格式,你应该学习并使自己的技术适用于用例细节的有效记录。可以用简单的序列描述,比如记录成绩(Record Grades)的用例描述:
1) 教师确定出要记录成绩的学生
2) 系统要确保学生在数据库中
3) 教师要说明记录哪项作业的成绩
4) 系统开始执行数据库事务处理
5) 系统将布置给学生的作业添加到数据库中
6) 教师输入学生作业的成绩
7) 系统确认输入成绩以确保成绩处于有效范围之内
8) 系统记录作业成绩
9) 系统结束事务处理
10) 系统提示教师,成绩已被记录。
在上面的描述中,我们可以发现,每一项活动都是以“教师”或者“系统”(他们是与用例交互的对象)开头,这一点非常重要,这样就可以知道在特定的时间谁拥有程序的控制权。
8 创建用例图的5项任务
1) 找出系统中的参与者和用例。
2) 区分用例优先次序
3) 细化每一个用例
4) 建立用例模型结构
5) 建立用户界面原型