UML在面向对象课程体系实践教学中的应用
2019-04-01郭艳燕毕远伟娄兰芳
郭艳燕,杨 军,毕远伟,娄兰芳
(1.烟台大学 计算机与控制工程学院,山东 烟台264005;2. 烟台大学文经学院 教务部,山东 烟台 264005 )
0 引言
1 搭建面向对象课程体系教学框架
为了培养学生面向对象的软件工程实践能力,以面向对象思想为驱动,设置软件工程专业的面向对象课程体系,课程包括面向对象程序设计、数据结构与算法、数据库原理及应用、统一建模语言UML、面向对象方法学、软件体系结构、软件工程,并配备相应的课程实训或课程设计来强化实践环节,按照知识层次由浅入深、专业技能由独立到系统、综合实践能力由弱到强,搭建出基础、深入、综合三阶段的渐进性阶梯式面向对象课程体系的理论和实践教学框架,如图1所示。
图1 面向对象课程体系的理论和实践教学框架
基础阶段,通过学习面向对象程序设计课程,学生掌握一门面向对象编程语言,培养学生的程序设计能力;通过数据结构和算法课程,培养学生的数据抽象、分析、组织和处理能力;通过数据库原理及应用课程,培养学生利用数据库进行数据存储和处理数据的能力。深入阶段,学生通过统一建模语言UML课程的学习,掌握软件可视化建模的方法和技术,直观感受和理解面向对象思想;通过面向对象方法学课程的学习,深入全面地掌握面向对象软件开发的方法和技术。综合阶段,学生通过软件体系结构课程的学习,理解软件构架的设计理论,掌握设计模式和架构模式,加深对面向对象的认识,提升构建可复用性、灵活性、可扩展性的高质量软件的能力;通过软件工程课程的学习,能够系统地掌握软件开发各阶段的目标和任务[3],通过真实的软件工程实践案例,感受面向对象软件开发的优势,提高面向对象的高级应用能力和综合实践能力。课程体系的实践环节,还包括通过鼓励学生参与课外的“互联网+”大学生创新创业大赛、开放实验室基金项目、教师科研课题、科技创新及学科竞赛等,有效提升学生的实践创新能力[4]。
2 使用UML贯穿面向对象课程体系
2.1 UML在课程体系中的地位和作用
UML是一种基于面向对象的可视化建模语言,是面向对象思想的有力表达,是面向对象方法论转化为实践的重要工具,在整个软件开发周期都发挥着重要作用。用例需求分析、面向对象分析与设计、设计模式、架构模式、面向对象软件实现与测试都与UML建模紧密相关。UML软件建模不仅有利于理解、分析、设计、实现复杂的软件系统,而且是制作高质量软件开发文档的高效手段。
UML的知识结构如图2所示,包括5种视图和13种图,不同种类的UML图反映系统的不同方面,具有不同的抽象层次,在软件开发不同阶段的重要性也各不相同。由于UML图直观易于理解的特点,在课程体系的实践教学中,将知识点与相关的UML图进行配合讲解,建立UML模型与软件分析、设计、实现之间的映射关系,有利于帮助学生理解抽象的课程内容,感受面向对象思想。面向对象课程体系涉及软件开发过程的多门课程,将UML作为实践教学的辅助工具,作为贯穿融通课程体系知识的主线,是教学改革中的创新思路,如图3所示。
图2 UML知识结构框架
图3 以UML贯穿主线的面向对象课程体系
2.2 课程体系实践教学中常用的UML图
1)UML类图。
类图给出了系统的静态设计视图和静态进程视图。类图不仅内涵表达丰富,而且与其他UML图有着紧密的联系,在UML模型图中占据重要地位,是进行软件分析和设计最主要的图,是连接设计人员和软件实现人员之间的桥梁,在软件开发过程中有着特殊的意义,涉及软件开发的多个领域和方面。因此在实践教学中,类图成为最常用的图。
2)UML顺序图。
实际上关于小组合作教学形式早就有所研究,但是不同的研究学者保持着不同的观点.例如美国的约翰·斯莱文教师就曾经研究过合作学习这种形式,他认为其本质上就是能够让学生在小组中自主的学习.但是我国的研究学者却有着稍微有所差别的看法,小组合作学习形式是一种让学生共同进步的一种教学方式.
顺序图专注于系统的动态视图,是在静态视图基础上对系统行为描述的有利补充,关注在时间轴上多个对象的消息交互。顺序图是UML交互图中最重要、最常用的图,尤其是带有组合交互片段的顺序图,对复杂交互情景的描述能力比通信图强很多,并且是交互纵览图的基本组成部分。因此在实践教学中,涉及描述系统交互的实例可以使用UML顺序图。
3)UML状态机图。
状态机图给出了系统的动态视图,描述对象具有的各种状态、状态之间的转换过程以及触发状态转换的各种事件和条件。状态机图关注一个实体基于事件反应的动态行为,对于描述类、接口、子系统的复杂行为尤为重要,非常有助于对反应式系统的建模。因此在实践教学中,涉及依赖于对象状态的行为描述可以使用UML状态机图。
4)UML活动图。
活动图给出了系统的动态视图,关注对象之间控制流的转换和同步机制,通常用于描述一个操作或用例实现过程中各项活动的执行流程,是描述算法设计的有利工具,对系统的功能建模和业务流程建模特别重要。因此在实践教学中,涉及算法、方法实现、并行处理的描述可以使用UML活动图。
3 在面向对象课程体系实践教学中应用UML
3.1 UML在面向对象程序设计实践教学中的应用
面向对象程序设计是学生接触面向对象思想的第一门课程,学习使用C++编程语言进行程序设计,通过C++的具体语法体系初步感受面向对象思想。例如,在讲解C++“类的继承”知识点时,使用C++代码定义基类和派生类来建立继承关系,如图4的代码所示,派生类定义时不需要包含基类中已有的成员,只需要添加派生类中自己新增的成员,从代码上体现派生类对基类的复用。但仅仅使用代码的方式体现类的继承关系,将会使学生把关注点放在继承的C++语法结构上,而忽略代码在深层次上所体现的面向对象思想。
在实践教学中,将C++的类继承代码与对应UML类图来联合展示,能更好地让学生直观地感受面向对象思想。UML使用矩形框将数据和对数据进行操作的方法进行封装,体现面向对象的“封装性”。通过UML类图中的泛化关系来展示类之间的继承关系,基类和派生类具有一般类和特殊类之间的关系,体现面向对象的“继承性”;通过在派生类中添加与基类成员同名的新成员来实现覆盖机制,为实现面向对象的“多态性”奠定基础。通过该教学实例,让学生系统地感受到“封装”是“继承”的前提和基础,而“继承”是为了实现复用,最终达到“多态”的目的。
图4 UML类图与类继承的C++代码
3.2 UML图在数据结构与算法实践教学中的应用
数据结构与算法是软件工程专业一门非常重要的专业基础课,介绍常见的数据结构及其在计算机中的存储结构和操作实现。将面向对象思想引入该课程,一方面是将C++作为数据结构的实现语言;一方面采用抽象数据类型,将数据结构中的逻辑结构与数据运算进行封装,隐藏存储实现细节,达到以一致的方式调用底层数据结构的目的;另一方面C++中的标准模板库STL是面向对象数据结构在更高层次上的抽象。
实践教学实例1:按照物理存储结构,栈分为顺序栈和链式栈。以链式栈的讲解为例,为了使链表栈数据存储更具通用性,采用C++的类模板机制来定义节点与链式栈,代码如图5所示。在教学过程中,链式栈结构可以借助对应的UML带参数的类图进行可视化展示,链式栈中节点与节点之间的链接关系使用UML中单向自反关联关系进行展示,体现出面向对象结构中的“实例连接关系”,链式栈与节点之间的关系使用UML中组合关系进行展示,体现出面向对象结构中的“复杂事物由简单事物组成”。
实践教学实例2:对算法的描述不仅可以使用伪代码,而且可以使用能代替流程图的UML活动图。学生通过UML活动图很容易直观地理解算法的执行流程和步骤,图6使用UML活动图对冒泡排序算法进行可视化描述。
图5 UML带参数的类图与数据结构链表栈的C++描述
图6 UML活动图与冒泡排序算法伪代码
3.3 UML在数据库原理及应用实践教学中的应用
数据库原理及应用是软件工程专业的核心课程,是专业理论及实践教育的重要基础,主要介绍关系型数据库的基本理论和实现方法,学生通过该课程的学习,能够熟练掌握数据库设计方法和应用技术。对数据库建模是数据库设计的关键,通过数据库辅助设计工具可以实现数据库建模,构建数据库设计的概念模型和物理模型[5]。使用UML建模工具可以实现数据库建模。
在实践教学中,一个关系型数据库能够为UML模型提供一套优秀的实现。例如,在系统分析阶段,将E-R图所描述的实体关系使用具有关联关系的UML实体类图展示,从而构建数据库的概念模型;在系统设计阶段,依据UML实体类关系图实现对数据库表的设计,从而构建数据库的物理模型。UML实体类图与对应的数据库表设计如图7所示,将具有“1对多”关联的两个实体类映射为两张关系数据库表,实体类名映射成表名,实体类中的属性作为表中的字段出现,并将多重性为“1”的表主键放在多重性为“多”的表中作为外键,来完成实体类分析到数据库表的设计。
3.4 UML在面向对象方法学实践教学中的应用
面向对象方法学是提高学生软件开发实践能力的重要专业课,深入、系统、完整地讲解面向对象的软件分析、设计、实现及重构方法。该课程虽然强调以实践为主,却以较强的理论知识为基础[6],因此只有对抽象理论理解透彻,才能加以正确地实践。
实践教学实例1:“单一职责原则(SRP,Single Responsibility Principle)”是七大面向对象设计原则之一,是为了确保软件设计具有高内聚的特性,具体陈述为“就一个类而言,应该仅有一个引起它变化的原因”。由于设计原则本身的文字描述过于抽象不易理解,因此在讲解时需要配合对应的UML类图进行思想展示。在教学实践中,通过一个违反SRP的UML图实例,如图8左图所示,将矩形的计算功能与矩形的绘制功能封装在一个Rectangle类中,并与两个使用该类的应用程序建立使用依赖关系。在此设计下,如果GUI图形库发生变化,不仅会导致与矩形绘制功能相关的绘图程序发生变化,而且会导致与图形绘制功能不相关的数学应用程序也发生变化,从而违反了SRP。图8右图所示为修改后的符合SRP的设计,将矩形的两个不同类型的功能分别封装在不同的类中,与各自使用对应功能的应用程序建立依赖关系。通过UML图的实例展示,能够让学生清晰地理解单一职责原则,并感受该原则带来的设计优势。
图7 UML实体类图与对应的数据库表设计
图8 违反SRP的设计实例与遵循SRP的设计实例
实践教学实例2:体现动态多态性的UML图如图9所示,构建具有泛化关系的UML类图来展示抽象父类和具体子类之间的继承关系,构建多个UML顺序图来展示不同子类对父类抽象方法实现时的交互细节,通过将UML的静态结构图与动态行为图结合,能够直观地体现面向对象中的“运行时多态”特性,有利于学生对面向对象特性的深入理解和实践应用。
图9 体现动态多态性的UML图
3.5 UML在软件体系结构实践教学中的应用
软件体系结构是一门软件工程专业实践性很强的高年级专业课,主要介绍软件体系结构的基本原理、方法和实践[7]。学生通过该课程的学习,能够从系统结构角度分析现有的软件系统,针对特定问题选择准确的设计模式,并能运用所学知识高效地设计软件系统。设计模式是该课程教学的重点,设计模式离不开面向对象,通过UML类图可以对各种设计模式思想进行表达,使用面向对象编程语言可以对设计模式进行软件实现。同时,通过设计模式,可以深化对面向对象设计原则的理解,实现设计原则的具体应用。
实践教学实例:状态模式主要解决“对象如何在每一种状态下表现出不同的行为”,适用于控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,将不同状态的行为分割开来[8]。实践教学中,将UML状态机图与状态模式结构类图来联合讲解,如图10所示,状态模式类图中3个状态子类与房间对象的UML状态机图中的3个状态对应,状态模式类图中3个子类中的方法与UML状态机图中触发相应状态改变的事件对应,将类对象状态分析和对应设计模式的选取充分联系在一起,实现软件分析到软件设计的过渡。
图10 UML状态机图与状态模式结构类图[9]
3.6 UML在软件工程实践教学中的应用
软件工程是一门融合多门计算机专业知识的综合性课程,从工程学角度讲解软件工程的基本理论、技术和方法[10]。通过该课程的学习,旨在培养学生具备软件工程师所需的各项专业技能和素质,提高学生解决软件开发全局问题的能力[11]。
软件工程课程强调理论与实践并重,在理论教学环节中,突出以案例教学为导向;在实践教学环节中,突出软件项目驱动模式[12]。UML不仅可以应用到理论教学环节,而且可以应用到实践环节。为了利于学生对抽象知识的理解,在教学实践中以企业化软件开发过程为线索,结合实际工程案例,使用UML来对软件的需求、分析、设计进行建模,构建软件系统的静态视图和动态视图,对软件实现进行指导,并作为软件测试的依据和开发文档,最终实现模型驱动的软件开发。通过以UML模型贯穿软件开发全过程的项目讲解,让学生充分体会到面向对象思想在实际软件开发中的指导作用。
4 结语
面向对象课程体系强调将面向对象思想充分应用到软件开发全过程,将面向对象的原理、工具、方法、实践融入一体。课程体系的教学目标是使学生在具有面向对象编程能力的基础上,结合UML软件建模,加深理解面向对象技术原理的精髓和实质,掌握面向对象软件分析设计的原则和方法,具有软件开发实践和综合应用能力[13],通过结合软件工程应用实践,加强学生计算思维能力的培养,注重软件设计方法的培养和引导,提高学生的创新实践能力。由于UML提供了从不同角度观察和展示软件系统各种特征的标准方法,可以应用到软件开发的各个阶段,因此结合课程体系中各门课程的教学内容,将适当的UML图应用到实践教学实例中,不仅有助于教学内容的理解,而且有利于体现课程体系知识的连贯性、系统性和实践性,更好地达到课程体系的教学目标。