0 引 言
面向对象的软件构造导论课程是计算机科学与技术专业一门重要的专业必修课,该课程深度融合了面向对象语言与面向对象的软件构造两方面知识,课程内容包括Java语言基础、面向对象的基本思想和设计原则、常用设计模式、软件构造方法、软件测试等。课程总体目标是培养学生的面向对象思维和构造高质量软件的基础能力,使学生掌握面向对象软件构造的基本方法、技术和工具,为后续专业课程中构造大型复杂软件系统打下坚实基础。
从以往的教学经验来看,本类课程面向的是尚不具备复杂大型软件开发经验和能力的学生群体[1],教学过程中普遍存在着学生对面向对象开发的学习动机不强、目标不明的问题,进而导致学生无法真正掌握面向对象思想和设计模式的精髓,达不到教学效果[2]。
1 实验教学需解决的问题
本课程开设在大二下学期,包含16个学时的课内实验。在课程学习阶段,学生反馈最多的问题是面向对象思想和设计模式过于抽象,即使掌握了基本概念和含义,也难以在实际开发中灵活应用。要达成课程总体目标,需要帮助学生跨越两个难关。
1)将开发模式从面向过程编程转变到面向对象编程。
面向过程是以过程为核心,强调事件的流程、顺序,而面向对象则是以对象为核心,强调事件的角色、主体。相对于面向过程的编程思想和方式,面向对象编程的优势主要体现在业务逻辑复杂、需多人合作、需求不断变化、版本多次迭代的大型软件开发中。学生在学习本课程之前,只完成了C语言程序设计和数据结构两门编程类专业课,编程经验主要是以个人为单位,以面向过程的开发方式完成课内的标准化习题和简单的算法编程题,大部分学生面向过程的思想根深蒂固[3-4]。
这一阶段的学生往往不具备大型软件的开发经验和能力,未曾体验过因软件架构调整、需求变化导致代码修改过程中的痛点,因此,很多学生在学习面向对象知识的过程中缺乏清晰的目标和强烈的动机。在后续计算机专业课程中乃至走上工作岗位后,学生将面对复杂大型软件的开发,面向过程的开发方式不再适用,如何促进学生从面向过程编程转变到面向对象编程是实验教学设计的一个难点。
2)将开发关注点从功能实现转移到架构优化。
在学习本课程之前,学生尚未接触过软件工程等专业课程,没有经过软件开发综合实践的锻炼,缺乏分析和解决实际问题的能力,因此,在实际进行软件系统开发时,容易陷入只关注完成需求文档中所要求的系统功能,而忽视整个软件的系统架构和软件质量的误区。实验任务发布后,学生往往急于编码来实现功能,缺少分析和设计的过程,且在开发过程中懒于重构。虽然开发前期因快速完成部分功能获得一定的成就感,但由于系统架构臃肿,代码耦合度高,不易维护、扩展和复用,到开发后期,继续为系统添加功能将会导致大量的代码修改,并可能引入更多的Bug,同时也无法应对不断变化的用户需求,最终无法完成一个满意的作品。
软件设计模式[5]是从许多优秀软件系统中总结出的可复用设计方案,可优化系统架构,提高软件质量,然而对于初学者来说,设计模式过于抽象,学生模仿某个设计模式,往往“有其形而无其神”,目标不明确,并未真正领悟该设计模式在当前应用场景下的必要性和优越性。如何将学生的关注点从功能实现转移到架构优化,进而提升高质量软件构造的能力是实验教学设计的另一个难点。
2 实验教学设计
首先要促进学生从面向过程编程转变到面向对象编程就要解决学生复杂大型软件开发经验不足与面向对象编程特点之间的矛盾,即如何设计既符合学生当前编程能力,又能具备复杂大型软件开发中各种难点痛点,从而充分体现面向对象编程优势的实验教学项目。一方面,若实验案例过于简单和分散,学生往往有“小题大做”“杀鸡用牛刀”的感觉,认为面向对象编程意义不大,开发中对面向对象设计原则及设计模式实际运用的主观能动性和积极性差;另一方面,由于现阶段学生还尚不具备开发大型软件的能力,编程经验不足,若实验案例过于复杂,学生就无法很好地理解业务逻辑,进行任务拆解,导致自信心不足,产生畏难情绪[6]。
其次,要将学生的关注点从“功能实现”转移到“架构优化”就要让学生深切体会到“功能是实现不完的,需求是不断变化的,只有好的架构才能以不变应万变”。因此,在教学实践中,系统功能点的要求不应一次下发,而是需要进行有针对性地、有目的地拆解,在多次实验中不断合理地深化和扩展,让学生切实感受到当用户需求变化时,差的架构会使代码的修改举步维艰,而经设计模式优化后的架构可大大提升软件的可维护性、可复用性和可扩展性。
为引导学生克服学习困难,提升学习能力,最终跨越面向对象知识学习的难关,笔者提出以Java语言为基础,以飞机大战兴趣项目为实践载体,将16个学时的课内实验划分成6次互成体系、逐步递进的实验,在设计中巧妙融入6种经典设计模式,建立与授课内容紧密联系的完整实验体系,通过不断变化的用户需求,促进代码重构和架构优化,让学生在实践中更好地理解面向对象的编程思想和软件构造的设计模式,最终完成一个完整的飞机大战游戏作品。整个课程实验集知识性、趣味性和挑战性于一身,寓教于乐,理论与实践相融合,可以极大地调动学生学习实践的积极性和主动性,对于之前只接触过面向过程编程的同学来说,将是一次编程思想及动手能力的全面提升。
3 实验教学实施过程
3.1 以兴趣项目驱动教学
项目驱动教学[7]模式是以项目为导向,以学生为主体,以实现项目为目标的一种教学设计方法。本课程选用飞机大战游戏作为实验项目有两个明显优势。
首先,开发一款熟悉并喜爱的游戏将极大提高学生学习的兴趣[8-9]。学生非常容易理解飞机大战的业务逻辑,更多类型的敌机,更多功能的道具,更炫酷的弹道,这种需求的变化是合理而顺其自然的,学生易于接受甚至会爆发出意想不到的热情。可视化的游戏界面及不断丰富的游戏功能会带给学生更为直接的成就感。
其次,飞机大战游戏足以支持设计多层次、多变化、多迭代的实验项目。通过不断丰富游戏角色、游戏规则和场景变化,飞机大战可以引入多种经典设计模式,如工厂模式解决多样化的敌机和道具创建,策略模式实现丰富的弹道设计等。合理应用设计模式解决一个个问题的过程,又会使学生学习目标更加清晰,提升学生学习的积极性和目的性。
以上两点说明飞机大战游戏项目具备了支撑实验教学方法的可行性。笔者有针对性地选择和设计了游戏角色、规则、界面、音效等功能,再根据教学知识点的先后顺序进行反向任务拆解,将系统功能点分散到每个实验中,并不断进行合理深化和扩展,既涵盖和贯穿课程各个知识点,又相互独立、重点突出。项目迭代开发过程及任务分解如图1所示。
首次实验,教师向学生下发项目任务书和开发初始版本,并通过视频演示初始版本和最终版本的运行效果。初始版本已实现游戏基本运行框架和部分功能,编程能力较弱的同学也可快速上手。教师通过讲解,向学生明确后续迭代开发每个阶段的分解任务,让学生建立信心,相信整个游戏项目的开发在自己的实践能力之内。学生在初始版本的基础上,经过6次迭代开发,不断重构和完善系统,最终完成整个项目。
3.2 以需求变化、不断重构促进架构优化
教学中发现学生常常对使用设计模式存在困惑。以飞机大战中3种敌机的创建为例,若一次下发任务,学生直接New一个个敌机对象也可以快速完成功能需求;而采用工厂模式则需要引入工厂父类和多个工厂子类,分析类与类之间的关系,看起来似乎会增加编码负担。这种情况下,若后续不继续添加新的敌机类型,学生便无法理解该场景使用工厂模式的必要性和优越性,因此将3种敌机的创建任务进行拆分,第一次实验只完成精英敌机和普通敌机的创建,第二次再增加Boss敌机的创建,最后一次实验再次引导学生添加更多类型的敌机。利用任务的拆解,让学生明白仅仅满足当前的功能需求是远远不够的,差的架构设计无法应对不断变化的用户需求,而工厂模式可以把对象的创建和使用过程分割开来,实现模块之间的解耦,使系统具有良好的可扩展性,易于维护。
同时,要让学生真正理解抽象的设计模式,应该允许学生“试错”,经历从差的架构设计到好的架构设计的重构过程。如果教师只是“填鸭式”地要求学生模仿书本上的某个设计模式完成特定功能,学生往往只是“照葫芦画瓢”,仅仅记住了该模式的结构图,而并未真正领悟模式中每个角色存在的意义,一旦场景发生变换,就难以灵活运用。针对这个问题,可以将每个设计模式的实验分成4个阶段,即试错、分析、重构和验证(如图2所示),以工厂模式为例。
(1)试错阶段:在实验一中向学生提出创建普通敌机和精英敌机的任务,此时学生还未学习工厂模式,因此大多是以New一个对象的方式在游戏流程控制类Game类中创建敌机对象,这种方式会违反面向对象的多个设计原则。
(2)分析阶段:在实验二中结合现有项目代码,通过提问的方式引导学生分析和思考目前架构设计存在哪些问题,违反哪些面向对象的设计原则。比如敌机创建职责分配给Game类是否合适?若增加敌机的一种属性(如防御力)需要修改哪些代码?若增加一种新的敌机类型需要改动哪些类?经过对游戏中具体应用场景的分析讨论后,学生会发现目前的架构设计违反了单一职责、依赖倒转和开闭原则。
(3)重构阶段:经过分析阶段后,学生明白了违反面向对象设计原则的系统架构在开发中带来的痛点,此时再自然引入工厂模式解决该痛点。通过UML类图[10]和代码示例向学生讲解工厂模式的结构和实现过程,并强调“先设计再编码”,要求学生先绘制该游戏场景下工厂模式的类图,理清模式中每个角色作用和相互关系,再进行代码重构。另外,针对学生担心重构会引入Bug 的顾虑,在实验设计中引入JUnit单元测试框架,保证重构的安全性。
(4)验证阶段:经过重构阶段后,当前系统架构得到优化,此时可以提出新的任务需求来验证模式的优越性。在实验三中再次提出创建Boss敌机的任务,由于采用了工厂模式,学生仅仅需要修改少量代码就可以快速完成该任务,切实感受到设计模式的魅力,获得极大的成就感。
通过上述4个阶段的锻炼,学生对工厂模式的结构和优越性理解得更透彻,印象也更深刻。
3.3 以过程性、多维度指标进行课程考核
传统的软件开发类课程实验大多采用结果性评价,只关注最终目标即软件系统功能是否完成,考查内容多为学生最终提交的项目文档、项目代码及综合答辩情况。本课程实验具有广泛性、抽象性和实践性的特点,深度融合了Java编程语言、面向对象思想、设计模式、软件构造等多方面知识点,单纯考查系统功能无法体现课程目标是否达成[11]。
以过程性、多维度指标进行本课程实验的考核。过程性是指课程考核应聚焦于学生整个学习过程,并重视学生每个学习阶段的反馈。本课程最终成绩由两部分构成:开发过程中的6次实验占80分,期末占20分。每次实验学生需提交阶段性报告和可运行代码,教师可对学生每个阶段的迭代工作进行全面考核并得到反馈。期末学生需提交总结报告、项目代码和演示视频,对整个项目进行总结。多维度是指分析、设计和编码3个维度,强调“3个维度都很重要”,对分值比重也进行相应设计。在分析维度,主要考查对项目各种需求的分析是否充分,设计模式应用场景和优缺点的分析是否合理等。在设计维度,考查设计模式UML结构图的绘制是否规范,模式中每个角色的作用及其关键属性和方法理解是否正确等。在编码维度,考查系统功能是否完成,代码是否符合编码规范,是否按照所设计的模式UML类图进行代码重构等。通过多个维度的考查,确保学生掌握了面向对象软件构造的基本方法、技术和工具,达到课程总体目标。实验具体考查内容和分值所占比例见表1。
另外,采用加分奖励的方式鼓励学生大胆创新,让学生从一个游戏策划者的角度为系统设计和添加更多的功能和特色,如设计新的游戏关卡,添加新型的飞机、新功能的道具、复杂的弹道、更多的音效等。在教学中发现,学生的兴趣被激发后,会爆发出令人意想不到的热情和好的创意。
4 结 语
通过一个学期的探索和实践发现,以兴趣项目驱动教学、以需求变化和持续重构促进架构优化、以过程性和多维度指标进行课程考核3个方面的实验教学优化方法在培养学生的面向对象思维、构造高质量软件的基础能力等方面,都起到了明显的促进作用。2022年春季哈尔滨工业大学(深圳)2020 级计算机专业共524名学生参与本课程,据统计,期末结项时有89%的学生完成了项目任务书中的基本功能点;另外有28%的学生进行了功能创新,开发出了极具个人特色的游戏作品。课程实验在实验内容、教学方式、教学质量等方面都得到了学生较高的评价和普遍认可,学生的学习主动性和积极性、灵活运用面向对象思想解决问题的能力均得到了提高,为后续专业课程中构造大型复杂软件系统打下良好的基础。
另外,通过问卷调查、实验报告总结、面对面交流等方式得到了学生的反馈和建议,下一步计划从以下几个方面对课程实验进行优化。
(1)引入Git平台[12]进行辅助教学,学生可进行版本控制,教师也可以对学生项目开发进行监控管理,并对学生作出合理的教学评价。
(2)调整部分实验的学时和任务,如实验5中的GUI图形化编程和多线程编程对初学者难度较大,一部分学生反映学时不够,需进行学时调整和任务分解,进一步完善实验指导书并提供示例程序。
(3)丰富游戏素材库,激发学生热情,鼓励功能创新及其他经典设计模式的拓展应用,期末设置优秀作品展示环节,进一步增强学生自信心和成就感。
参考文献:
[1] 解新峰. 新工科背景下的软件构造课程研讨实验教学模式探索[J]. 计算机教育, 2022(4): 165-169.
[2] 尹梓名, 周雷, 郑建立. 以“软件设计模式‘促进’面向对象程序设计”课程教学方法研究[J]. 软件, 2019, 40(8): 216-219, 228.
[3] 张璞, 夏英. 软件设计模式在Java程序设计课程教学中的应用研究[J]. 软件工程, 2017, 20(7): 15-18.
[4] 曹文平, 宁彬. 任务驱动+过程反馈的Java教学方法研究[J]. 教育教学论坛, 2021(4): 165-168.
[5] 刘伟. Java设计模式[M]. 北京: 清华大学出版社, 2018: 1-10.
[6] 王慧, 李雷孝, 邢红梅. 基于OBE理念的Java程序设计课程教学改革探索[J]. 计算机教育, 2020(2): 54-57.
[7] 覃忠台. 项目驱动教学法在PHP程序设计课程中的应用[J]. 计算机教育, 2019(7): 93-96.
[8] 肖志娇, 刘士俊, 徐婧. 基于游戏的面向对象程序设计课程实验系统[J]. 实验技术与管理, 2019, 36(5): 157-159.
[9] 韩娜, 周波, 马晓梅. 基于Greenfoot游戏驱动的Java程序设计课程的教学改革[J]. 中国现代教育装备, 2015(9): 96-98.
[10] 郭艳燕, 杨军, 毕远伟, 等. UML在面向对象课程体系实践教学中的应用[J]. 计算机教育, 2019(3): 126-132.
[11] 姚争为, 滕国栋. 高校程序设计类课程过程性评价的研究与实践[J]. 计算机教育, 2015(24): 86-88.
[12] 俞昊然, 杨博洋. 软件工程实践训练设计与实践[J]. 实验技术与管理, 2018, 35(6): 215-221.
基金项目:2022年度广东省教育科学规划课题(高等教育专项)项目“基于“成果导向”教育思想的‘面向对象的软件构造导论’课程体系创新构建和探索”(2022GXJK431)。
第一作者简介:谢佳,女,哈尔滨工业大学(深圳) 实验与创新实践教育中心实验师,研究方向为计算机软件方向实验与实践教学,xiejia@hit.edu.cn。
引文格式:谢 佳,房 敏,汪花梅,等. 面向对象的软件构造导论课程实验教学方法探索[J].计算机教育,2023(3):23-27.
转自:“计算机教育”微信公众号
如有侵权,请联系本站删除!