1、统一建模语言UML基础教程,主讲教师:单 红 老师福州大学 数学与计算机科学学院,第四讲: 软件系统的分析与设计之,UML建模的应用,系统分析和设计内容, UML建模的认知误区 UML建模的应用 简易教学管理系统的建模,UML建模的认知误区,无论你遵从的是重量级的方法,比如Enterprise Unified Process (EUP),还是轻量级的开发过程,如Extreme Programming (XP),建模在软件开发中都是不可或缺的。但不幸的是其中充斥着各种谬误与迷思,也就是UML建模的认知误区。,误区一:建模就等于是写文档,这可能是其中最具破坏力的一条,因为开发人员常以此为借口而完全
2、放弃建模。许多优秀的软件开发人员会说他们不想把时间浪费在这些“无用的“文档上,而是沉溺于编码之中,制造着一些脆弱而劣质的系统。另外,甚至许多尽责的开发人员现在也认为建模是一件讨厌且繁琐的事,而不愿去学习相应的建模技术。事实分析:“模型”与“文档”这二者在概念上是风马牛不相及的。你可以拥有一个不是文档的模型和不是模型的文档。一幅设计图就是一个模型。建模很象是作计划:作计划的价值在于计划编制的过程中,而非计划本身;价值体现在建模的活动中,而非模型本身。实际上,模型不是你系统中的一部分正式的文档,而且在完成它们的使命后可以被丢掉。你会发现值得保留的只有很少的模型,而且它一定是非常完美。,误区二:从开
3、始阶段你可以考虑到所有的一切,对这一点的迷信会导致在前期投入可观的时间去做所有的一切建模以期把所有一切都弄正确,试图在编码开始前就“冻结”所有的需求(见误区四),以致于患上“分析期麻痹症”。要等到模型非常完美之后才敢向前进。基于这个观点,项目组开发了大量的文档,而不是他们真正想要得到的开发满足需要的软件。事实分析:怎么才能走出这个误区呢?第一,在开始阶段,你必须认识到你不能考虑到所有的细枝末节。第二,认识到编码人员可能会对建模的工作不以为然,他们或许会说模型没有反应出真实的情况。第三,认识到不管你的最初所作的规格说明书有多好,但注定代码会很快地与之失去同步,即便是你自己建模自己编码。一个基本的
4、道理就是代码永远只会和代码保持一致。第四,认识到迭代法(小规模地建模,编一些代码,做一些测试,可能还会做一个小的工作版本)是软件开发的准则。它是现代重量级的软件开发过程(如EUP),以及轻量级(如XP)的基本原理。,误区三:建模意味着需要一个重量级的软件开发过程,很多人认为UML建模,只适合于大型复杂的应用系统,为此走入一个误区(经常与误区一有联系)的小型项目组常常是连建模都彻底地放弃了,应为这样的软件开发过程对他们来说太复杂太沉重而且没有必要。事实分析:你可以用一种轻灵的方式取而代之,比如:用简单的工具进行简单地建模的详细内容,而且你可以在它的使命完成后丢弃你的模型。同样也可以很基本的方式进
5、行建模(比如,从办公桌起来,来到白板前就开始构略草图)。只要你愿意,你就可以轻松地建模。,误区四:必须“冻结”需求,这个要求常常来自高级经理,他们确切地想知道他们从这个项目组能得到什么东西。这样的好处就是在开发周期的早期确定下需求,就可以确切地知道所要的是一个什么样的东西;缺点就是他们可能没有得到实际上所需要问题的全部(可能不全或夹杂错误的需求)。事实分析:变化总会发生的。由于优先级的变化和逐渐对系统有了更进一步的理解,都会引起需求的变化。与冻结需求相反,估计项目成功的风险,尽量去接受变化而且相应地采取行动,就象XP所建议的一样。,误区五:设计是不可更改的,如同误区四,要求每一个开发人员必须严
6、格遵从“设计“,导致开发人员为了符合“设计“而去做错误的事情或以错误的方式做正确的事情,或者是简单地忽略了设计,否定了所有设计可能带来的好处。冻结了设计,你就不能从项目进程所学到知识进一步获益。另外一个很大的趋势就是开发出大量的文档而不是实际的软件,使用面向文档的CASE工具而不是能给项目带来实际价值的面向应用的工具。事实分析:事实上,设计会经常根据开发人员和数据库管理员的反馈进行修改,因为他们是最接近实际应用的人,通常他们对技术环境的理解要好于建模者。我们必须的面对这样一个事实:人无完人,他们所作的工作也不可能尽善尽美。难道您真的想将一个并不完善的设计固定下来而不再去修改其中的错误吗?另外,
7、如果需求并没有被冻结,其实就意味着你不能冻结你的设计,因为任何需求的修改势必影响设计。正确的态度是:只要你的代码还在改动,设计就没完。,误区六:必须使用CASE工具,建模常常被认为是一项复杂的工作,因此需要大量地使用CASE工具辅助进行。事实分析:是的,建模可以是很复杂的。但你完全可以建立一个有效而简单的模型表述其中关键的信息,而不是将一些无关紧要的细节包括进来。比如,使用UML建立模型来表示类,只标识其有关的属性及一些关键的业务操作,尽量避免琐碎的实现细节。通过建模寻找解决问题的方法。,误区七:建模是在浪费时间,许多新手都这样认为,这主要是因为他们所接受的教育仅仅局限于如何编写代码,很少接触
8、过完整的系统开发流程。而且他们的经验也仅限于如何实现代码,就如初级程序员。他们放弃了提高效率和学习技能的机会,这些技能能够使他们很容易地适应不同的项目或组织。他们应该为此感到羞愧。事实分析:在大多数情况下,在开始编码之前画一个草图、开发一个粗率的原型或者制作一些索引卡片都能提高你的生产效率。高效的开发者在编码之前都要进行建模工作。另外,在项目组成员与项目负责人之间,建模是一种很好的沟通途径。你们在这个过程中熟悉业务、探讨问题,从而对所要的是一个什么样的东西可以得到更好的理解,涉及到该项目中的成员也可得到对该项目有一个充分理解。,误区八:数据模型(Data Model)就是一切,基于数据模型,许
9、多组织就蹒跚启动新的开发工作,也许正如你所在的组织。事实分析:数据模型是一个重要的,但不是最重要的建模,它最好是建立在另外的模型之上。这即使在象数据仓库这类面向数据的项目中也如此。如果没有很好的理解用户是如何使用该数据仓库的(在数据模型中没有表示出来),这些项目经常是以可悲的失败而告终。你可以使用的模型有很多用例图(use cases),活动图(activity diagrams),类图(class diagrams),组件图(component diagrams),以及用户界面流程图(user interface flow diagrams)等等。数据模型仅仅是其中的一种。每种模型都有其长处
10、和短处,应该正确地使用。,误区九:所有的开发人员都知道如何建模,现在面临照这样一个严重的问题:许多不是开发人员的人,包括高级经理和用户,不知道软件是如何建成的。其结果是他们不能够区分开熟练的开发者和一般的程序员,他们想当然地认为所有的开发人员都具备从头到尾开发整个系统的技能,并一直围绕这系统的开发过程。事实分析:这肯定是不正确的。建模的技能,只有当一个开发者通过学习它,并经过长期的实践才能够掌握。一些非常聪明的程序员常常相信自己无所不能,他们终究只能是程序员。正因为这样的狂妄自大,他们承当的一些任务是他们根本就没有相应的技能去完成的。软件开发是如此的复杂,单靠一个人是很难拥有所有的技能成功地进
11、行系统开发。开发者应该有自知之明,明白自己的弱点,学无止境。通过互相取长补短,建模者可从程序员身上学到一项技术的具体细节,程序员也可从建模者那里学到有价值的设计和体系结构的技术。合理的组织人员,有效的推动开发进程,是UML建模的关键。,建模十条原则,仅有数据模型,对于现代的软件开发是不够的。接收变化,并且允许你的模型能够随着时间进行改进。你不能冻结它们,然后就期待着成功。 模型并不一定就是文档,文档也不一定就是模型。大多数的模型,最终可能被丢弃。只有代码才能与代码保持真正的同步。一些简单的工具,比如白板,可以应付大多数得建模工作。 思考,然后再编码。你总能从别人身上学到东西。建模可以用一种轻盈
12、的方式进行。 设计,直到代码发布以后才算完成。,系统分析和设计内容, UML建模的认知误区 UML建模的应用 简易教学管理系统的建模,UML建模的应用,UML是一种建模语言,而不是方法,因为UML中没有过程的概念,而过程正是方法论的一个重要组成部分。UML本身独立于过程,这意味着用户在使用UML进行建模时,可以选用任何适合的过程进行。软件开发是个复杂的过程,每个阶段要彻底解决相关问题是不可能的,项目的开发必须要有回溯要求,即重复性开发。在面向对象过程中,需要重复多次进行分析、设计、开发、测试和部署的阶段。Rational统一过程(RUP,Rational Unified Process)就是一
13、种重复开发方法。,RUP开发周期,RUP开发周期经历四个阶段:开始、细化、构造和交接。开始阶段就是项目的开头,要收集信息和进行概念验证。开始阶段得出项目行或不行的决策。细化阶段要细化使用案例和作出结构性决策。细化包括分析、设计、编码和测试文件。构造阶段则进行大量的编码。交接阶段是系统向用户进行最后准备和部署的阶段。,RUP开发周期开始阶段,开始阶段:基本需求的说明建立商业用例(环境、预算、可行性)建立用例模型(财务系统,老师,查询课程信息,学生,选课注册,管理课程信息,管理老师信息,管理学生信息,管理员,管理开设课程,选课管理的用例,身份验证,include,include,财务系统,成绩统计
14、,学生,查询学生成绩,老师,查询课程成绩,学生成绩管理,管理员,成绩管理的Use Case图,3.2.3 系统分析: 绘制Use Case图1,Use Case图是系统的外部视图。在确定了角色和Use Case的基础上,绘制Use Case图,可视化角色与Use Case之间的联系,可以更清楚地了解系统的行为。绘制Use Case图从顶层抽象开始,然后逐步分解,精化Use Case图。直到能清晰地表达,满足系统分析与建立模型的需要为止。除了Use Case图之外,对每一个Use Case还应进行描述,编写Use Case的说明文档。,3.2.3 系统分析:绘制Use Case图2,下面对JXG
15、L的Use Case作简要的说明: 1. Use Case“查询课程信息”:学生、教师或教学管理员启动查询课程信息时,Use Case“查询课程信息”开始运行,根据输入的查询要求(查询主题或关键词),显示有关的课程信息。 2. Use Case“选课注册”:当学生登录进行选课注册时,Use Case“选课注册”就开始运行,它提供了选择课程、注册、修改注册、删除注册等功能。学生登录时,须输入正确的用户标识(ID)和口令,否则将被拒绝进入。,3.2.3 系统分析:绘制Use Case图3,下面对JXGL的Use Case作简要的说明: 3. Use Case“管理开设课程”:当教学管理员登录系统并
16、进行产生选课信息操作时,Use Case“管理开设课程”就开始运行,它首先检查用户标识(ID)和口令,验证用户的合法身份,然后从数据库中取出学生选课的注册数据,按照要求进行分类统计,生产选课注册报表。,3.2.3 系统分析:绘制Use Case图4,4. Use Case“管理学生信息”:当教学管理员登录系统并进行管理学生信息操作时,Use Case“管理学生信息”就开始运行,它首先检查用户标识(ID)和口令,验证用户的合法身份,然后对学生数据进行录入、修改、删除等操作。5. Use Case“管理老师信息”:当教学管理员登录系统并进行管理老师信息操作时,Use Case“管理老师信息”就开始
17、运行,它首先检查用户标识(ID)和口令,验证用户的合法身份,然后对教师数据进行录入、修改、删除等操作。,3.2.3 系统分析:绘制Use Case图5,6. Use Case“管理课程信息”:当教学管理员登录系统并进行管理课程信息操作时,Use Case“管理课程信息”就开始运行,它首先检查用户标识(ID)和口令,验证用户的合法身份,然后对课程数据进行录入、修改、删除等操作。 7. Use Case“查询学生成绩”:学生、教师启动查询学生成绩时,Use Case“查询学生成绩”就开始运行,它首先检查用户标识(ID)和口令,验证用户的合法身份,然后根据输入的查询要求(查询主题或关键词),显示有关
18、的学生成绩。,3.2.3 系统分析:绘制Use Case图6,8. Use Case“查询课程成绩”:教师启动查询课程成绩时,Use Case“查询课程成绩”就开始运行,它首先检查用户标识(ID)和口令,验证用户的合法身份,然后根据输入的查询要求(查询主题或关键词),显示有关的课程成绩。 9. Use Case“学生成绩管理”:当教学管理员登录系统并进行学生成绩管理操作时,Use Case“学生成绩管理”就开始运行,它首先检查用户标识(ID)和口令,验证用户的合法身份,然后对学生考试成绩数据进行录入、修改、删除等操作。,3.2.3 系统分析:绘制Use Case图7,10. Use Case“
19、成绩统计”:当教学管理员登录系统并进行成绩统计操作时,Use Case“成绩统计”就开始运行,它首先检查用户标识(ID)和口令,验证用户的合法身份,然后从数据库中取出学生的考试成绩数据,按照要求进行分类统计,生成成绩报表。 11. Use Case“身份验证”:当学生、教师和教学管理员登录系统时,Use Case“身份验证”就开始运行,它首先检查用户标识(ID)和口令,验证用户的合法身份。若身份验证成功,则允许用户进行相应的操作,否则提示用户输入正确的用户标识(ID)和口令。,3.2.3 系统分析:绘制主要交互图1,交互图,描述Use Case如何实现对象之间的交互。交互图用于建立系统的动态行
20、为模型。Use Case图是系统的外部视图,在分析和绘制Use Case图之后,对主要的Use Case做交互行为的分析是必要的。分析结果可以写成文档,绘制初步交互图,从而更清楚地理解Use Case的行为,以便进一步调整Use Case视图,确定问题的解决方案。在项目开发之初,分析问题领域时,绘制交互图只是为了印证领域分析的结果和Use Case的正确性,在以后对系统动态行为建模的过程中,还需要对交互图做深入的分析、细化和完善。,: 学生,: 注册表单,: 选课注册表单,: 开设课程,1: 登录,2: 验证,3: 查询,4: 选课,5: 增加,6: 删除,7: 提交,8: 存储,9: 退出,
21、选课注册顺序图,3.3 系统设计:静态结构模型,在完成了领域分析、建立JXGL系统的Use Case视图后,紧接着要建立系统的静态结构模型和动态行为模型。系统的静态结构模型主要由类图和对象图表达。发现对象类及其联系,确定它们的静态结构和动态行为,是面向对象分析的最基本的任务。,3.3.1 建立对象(类)图:定义对象(类)1,定义对象类 首先研究Use Case和交互剧本中发现对象类,确定类的属性和主要操作。对于JXGL系统可以抽象出以下一些主要的对象类。在人事信息处理方面有:“学生”类、“教师”类。在选课管理方面有:“课程”类、“开设课程”类、“学生登记”类、“课程登记”类、“选课统计”类等。
22、在成绩管理方面有:“学生成绩登记”类、“成绩统计”类。,3.3.1 建立对象(类)图:定义对象(类)2,1. 定义对象类 对于每一个类应当确定其职责、属性、主要操作以及其他性质说明。 对象类的属性可以通过检查类的定义、分析问题的需求和运用领域知识而确定。例如,对于课程,至少应该说明课程的名称、课程的性质和学时等信息。因此,对象类“课程”应有属性“课程名”、“描述”、“学时”等。属性“课程名”和“描述”的数据类型为字符串,属性“学时”的数据类型为整型数。,对象类的操作可以通过检查分析交互图确定,把交互图中对象之间的交互活动抽象成一个类的操作。,课程,课程信息管理表单,加入课程(数据结构,基础课,
23、3),课程,- 课程名,- 描述,- 学时,+ 加入课程(),从顺序图中抽象出类的操作,建立对象(类)图:对象类及其主要属性主要操作1,“学生”类负责JXGL系统需要的角色“学生”的信息处理。属性有“姓名”、“年龄”、“性别”、“通信地址”、“联系电话”、“专业”、“班级”等,对这些信息的服务操作有查询、添加、修改、删除等。“教师”类负责JXGL系统需要的角色“教师”的信息处理。它的属性有“姓名”、“年龄”、“性别”、“通信地址”、“联系电话”、“职称”等,对这些信息的服务操作有查询、添加、修改、删除等。,建立对象(类)图:对象类及其主要属性主要操作2,“课程”类负责学校课程信息的处理,这些课
24、程是教学计划规定开设的全部课程,但是每一个学期实际开设的课程只是其中的一部分。“课程”类的属性有“课程”、“描述”、“学时”,操作有“加入课程”、“删除课程”等。,“开设课程”类负责新学期开设课程和选课信息的处理,并提供查询功能。它的属性有“授课日期”、“授课时间”、“地点”、“授课老师”、“注册学生数”等,它的操作有“加入选课学生”、“加入授课老师”、“学生数已满”等。“课程登记”类的属性有“学期”、“学生名”等,操作有“加入学生”、“打印”等。,建立对象(类)图:对象类及其主要属性主要操作3,“学生登记”类负责新学期学生的选课登记。当一个“学生”角色要求选课注册时,登记该学生所选的课程,并
25、打印所选修的课程清单。“学生登记”类的属性有“学期”、“课程名”等,操作有“加入课程”、“打印”等。,建立对象(类)图:对象类及其主要属性主要操作4,“课程登记”类负责新学期课程的选课的选课登记,它根据角色“教师”和“教学管理员”的要求,汇总学生的选课,对一个课程登记选修该课程的学生,并打印选修课程的学生清单。“课程登记”类的属性有“学期”、“学生名”等,操作有“加入学生”、“打印”等。,建立对象(类)图:对象类及其主要属性主要操作5,“选课统计”类负责学生选课信息的统计处理,它根据角色“教学管理员”的要求,按照学生或课程生成学生选课注册统计报表。它的属性有“学期”等,操作有“按学生统计”、“
26、按课程统计”、“打印”等。“学生成绩登记”类负责学生考试成绩处理,它根据角色“教学管理员”的要求,登记学生的考试成绩,并提供查询功能。它的属性有“学生名”、“学期”、“课程名”、“成绩”等,操作有“加入成绩”、“打印”等。,建立对象(类)图:对象类及其主要属性主要操作6,“成绩统计”类负责学生成绩的统计处理,按照学生或课程生成学生成绩统计报表。它的属性有“学期”、“课程名”、“成绩”等,它的操作有“按学生统计”、“按课程统计”、“打印”等。,建立对象(类)图:对象类及其主要属性主要操作7,除了一般类外还需要分析与定义系统的用户接口,这些接口常可以用对象类定义。对于JXGL系统可以有以下一些用户
27、接口类。,课程信息管理表单(from用户接口),开设课程表单(from用户接口),选课注册表单(from用户接口),注册表单(from用户接口),选课统计表单(from用户接口),查询课程表单(from用户接口),成绩信息管理表单(from用户接口),成绩统计表单(from用户接口),查询成绩表单(from用户表单),3.3.2 静态建模:定义用户接口类1,3.3.2 静态建模:定义用户接口2,接口“课程信息管理表单”为教学管理员提供课程信息管理的操作功能,包括课程的录入、修改、删除等。接口“查询课程表单”为学生、教师、教学管理员提供课程查询的功能操作。接口“查询成绩表单”为学生、教师、教学管
28、理员提供成绩查询操作功能。接口“选课注册表单”为学生提供学生选课注册的功能操作,包括所选课程的登记、修改、删除、查询等操作功能。,3.3.2 静态建模:定义用户接口3,接口“开设课程表单”为教学管理员提供开设课程信息管理的操作功能,包括开设课程的录入、修改、删除等。接口“选课统计表单”为教学管理员提供学生选课统计的操作功能。接口“成绩信息管理表单”为教学管理员提供学生成绩管理的操作功能,包括考试成绩的录入、修改、删除等。,3.3.2 静态建模:定义用户接口4,接口“成绩统计表单”为教学管理员提供学生成绩统计的操作功能。接口“注册表单”为学生、教师、教学管理员提供进入系统时的身份验证等操作功能。
29、,3.3.3 静态建模:定义类与类联系,在定义了对象类之后,需要进一步分析对象类之间的联系。JXGL系统的对象类之间的联系有多种类型,关联、聚合、泛化、依赖等都有。,选课管理对象类库,开设课程,1,成绩管理对象类图,人事信息管理对象图,3.3.4 数据库设计:建立数据库模型1,JXGL系统采用关系数据库系统存储和管理数据。在分析和设计系统的静态结构模型时需要进行数据分析和数据库设计。JXGL系统有4个方面的数据需要管理:人员数据(学生、教师)、课程数据、选课注册数据、学生成绩数据。经过分析,JXGL系统至少应有6个数据库表:学生表、教师表、课程表、开设课程表、选课表、任课表。,3.3.4 数据
30、库设计:建立数据库模型2,这些表的基本定义为:学生(学生号、姓名、出生日期、性别、籍贯、地址、电话、入学时间、专业、班级备注)教师(教师号、姓名、出生日期、性别、籍贯、地址、电话、职称、专长、备注)课程(课程号、课程名、描述、学分、学时、性质、备注)开设课程(课程号、学期、授课日期、授课时间、地点、选修人数、备注)选课(学生号、课程号、学期、成绩、备注)任课(教师号、课程号、学期、备注),3.3.4 数据库设计:建立数据库模型3,对于上述的基本表需要进行关系规范化,设计用户视图,存储过程等。如果需要也可以用对象类图为数据库模式建立模型。,3.3.5 层次设计:建立包图1,对于一个大型的复杂的系
31、统,常常要把大量的模型元素用包组织起来,以方便理解和处理。JXGL系统虽然不算很大,但也可以把系统的对象类组织成包,以便更清楚地了解系统的结构。包图表示的是系统的静态结构,但是建立包图应当同时考虑系统的动态行为。层次设计,类似于概要设计或者总体设计,便于理解系统结构。,MFC类,出错处理,用户接口,教学管理,数据库,教学管理,选课管理,课程,学生登记,开设课程,课程登记,成绩统计,成绩管理,学生成绩登记,成绩统计,身份验证,人事信息,学生,教师,师生,JXGL系统的包图,教学管理包,3.3.5 层次设计:建立包图2,在“用户接口”包中包含了全部接口对象类:“课程信息管理表单”、“查询课程表单”
32、、“查询成绩表单”、“选课注册表单”、“开设课程表单”、“选课统计表单”、“成绩信息管理表单”、“成绩统计表单”、“注册表单”等。在“数据库”包中包含了实现数据库服务功能的全部对象类。在“MFC类”包中包含了支持系统的动态连接库的必要库函数对象类。在“出错处理”包中包含了对出错进行处理的全部对象类。,3.3.5 层次设计:建立包图3,JXGL系统有两个子系统组成:(1)课程注册子系统,负责新学期的选课注册管理工作。(2)成绩管理子系统,负责学生成绩管理。,简易教学管理系统,课程注册子系统,成绩管理子系统,系统与子系统包图,3.4 系统设计:动态行为模型,系统的动态行为模型由交互图(顺序图和协作
33、图)、状态图、活动图表达。在系统的分析和设计中应当对主要的Use Case和对象类绘制这些图形,以便分析系统的行为,印证和修改系统的静态结构,满足用户的需求,达到系统的目标。,3.4.1 动态行为模型:建立顺序图1,在建立Use Case视图时已经绘制了一些顺序图或协作图,在建立系统的动态行为模型中需要继续这项工作,进一步绘制主要Use Case的顺序图或协作图,并逐步精化。为了绘制顺序图,首先要对一个Use Case编写交互活动的剧本,然后确定参与交互的角色和对象,确定交互事件。,3.4.1 动态行为模型:建立顺序图2,例如,对于Use Case“管理课程信息”是角色“教学管理员”和“注册表
34、单”接口对象、“开设课程表单”接口对象、“开设课程”对象、“课程”对象发生的交互,可以绘制设置开设课程的顺序图。其中的交互事件如下:1. 登录:“教学管理员”登录JXGL系统进行设置课程活动。“教学管理员”发出登录消息,并输入用户标识(ID)和口令。2. 验证:“注册表单”接口对象响应登录消息,检查用户标识(ID)和口令。如果正确无误,则可以继续下一步交互,否则提示用户重新输入用户标识(ID)和口令,进行新一轮的身份验证。,3. 查询:“教学管理员”发出要求查询课程信息的消息,“开设课程表单”接口对象响应该消息。4. 取课程信息: “开设课程表单”接口对象发送消息“取课程信息”给“课程”对象,按照输入的查询条件找出有关课程信息,在屏幕上显示,并反馈查询成功或失败的信息给“教学管理员”。,3.4.1 动态行为模型:建立顺序图3,