1、1l7.1 系统需求获取l7.1.1 案例背景介绍案例背景介绍l某学校的图书馆目前仍然在使用传统卡片管理某学校的图书馆目前仍然在使用传统卡片管理着所有的图书和读者信息,但随着图书和读者着所有的图书和读者信息,但随着图书和读者数量的不断增加,图书馆工作人员的工作量也数量的不断增加,图书馆工作人员的工作量也越来越大,而且还经常出现管理混乱的情况,越来越大,而且还经常出现管理混乱的情况,比如书明明就放在馆中,但是却查找不到等等比如书明明就放在馆中,但是却查找不到等等问题。为了提高工作效率和管理水平,学校的问题。为了提高工作效率和管理水平,学校的领导经研究决定,在采用开架借阅的基础上利领导经研究决定,
2、在采用开架借阅的基础上利用现代技术手段对图书馆进行管理。为此,学用现代技术手段对图书馆进行管理。为此,学校委托软件学院组织计算机教师开发一套图书校委托软件学院组织计算机教师开发一套图书馆信息管理系统。馆信息管理系统。2l7.1.2 需求获取需求获取l1.用户访谈l2.初始需求文档的形成3l7.2.1 高层用例识别高层用例识别l1.识别参与者识别参与者l借阅者借阅者,图书管理员图书管理员 l2.识别用例识别用例l借书借书,还书还书,预定书刊预定书刊,取消预定取消预定,l维护借阅者信息维护借阅者信息,维护书刊信息维护书刊信息l维护物理书刊信息维护物理书刊信息,登录登录,l3识别角色及用例间的关系识
3、别角色及用例间的关系456l一般先使用专门的文档页对用例进行说一般先使用专门的文档页对用例进行说明明;l1 1需求理解需求理解l2 2事件描述事件描述l3 3活动框图活动框图7l7.3.1确定对象确定对象(1)借阅者(借阅者(Borrower)(2)书刊(书刊(Title)(3)物理书刊(物理书刊(Book)(4)借阅记录(借阅记录(Loan)(5)预定记录(预定记录(Reservaion)另外,还可以抽象出代表持久性的父类:类另外,还可以抽象出代表持久性的父类:类OID和类和类Persistent。它们实现了与数据库有关的表。它们实现了与数据库有关的表示和操作。示和操作。(6)类类Persi
4、stent (7)类类OID87.3.2描述对象的属性描述对象的属性7.3.3描述对象之间的关联描述对象之间的关联(1)Title 类与类与Borrower Information类的关联类的关联(2)Title类与类与Book类的关联类的关联(3)Title类与类与Book Title、Magazine Title类的关类的关联联(4)Book类与类与Borrower Information类的关联类的关联910l标题和书目的关联是一种特殊的关联形式:聚合关系。两者是包容的关系,是一种强关联。11l图书和杂志都只是标题的一种,它们现在唯一的区图书和杂志都只是标题的一种,它们现在唯一的区别只是
5、对出借时间的限制不同。显而易见,别只是对出借时间的限制不同。显而易见,Title 类类与与Book Title、Magazine Title类之间的关联也是一类之间的关联也是一种特殊的关联形式:继承关系。种特殊的关联形式:继承关系。12l每个借书者可以借阅多个书目,每个书目同时只能每个借书者可以借阅多个书目,每个书目同时只能被一个借书者借阅。被一个借书者借阅。lBook类与类与Borrower Information类的关联是一般性类的关联是一般性关联关联 13建立初始用例模型,只是完成了系统需求分析的建立初始用例模型,只是完成了系统需求分析的一部分。要实际建立系统,针对每个系统用例一部分。要
6、实际建立系统,针对每个系统用例还需要更具体的细节,即还需要更具体的细节,即用例的详细流程用例的详细流程。每个用例是一组场景每个用例是一组场景(Scenario)(Scenario)的集合,而每个的集合,而每个场景又是一个步骤序列。这些步骤在用例模型场景又是一个步骤序列。这些步骤在用例模型中并没有表现出来。如下图中并没有表现出来。如下图1415解决办法解决办法:1 1 文本框图文本框图:一般使用专门的文档页对用例进行说明,在文一般使用专门的文档页对用例进行说明,在文档中主要描述下列内容:档中主要描述下列内容:发起用例的参与者;发起用例的参与者;用例的前置条件;用例的前置条件;场景中的详细步骤;场
7、景中的详细步骤;场景完成后的后置条件;场景完成后的后置条件;用例的参与者。用例的参与者。还可以列出场景的假设条件和简短的场景描述还可以列出场景的假设条件和简短的场景描述2 2 活动框图活动框图3 3 举例说明举例说明:如如“读者借书读者借书”用例的两种描述用例的两种描述16第二次会议议题第二次会议议题:导出和分析每个用例。导出和分析每个用例。与会人员与会人员:包括系统分析员、一名图书馆管理员和一名包括系统分析员、一名图书馆管理员和一名 读者。读者。目的目的:详细了解系统每一个功能的操作流程和步骤详细了解系统每一个功能的操作流程和步骤图书馆管理员:图书馆管理员:已注册的用户。根据用户名和要借的书
8、名查找图已注册的用户。根据用户名和要借的书名查找图书。书。如果如果找不到,则没有这本书;或者我查看一下该书的找不到,则没有这本书;或者我查看一下该书的借阅记录,看其所有书目是否全部借出,如果没有全借阅记录,看其所有书目是否全部借出,如果没有全部借出,则取一本给借书者。部借出,则取一本给借书者。如果如果书全部借出,这时候应该询问借书者是否预书全部借出,这时候应该询问借书者是否预订该书在书借出后,要对图书和借书者分别进行登记订该书在书借出后,要对图书和借书者分别进行登记。另外,如果预定者借了这本书,还要取消预订。另外,如果预定者借了这本书,还要取消预订。17根据上述会谈记录,我们描述根据上述会谈记
9、录,我们描述“借书借书”用例如下。用例如下。用例叙述:管理员将图书借给借书者并进行登记。用例叙述:管理员将图书借给借书者并进行登记。1)1)假设条件:借书者信息已经存储于系统中,即不假设条件:借书者信息已经存储于系统中,即不是一个新用户。是一个新用户。2)2)前置条件;借书者将姓名和要借的书名告诉管理前置条件;借书者将姓名和要借的书名告诉管理员。员。3)3)后置条件:借书者拿到书,借阅信息被登记。后置条件:借书者拿到书,借阅信息被登记。4)4)参与者:参与者:借书者。借书者。5)5)详细步骤见下页详细步骤见下页18步骤序列:步骤序列:主事件流:主事件流:(1)(1)借书者提出借书申请,用例开始
10、。借书者提出借书申请,用例开始。(2)(2)管理员选择管理员选择“借书借书”选项。选项。(3)(3)查找选择该标题查找选择该标题AlAl:没有这个标题:没有这个标题(4)(4)选择该标题下的有效书目选择该标题下的有效书目A2A2:无有效书目:无有效书目(5)(5)查找选择借书者查找选择借书者A3A3:找不到借书者信息:找不到借书者信息(6)(6)图书馆将书借出图书馆将书借出(7)(7)登记一个新的借阅登记一个新的借阅A4A4:借阅者有预订:借阅者有预订(8)(8)用例结束用例结束19其他事件流:其他事件流:AlAl:没有这个标题:没有这个标题(1)(1)系统显示无标题提示信息系统显示无标题提示
11、信息(2)(2)返回主事件流第返回主事件流第(3)(3)步步A2A2:无有效书目:无有效书目(1)(1)系统显示无有效书目提示信息系统显示无有效书目提示信息 (2)(2)返回主事件流第返回主事件流第(2)(2)步步 A3A3:找不到借书者信息:找不到借书者信息 (1)(1)系统显示该借书者为无效用户系统显示该借书者为无效用户 (2)(2)返回主事件流第返回主事件流第(5)(5)步步 A4A4:借阅者有预订:借阅者有预订 (1)(1)清除预订信息清除预订信息 (2)(2)返回主事件流第返回主事件流第(8)(8)步步 20事件流需要的详细程度:事件流需要的详细程度:建立事件流时的主要问题是事件流需
12、要的详细程度建立事件流时的主要问题是事件流需要的详细程度要确定需要的详细程度,就考虑文档的阅读者。要确定需要的详细程度,就考虑文档的阅读者。事件流的用户有以下三类:事件流的用户有以下三类:用户通过审查这个文档以确认其准确反映用户的用户通过审查这个文档以确认其准确反映用户的期望期望 系统设计员用其创建系统设计和最终建立系统。系统设计员用其创建系统设计和最终建立系统。测试人员以事件流为依据创建测试脚本。测试人员以事件流为依据创建测试脚本。21活动框图是另一种建模事件流的方式活动框图是另一种建模事件流的方式,比文本方式直观比文本方式直观22l类框图表示的是类和对象之间的静态关系,类框图表示的是类和对
13、象之间的静态关系,l而在系统运行过程中,组成系统的对象是相互而在系统运行过程中,组成系统的对象是相互配合,协同完成每一个用例的功能的。配合,协同完成每一个用例的功能的。l当系统与用户(也可能是其他系统)交互或系当系统与用户(也可能是其他系统)交互或系统内部各对象交互的时候,组成系统的对象为统内部各对象交互的时候,组成系统的对象为了适应交互要经历必要的变化。了适应交互要经历必要的变化。l因此因此,需在模型中反映对象在系统中的变化需在模型中反映对象在系统中的变化23l事件流和活动图对每个用例情景进行了事件流和活动图对每个用例情景进行了描述,了解了用例的详细流程。如下描述,了解了用例的详细流程。如下
14、:24l不足不足:无法显式地表示出每个用例涉及到哪些无法显式地表示出每个用例涉及到哪些对象,更不能表示出哪个对象执行哪个活动以对象,更不能表示出哪个对象执行哪个活动以及对象之间的消息工作方式。及对象之间的消息工作方式。l改进改进:可以为每个活动标记上负责的对象,但可以为每个活动标记上负责的对象,但那不会使对象之间的交互变得清晰。那不会使对象之间的交互变得清晰。l更好的方法:更好的方法:在为一个过程建模的时期,先使在为一个过程建模的时期,先使用事件流和活动图帮助你获得对整个过程的理用事件流和活动图帮助你获得对整个过程的理解,然后用交互图可以将活动分配到各个类中。解,然后用交互图可以将活动分配到各
15、个类中。25通常创建交互图的步骤如下:通常创建交互图的步骤如下:1)从事件流中寻找角色。)从事件流中寻找角色。2)从事件流中寻找对象。)从事件流中寻找对象。3)把活动图中的每个活动分配到对象中。)把活动图中的每个活动分配到对象中。4)将对象的服务转换为消息,并查找每个)将对象的服务转换为消息,并查找每个消息的发送对象和接收对象。消息的发送对象和接收对象。5)根据事件流中消息发送的顺序将其中加)根据事件流中消息发送的顺序将其中加入框图中。入框图中。26l下面我们还是以下面我们还是以“借书借书”用例为例,介用例为例,介绍如何使用交互图对用例进行分析,为绍如何使用交互图对用例进行分析,为用例中对象之
16、间的交互建立模型。用例中对象之间的交互建立模型。以下介绍以下介绍:l窗体类和业务类的依赖关系窗体类和业务类的依赖关系l借书借书(无预定无预定)的步骤序列的步骤序列,时序图时序图,协作图协作图27l首先首先,交互图表现的是角色与系统以及系统内交互图表现的是角色与系统以及系统内部对象之间的交互,角色与系统的交互是通过部对象之间的交互,角色与系统的交互是通过界面元素完成的,我们必须提供窗体和对话框界面元素完成的,我们必须提供窗体和对话框作为人机交互的界面。作为人机交互的界面。l因此在进行用例动态分析之前,还需要考虑系因此在进行用例动态分析之前,还需要考虑系统中必需的界面对象。统中必需的界面对象。l借
17、书窗体(借书窗体(Lend Window)l还书窗体(还书窗体(Return Window)l预订窗体(预订窗体(Reservation Window)l系统维护窗体(系统维护窗体(Maintenance Window)28l我们将以上这些对象与原来的业务对象分为我们将以上这些对象与原来的业务对象分为两组:所有的窗体类组织在一起放在两组:所有的窗体类组织在一起放在GUI Package包中(界面包),所有的业务类组包中(界面包),所有的业务类组织在一起放在织在一起放在Business Package包中(业务包中(业务包)。包)。界面包和业务包的依赖关系如下界面包和业务包的依赖关系如下:29l
18、该用例由图书馆管理员启动,涉及到的类有该用例由图书馆管理员启动,涉及到的类有Lend Window、Title、Borrower Information、Loan、Book。l用例的步骤序列(事件流)如下:用例的步骤序列(事件流)如下:l1)图书馆管理员打开借书窗体界面。图书馆管理员打开借书窗体界面。l2)输入标题信息,查找该标题。输入标题信息,查找该标题。l3)查找该标题下的有效书目。查找该标题下的有效书目。l4)输入借书者信息,查找该借书者。输入借书者信息,查找该借书者。l5)创建一个新的借阅。创建一个新的借阅。301)图书馆管理员角色向图书馆管理员角色向Lend Window对象发出对象
19、发出查找标题、查找书目和查找借书者的请求,查找标题、查找书目和查找借书者的请求,2)由由Lend Window对象分别向对象分别向Title、Book、Borrower Information和和Loan对象发送查找、对象发送查找、创建等消息,创建等消息,3)Title等对象收到消息后执行相应的操作。等对象收到消息后执行相应的操作。时序图可以表示用例的一个情景,也可以使用脚时序图可以表示用例的一个情景,也可以使用脚本在框图中加入一些条件逻辑,从而综合表本在框图中加入一些条件逻辑,从而综合表示用例的多个情景。示用例的多个情景。31book32 在协作图中更容易地看出对象之间的通信在协作图中更容易
20、地看出对象之间的通信 book33l对象状态分析的另一个工具是状态图。与交互对象状态分析的另一个工具是状态图。与交互图一样,状态图也可以帮助分析员、设计员和图一样,状态图也可以帮助分析员、设计员和开发人员理解系统中对象的行为,开发人员理解系统中对象的行为,l交互图通过一个用例的完整事件流程分析多个交互图通过一个用例的完整事件流程分析多个对象之间的交互来了解每个对象的行为,对象之间的交互来了解每个对象的行为,l状态图只是针对单个对象建模,通过分析单个状态图只是针对单个对象建模,通过分析单个对象的内部状态转换来了解一个对象的行为。对象的内部状态转换来了解一个对象的行为。34如果一个类有一些重要的状
21、态行为,则它具有多种如果一个类有一些重要的状态行为,则它具有多种状态,据此可以创建状态框图。状态,据此可以创建状态框图。要确定一个类是否有重要的状态行为,可以通过以要确定一个类是否有重要的状态行为,可以通过以下两种方法:下两种方法:l l检查类的属性:考虑一个类的实例在属性值不同检查类的属性:考虑一个类的实例在属性值不同时如何表现,因为如果对象的行为表现不同,则时如何表现,因为如果对象的行为表现不同,则其状态也不同。其状态也不同。l l检查类的关联:看看关联重数中带检查类的关联:看看关联重数中带0的关联,的关联,0表表示这个关联是可选的。关联存在和不存在时类的示这个关联是可选的。关联存在和不存
22、在时类的实例是否表现相同?如果不同,则可能有多种状实例是否表现相同?如果不同,则可能有多种状态。态。35lTitle对象有两种状态:预订状态和非预订状对象有两种状态:预订状态和非预订状态。态。TitleTitle的状态图的状态图 如下如下:36v在在Title状态图中,显示了标题的不同状态以及状态图中,显示了标题的不同状态以及状态之间的转换情况。状态之间的转换情况。v一个标题对象的初始状态为非预订状态。一个标题对象的初始状态为非预订状态。v在非预订状态下,如果借书者预订标题的话,在非预订状态下,如果借书者预订标题的话,则标题转入预订状态。预订标题是一个事件,则标题转入预订状态。预订标题是一个事
23、件,事件导致标题从一个状态过渡到另一个状态。事件导致标题从一个状态过渡到另一个状态。v在预订状态下,如果发生标题预订事件,则标在预订状态下,如果发生标题预订事件,则标题的状态不变;如果发生取消预订事件,这时题的状态不变;如果发生取消预订事件,这时候状态的转换情况则要视预订数目而定候状态的转换情况则要视预订数目而定(预订预订数目是否为数目是否为1是状态转换的保证条件是状态转换的保证条件)。v同时,在事件发生的同时,将导致相应的活动,同时,在事件发生的同时,将导致相应的活动,预订标题会将标题的预订数目加预订标题会将标题的预订数目加1,而取消标,而取消标题预订则将标题的预订数目减题预订则将标题的预订
24、数目减1。v只有开始状态,而没有停止状态。只有开始状态,而没有停止状态。37lBook类状态图类状态图l原则上不需要对每个类创建状态图,一原则上不需要对每个类创建状态图,一般只用于复杂的类。般只用于复杂的类。l状态图仅用于文档,而不用于生成代码。状态图仅用于文档,而不用于生成代码。38l对象是由描述其属性的数据以及可以对该数据对象是由描述其属性的数据以及可以对该数据施加的操作(即服务)封装在一起所构成的独施加的操作(即服务)封装在一起所构成的独立单元。立单元。l标志类的操作时,要特别注意以下几种类:标志类的操作时,要特别注意以下几种类:ll l 注意只有一个或很少操作的类。注意只有一个或很少操
25、作的类。ll l 注意没有操作的类。注意没有操作的类。ll l 注意有太多操作的类。注意有太多操作的类。另外,要注意应该尽量利用继承机制减少冗余的另外,要注意应该尽量利用继承机制减少冗余的操作。操作。39l对象的操作与对象在行为上的义务密切相关,对象的操作与对象在行为上的义务密切相关,基本上可以分为两类:基本上可以分为两类:“知道知道”型操作与型操作与“做做”型操作。型操作。l一个对象的一个对象的“做做”(doing)型操作包括:)型操作包括:ll l 自己完成某项任务。自己完成某项任务。ll l 发起其他对象执行动作。发起其他对象执行动作。ll l 控制和协调其他对象内的动作。控制和协调其他
26、对象内的动作。l一个对象的一个对象的“知道知道”(knowing)型操作包括:)型操作包括:ll l 知道自己的私有的、封装了的数据。知道自己的私有的、封装了的数据。ll l 知道与自己相关联的对象信息。知道与自己相关联的对象信息。ll l 知道自己派生出来或者计算出来的事物。知道自己派生出来或者计算出来的事物。40从另外的角度,操作可以分为四种类型:从另外的角度,操作可以分为四种类型:ll l 实现者操作:实现业务功能的操作。这类操实现者操作:实现业务功能的操作。这类操作是其他类需要访问的操作,是类提供的对外作是其他类需要访问的操作,是类提供的对外接口。接口。ll l 管理者操作:管理对象的
27、创建与构造。例如,管理者操作:管理对象的创建与构造。例如,对象的构造函数和销毁函数就属于管理者操作。对象的构造函数和销毁函数就属于管理者操作。ll l 访问者操作:访问属性的操作。属性通常是访问者操作:访问属性的操作。属性通常是私有或保护的,其他类可能要浏览或修改类的私有或保护的,其他类可能要浏览或修改类的属性,这可以通过访问操作实现。属性,这可以通过访问操作实现。ll l 协助者操作:是帮助类完成对外服务所需的协助者操作:是帮助类完成对外服务所需的内部操作。内部操作。41l实现者操作对应于实现者操作对应于“做做”型操作,是系统的分析型操作,是系统的分析阶段我们所关心的内容。阶段我们所关心的内
28、容。l协助者操作是系统设计和实现阶段考虑的事情。协助者操作是系统设计和实现阶段考虑的事情。l管理者操作和访问者操作在生成代码时,一般可管理者操作和访问者操作在生成代码时,一般可以由系统自动创建。以由系统自动创建。l对象的对象的“做做”型操作可以通过下面几个途径获得:型操作可以通过下面几个途径获得:l l 需求文档需求文档.交互图消息交互图消息.状态图事件状态图事件42在使用工具对类的操作建模时,可以给出操作名称、在使用工具对类的操作建模时,可以给出操作名称、属性的类型、默认值以及对属性的描述信息。属性的类型、默认值以及对属性的描述信息。下面列出了类下面列出了类Book的主要操作:的主要操作:l
29、 l Create:创建一个新的:创建一个新的Book对象。对象。l l Destroy:删除一个:删除一个Book对象。对象。l l Find:查找:查找Book对象。对象。l l FindOnTitle:根据标题查找:根据标题查找Book对象。对象。43l系统的设计可以分为两个阶段:系统的设计可以分为两个阶段:l体系结构设计阶段:体系结构设计阶段:l详细设计阶段:详细设计阶段:44l7.5.1 系统总体设计系统总体设计:l一个典型的信息系统除了要实现业务功能之外,还必一个典型的信息系统除了要实现业务功能之外,还必须要实现与用户界面和持久化存储机制的连接。通常须要实现与用户界面和持久化存储机
30、制的连接。通常在体系结构的设计上具有若干个层次在体系结构的设计上具有若干个层次45l在一个面向对象的设计中,应用逻辑层通常可在一个面向对象的设计中,应用逻辑层通常可被分解成一些更细的层。这样的体系结构以软被分解成一些更细的层。这样的体系结构以软件类为基本组织结构。通常,应用逻辑层本身件类为基本组织结构。通常,应用逻辑层本身是由下列层组成的:是由下列层组成的:l 业务对象层业务对象层(Domain Object):代表那些能:代表那些能够满足应用需求的领域概念的对象。够满足应用需求的领域概念的对象。l服务对象层服务对象层(Service Object):提供支撑服务:提供支撑服务的非问题域中的对
31、象,例如系统和存储层的接的非问题域中的对象,例如系统和存储层的接口。口。46l采用多层结构的好处主要是使系统的逻采用多层结构的好处主要是使系统的逻辑结构更加清晰;各层之间相对独立,辑结构更加清晰;各层之间相对独立,只要保持接口不变,每一层的改变对其只要保持接口不变,每一层的改变对其他层都没有影响。他层都没有影响。l以更细的功能分解这个角度来观察体系以更细的功能分解这个角度来观察体系结构时,也许可以把结构中的每一层分结构时,也许可以把结构中的每一层分成更多的层,我们将这种体系结构统称成更多的层,我们将这种体系结构统称为多层体系结构为多层体系结构(multi-tiered)。47l 本案例的包本案
32、例的包(子系统子系统)具体划分如下:具体划分如下:l (1)User-Interface Package包包l (2)Business-objects Package包包l (3)Database Package包包l (4)Utility Package包包48系系统统体体系系结结构构设设计计框框图图 49l1.详细设计的一般原理详细设计的一般原理在对象的详细设计期间,主要完成以下工作:在对象的详细设计期间,主要完成以下工作:ll l 细化、填充类的属性和操作。细化、填充类的属性和操作。ll l 设计类操作的实现算法。设计类操作的实现算法。ll l 优化数据的访问路径。优化数据的访问路径。ll l 实现外部交互式的控制。实现外部交互式的控制。ll l 调整类结构以提高继承性。调整类结构以提高继承性。ll l 设计类之间的关联的实现方式。设计类之间的关联的实现方式。ll l 把类和关联封装成模块。把类和关联封装成模块。502.图书馆管理系统详细设计图书馆管理系统详细设计(1)数据存储(数据存储(Database Package包)包)(2)持久化机制持久化机制