林 姗,江 南,刘 伟
(湖北工业大学 计算机学院,湖北 武汉 430068)
随着计算机技术的迅速发展,必然引起专业基础课程内容的调整和优化。同时,笔者所在学院正经历工程教育专业认证的教学建设和改革,根据我国工程教育认证协会于2006年按照《华盛顿协议》的认证标准和方法开始的工程教育专业认证对高校人才培养目标的要求,依照“以学生为中心,以产出为导向,持续改进”的人才培养理念,课程教学改革势在必行。面向对象程序设计C++课程是计算机专业重要的专业基础课程。该课程以C语言程序设计为先修课程,以数据结构为后续课程,包括封装、继承、多态、模板等内容。
目前,高校计算机专业的面向对象程序设计课程的教学中存在着诸多问题,主要体现在以下几个方面。
(1)教学内容上C++面向对象程序设计的前导课程是C语言程序设计,两门课程的教学内容没有有效地进行衔接。导致有些学生由于C语言基础较差,特别是对函数、指针、结构体等内容理解不够清晰透彻,而对C++的学习造成了一些障碍。
另外,学生在学习C++时,容易受C语言面向过程编程模式的影响,很难转变到用面向对象的编程模式去解决问题。面向对象的基本概念是“封装”和“类”,需要学生能够针对实际生活中的各类对象,对其特征进行数据抽象和功能抽象,而学生的思维停留在面向过程的程序设计思维方式上,无法很好地理解类的抽象、对象和类的关系等。
(2)传统的教学方法不利于学生学习掌握相关知识。传统的教学方法是以语法为核心,教材设计的例题多半也是为了巩固相关的语法,很少有实际应用相关的例子,不利于学生运用面向对象的思维方式理解和解决问题。
(3)课程实验效果较差。实验内容的设计针对性和实用性不强,实验以验证型实验为主,不能有效地激发学生的兴趣和创新意识。
面向对象程序设计课程改革的第一步,就是根据工程教育专业认证要求下新的培养目标优化课程体系,调整各门课程的教学内容。课程组将原有的程序设计基础能力培养相关的课程整合为计算机科学与编程导论、面向对象的程序设计、数据结构3门课程,这3门课程在内容上紧密衔接。
计算机科学与编程导论的课程内容侧重计算机科学与编程方面的专业基础知识,并且能够应用C语言编写程序,具有基本的编写和调试程序的能力,同时掌握结构化程序设计的方法,养成良好的编程习惯,初步具备应用高级语言设计程序以解决实际问题的能力。计算机科学与编程导论以顺序表的实现作为课程内容的综合性小结。
面向对象的程序设计侧重 “面向对象”的基本概念和思维方式,以及面向对象程序设计的开发方法和技术,语言采用C++。在具体教学内容上以顺序表的C语言实现为基础,引入抽象、类的封装、数据属性、成员函数等概念,重新对顺序表进行封装,实现一个顺序表类。由于学生对顺序表的基本功能在上一门课程中已经熟悉并实现,所以在这门课程中只需侧重于面向对象相关的概念和实现即可。然后引导学生思考顺序表在实际应用中的局限性,从而引入动态数组、模板、继承与多态等内容,并以链表类模板及基于该模板的栈、队列的实现作为课程内容的综合性小结。
数据结构在面向对象程序设计课程教学的基础上,再进一步介绍树、图等结构的实现,并能够针对实际问题选择合适的数据结构,设计出结构清晰、正确易读、复杂性较优的算法。
这样,在3门课程学完后,学生就能够运用面向对象程序设计的方法以及数据结构和算法知识求解实际中的工程应用问题。在此基础上,通过相关领域的专业课学习,能够将相关知识用于解决计算机领域的复杂工程问题,从而达到本专业制定的毕业要求。
课程教学内容是课程教学大纲的主体部分,而课程教学大纲又是指导课程教学的纲领性文件。根据工程教育专业认证的要求,课程教学大纲明确指出课程教学目标要对专业认证中哪些毕业要求项提供支撑。因此,按照学院制定的专业认证毕业要求,面向对象程序设计课程的课程组结合本专业教学实际对各章节知识点的重要程度进行了多次讨论,将对各项毕业要求的支撑细分到每一章节,同时给出每一章节知识点的掌握程度和相应的教学手段,进一步明确课堂教学内容和教学要求。
以湖北工业大学为例,面向对象程序设计课程支撑的毕业要求有4个:①具备扎实的计算机工程基础知识,了解通过计算机解决复杂工程问题的基本方法并遵循复杂系统开发的工程化基本要求;②能够根据给出的实际工程案例提出问题及分析问题;③在充分理解计算机软硬件及系统的基础上,能够设计针对计算机领域复杂工程问题的解决方案,设计或开发满足特定需求和约束条件的软硬件系统模块或算法流程,并能够进行模块和系统级优化;④能够在计算机领域复杂工程问题的预测、建模、模拟或解决过程中,开发、选择与使用恰当的技术、软硬件及系统资源、现代工程研发工具,提高解决复杂工程问题的能力和效率。
以面向对象程序设计中的重要概念“继承和多态”的教学为例,所涉及的教学内容、教学组织以及对毕业要求的支撑见表1。
课堂教学不再以教师为中心,针对不同的教学内容可以采用不同的教学方法,如案例式、问题驱动式等。
表1 “继承和多态”教学安排
例如,在讲解面向对象最基础的概念“类的封装”时,以日常生活中的各种时钟对象为案例[1],让学生思考各种不同外观的时钟具有哪些共同的、必需的数据,以及需要完成哪些基本的功能。当学生归纳出基本的数据和功能后,让学生体会类的封装的实质,然后结合C++的语法讲解类的具体实现。当时钟类实现后,可以在应用程序中创建该类的一个对象,然后像日常生活中的时钟一样显示具体的时间信息。通过这个案例教学,学生可以结合实际生活中最常见的例子体会抽象、封装、类、对象、实例化等面向对象程序设计的基本概念。
然而,在课堂中,案例教学并不适用于所有的教学内容。有些教学内容,如果案例较小,学生会认为案例不实用,因而没有兴趣思考和完成。如果案例过大,涉及的知识和技术过多,教学内容的重点就不突出。这种情况可以考虑问题驱动式教学方式。具体实施时,学生按照老师预先给出的学习的内容以及相关的参考书籍和网络学习资源进行自主学习[2]。在学习过程中如果遇到困难,建议首先采用网上搜索和同学之间相互讨论交流来解决问题。如果还有无法解决的问题,可以通过QQ等方式与教师讨论交流,教师在解决个别问题的同时也可以掌握学生的难点问题,在课堂教学时即可有针对性地突出重点难点。采用这种教学方式,学生通过课前的知识学习和讨论,在课堂上就能够更好地带着重点和难点听讲,并能够跟随老师的节奏互动和提出问题,而在解决问题过程中与同学和老师的讨论交流,可以让学生体验自主学习的乐趣,更能激发不同学生个体的学习兴趣和成就感,充分发挥学习的主动性,同时还可以培养交流能力和表达能力。
按照工程教育专业认证的要求,实践教学的目的不仅仅是验证已知的理论,训练基本实验技能,更重要的是要培养学生具有实践动手能力,以及根据所学知识解决复杂工程问题的能力。
目前面向对象程序设计课程的实践教学环节仍采用两种方式:上机实验和课程设计。但是实践内容已进行了改革,在不同层次上培养学生解决问题的能力。上机实验分成验证型和设计型实验。验证型实验强调学生编写测试程序、调试程序的能力。在此基础上完成设计型实验,该类型的实验以实际项目基础部分的实现作为实验内容。最后,将设计型的实验项目扩展成课程设计,实践内容的复杂性和综合性逐步递增,不断提高学生分析问题和解决问题的能力。
仍以“继承与多态”章节对应的实验为例,验证型实验要求学生测试教材上的雇员“Employee”类的例子[3],并给出不同的数据完成调试,理解继承与多态的基本概念和实现。设计型实验的题目则是参考这个例子,实现一个人员基类,包括属性姓名、性别、年龄,再由该基类派生出教师类和学生类,教师类增加工号、职称和工资,学生类增加学号、年级、专业和入学成绩。要求完成应用程序,利用vector存放一组“人员”类指针,并根据人员类型的不同显示不同的内容,如教师除了显示姓名、性别和年龄外,还要显示工号、职称和工资,学生则除了显示姓名、性别和年龄外,还要显示年级、专业和入学成绩。以此实验的完成为基础,学生可以将其扩展成一个人员管理信息系统,并作为课程设计的内容。
为了弥补实验教学学时的不足,进一步调动学生学习的主动性,培养学生独立思考、团结合作和创新的能力,本课程也开设了课程设计。通过课程设计可以使学生加深理解所学的面向对象程序设计的相关知识,并培养学生解决复杂工程问题的能力。
针对不同学生的兴趣,课程设计的题目分成三大类:管理信息系统类、应用类和游戏类[4]。目前已经开发的课程设计题目见表2。
表2 面向对象程序设计(C++)课程设计类别与题目
面向对象程序设计在计算机科学与技术专业的教学中非常重要, 近3年进行的教学改革,将案例教学、问题驱动式教学方法付诸实施,同时扩展了课程设计选题所涉及的应用领域。这些措施有利于学生理解和掌握面向对象的编程思想,也有利于提高学生解决复杂工程问题的能力。以课程目标达成度为例,2017级计算机科学与技术专业学生面向对象程序设计课程的成绩,相对2016级的学生而言,对应4个毕业要求的课程目标的指标点达成度平均提升0.1。