阅读以下关于系统分析与设计的叙述,在答题纸上回答问题1至问题3。
【说明】
某高校拟开发一套图书馆管理系统,在系统分析阶段,系统分析师整理的核心业务流程与需求如下:
系统为每个读者建立一个账户,并给读者发放读者证(包含读者证号、读者姓名),账户中存储读者的个人信息、借阅信息以及预订信息等,持有读者证可以借阅图书、返还图书、查询图书信息、预订图书、取消预订等。
在借阅图书时,需要输入读者所借阅的图书名、ISBN 号,然后输入读者的读者证号,完成后提交系统,以进行读者验证。如果读者有效,借阅请求被接受,系统查询读者所借阅的图书是否存在,若存在,则读者可借出图书,系统记录借阅记录;如果读者所借阅的图书已被借出,读者还可预订该图书。读者如期还书后,系统清除借阅记录,否则需缴纳罚金,读者还可以选择续借图书。
同时,以上部分操作还需要系统管理员和图书管理员参与。
【问题1】(6分)
采用面向对象方法进行软件系统分析与设计时,一项重要的工作是进行类的分析与设计。请用200字以内的文字说明分析类图与设计类图的差异。
【问题2】(11分)
设计类图的首要工作是进行类的识别与分类,该工作可分为两个阶段:首先,采用识别与筛选法,对需求分析文档进行分析,保留系统的重要概念与属性,删除不正确或冗余的内容;其次,将识别出来的类按照边界类、实体类和控制类等三种类型进行分类。请用200字以内的文字对边界类、实体类和控制类的作用进行简要解释,并对下面给出的候选项进行识别与筛选,将合适的候选项编号填入表2-1中的(1)~(3)空白处,完成类的识别与分类工作。
候选项:
a)系统管理员 b)图书管理员 c)读者 d)读者证 e)账户
f)图书 g)借阅 h)归还 i)预订 j)罚金
k)续借 l)借阅记录
【问题3】(8分)
根据类之间的相关性特点,可以将类之间的关系分为组合(composition)、继承(inheritance)、关联(association)、聚合(aggregation) 和依赖(dependency)等5种,请用300字以内的文字分别对这5种关系的内涵进行叙述,并从封装性、动态组合和创建对象的方便性三个方面对组合和继承关系的优缺点进行比较。
【问题1】(6分)
(1)两者产生的阶段不同:分析类图在需求分析阶段产生,设计类图在系统设计阶段产生。
(2)两者的表达重点不同:分析类图用于表达领域(问题域)的概念,设计类图重点描述类与类之间的接口关系。
(3)两者的详细程度不同:分析类图主要是从业务领域获取信息的,在描述上更多使用了业务领域的语言和词汇,不关心类的属性和方法的细节。设计类图是从编程实现角度设计类图,通常是在分析类图的基础上进行细化和改进,更多的是考虑类编码的实现,需要包括类的名称、类属性的可见性、类属性的名称、类属性的数据类型,还要包括类方法的返回值、方法的英文名称和方法的传入参数等细节信息。
【问题2】(11分)
边界类主要用于描述外部参与者与系统之间的交互。边界类是一种用于对系统外部环境与其内部运作之间的交互进行建模的类。这种交互包括转换事件,并记录系统表示方式(例如接口)中的变更。
实体类主要是作为数据管理和业务逻辑处理层面上存在的类。实体类的主要职责是存储和管理系统内部的信息,它也可以有行为,甚至很复杂的行为,但这些行为必须与它所代表的实体对象密切相关。
控制类用于描述一个用例所具有的事件流控制行为,控制一个用例中的事件顺序。控制类是控制其他类工作的类。每个用例通常有一个控制类,控制用例中的事件顺序,控制类也可以在多个用例间共用。其他类通常并不向控制类发送消息,而是由控制类发出消息。
(1) j)罚金、 I)借阅记录
(2)a)系统管理员、 b)图书管理员、c)读者、 f)图书
注:c)可以替换为d)或e),不得多选
(3)g)借阅 h)归还 i)预订 k)续借
【问题3】(8分)
组合(composition):是整体与部分的关系,但部分不能离开整体而单独存在。
继承(inheritance):表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。
关联(association):是一种拥有的关系,它使一个类知道另一个类的属性和方法。
聚合(aggregation):是整体与部分的关系,且部分可以离开整体而单独存在。
依赖(dependency):是一种使用的关系,即一个类的实现需要另一个类的协助。
组合和继承关系的优缺点:
(1)从封装性方面看,组合关系不破坏封装性,整体类与局部类之间松耦合,彼此互相独立;继承关系破坏封装性,子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性。
(2)从动态组合方面看,组合关系支持动态组合,在运行时整体对象可以选择不同的局部对象;继承关系不支持动态继承,在运行时,子类无法选择不同的父类。
(3)从创建对象的方便性方面看,组合关系在创建整体类的对象时,需要创建所有局部类对象;继承关系在创建子类对象时,无须单独创建父类的对象。
常见的类关系包括:
(1)关联关系。关联提供了不同类的对象之间的结构关系,它在一段时间内将多个类的实例连接在一起。关联体现的是对象实例之间的关系,而不表示两个类之间的关系。其余的关系涉及类元自身的描述,而不是它们的实例。
(2)依赖关系。两个类A和B,如果B的变化可能会引起A的变化,则称类A依赖于类B。依赖可以由各种原因引起,例如,一个类向另一个类发送消息、一个类是另一个类的数据成员、一个类是另一个类的某个操作参数等。
(3)泛化关系。泛化关系描述了一般事物与该事物中的特殊种类之间的关系,也就是父类与子类之间的关系。继承关系是泛化关系的反关系,也就是说,子类继承了父类,而父类则是子类的泛化。
(4)继承关系。本质上就是泛化关系。继承是在某个类的层次关联中不同的类共享属性和方法的一种机制。父类与子类的关系是一般与特殊的关系,一个父类可以有多个子类,这些子类都是父类的特例。
(5)聚合关系。表示类之间的整体与部分的关系,其含义是“部分”可能同时属于多个“整体”,“部分”与“整体”的生命周期可以不相同。例如,汽车和车轮就是聚合关系,车子坏了,车轮还可以用;车轮坏了,可以再换一个。
(6)组合关系。表示类之间的整体与部分的关系。与聚合关系的区别在于,组合关系中的“部分”只能属于一个“整体”,“部分”与“整体”的生命周期相同,“部分”随着“整体”的创建而创建,也随着“整体”的消亡而消亡。例如,一个公司包含多个部门,它们之间的关系就是组合关系。公司一旦倒闭,也就无所谓部门了。
(7)实现关系。实现关系将说明和实现联系起来。接口是对行为而非实现的说明,而类中则包含了实现的结构。一个或多个类可以实现一个接口,而每个类分别实现接口中的操作。