递进案例在《面向对象程序设计》教学中的应用
2018-12-21马慧翁佩纯
马慧,翁佩纯
(电子科技大学中山学院计算机学院,中山 528400)
0 引言
《面向对象程序设计》是计算机专业的一门重要的基础课程,是编程语言教学中的重点也是难点。该课程要求学生了解面向对象程序设计的基本思想、掌握面向对象编程的技术,为大型应用软件设计与开发打下良好的理论和实践基础。在教学实践中,有学生反映课程很难学,甚至有个别学生对编程产生畏惧的情绪。笔者结合实际的教学工作,分析课程教学过程中碰到的主要问题和成因,浅谈如何引入递进案例方法提高教学质量。
1 教学过程中存在的问题及原因
以往在教学过程中主要存在的问题及原因如下:
(1)学生对面向对象程序设计的学习的目标不明确,学习动力不强。由于学生相对欠缺项目经验,对面向过程程序设计在大型软件开发过程中遇到的代码难维护、难扩充等问题意识不足,仅从软件功能的角度看问题,以为已经有面向过程编程的方法已经可以写软件了,不理解为什么需要学习面向对象程序设计。
(2)教材对面向对象程序设计技术的描述过于侧重语法,缺乏思维引导和结合应用的分析,较少围绕“为什么面向对象程序设计包含了这个技术点?”“什么情况下需要使用这个技术点?”“如何使用这个技术点?”等问题展开讨论,导致学生停留在“知其然而不知其所以然”的阶段,即使掌握了面向对象程序设计的语法,还是没领会到面向对象程序设计的思想精髓,不懂运用。
(3)教材和课后习题以每一章节的知识点为目标设计,缺乏系统性与连贯性,缺少对知识综合运用能力的训练。
2 引入递进案例提高教学质量
针对上述问题,笔者在教学中使用递进案例,根据教学目标和内容需要,采用案例组织学生进行学习、研究、锻炼,把教授和学习的重心放在案例的分析和领会上,而不是以教材的理论知识点为中心[1-2]。旨在让学生在理解案例所涵盖的知识点后,通过模仿案例到灵活运用设计创新,到达学习的目的。本节讨论递进案例设计和运用过程。
(1)案例的编写
首先,案例保持内容的连贯性与递进性[3]。案例以编写某个软件为目标,与教材内容章节顺序保持一致,在前一次课完成的功能的基础上,提出丰富软件功能的新需求,引入新的知识点学习。整个过程由简到繁,循序渐进,将知识点串联起来,引导学生在学习过程中承前启后、举一反三。同时,案例的设计要考虑趣味性[4]、实用性和可操作性。例如,计算机专业的学生通常喜欢游戏,可以以游戏为例子吸引学生。此外,案例的编写要详尽,对于每个知识点,需要写清楚它的作用、适用场景和相关代码,使得学生在课后能通过阅读案例深入理解、掌握知识点,并会模仿、应用。
(2)案例的运用
笔者在使用递进案例进行教学的时候,采用“提出需求、抛出问题、分析问题、讲授知识点、布置任务”的路线进行讲解。首先,在第一次上课的时候向学生介绍案例的内容,说明要实现一个什么样的软件,具体要实现哪些功能。然后,给学生布置课程设计,让学生实现与案例软件相关的另一个模块,要求在后续的学习过程中每次学到新技术后,能模仿案例将新技术点用到课程设计中。每次课堂按以下步骤展开:
①提出需求。结合新知识点,提出给软件增加某个功能,要求学生采用以前学过的面向过程程序设计的方法实现。
②提出问题。要求学生思考:在用面向过程程序设计方法实现该功能的时候,遇到什么困难?提示学生从代码管理、代码可扩充性等方面思考。
③分析问题。要求学生分析困难出现的原因,总结面向过程程序设计在大型软件开发过程中的不足之处,让学生领悟到:“在这种应用场景下,需要利用面向对象程序设计的技术去解决这个问题。”,激发学生的学习兴趣。
④引入新知识点。结合教材的例子讲解知识点的语法。在讲解过程中,对于部分难以理解的内容,像构造函数、析构函数、拷贝构造函数、动态内存分配等,可以采用动画形式演示,让学生对这些抽象的过程有较具体的理解。然后结合案例演示知识点的运用将知识点扩大为知识面,最后由形象到抽象,揭示概念本质。
⑤布置任务。任务分两部分内容。首先,要求学生完成教材的习题,通过语法关。然后,要求学生模仿案例,将新知识点运用到课程设计中。
3 一个具体的案例
本节分享笔者在教学中使用的递进案例。在我院,《C++面向对象程序设计》这门课安排在一年级第二学期上,作为《C语言程序设计》的后续课程。笔者在上《C语言程序设计》的时候,要求学生用面向过程程序设计的方式实现一些小游戏,例如猜数字游戏、打字游戏等。由于学生对游戏都比较感兴趣,所以收集了不少优秀作品。在面向对象程序设计课程中,笔者设计了一个实现“小游戏集锦”的递进案例,要求学生在学习完整套案例后,实现游戏玩家管理的模块。
教材一般按照类的封装性、继承性、多态性的顺序组织内容,对应地,案例的内容设计也基本按照上述顺序展开。
(1)类和对象的概念。将多个小游戏的代码分发给学生,要求学生把代码汇总成一个“小游戏集锦”的程序。让学生设计一个菜单入口,在菜单中选择游戏,进入相应的游戏界面。让学生体会到,这个貌似几行代码能解决的问题,会碰到诸如“全局变量名冲突、数据和函数的关系不明显”等的麻烦。接下来,引入类和对象的概念,介绍类的作用,再讲解类的语法。在案例中演示如何将每个游戏单独写成一个类。要求学生在掌握了类的语法后,写一个玩家类。
(2)类的封装性。举一个“窜改代码关键变量”的例子,让学生理解封装性的作用。要求学生在玩家类里实现对玩家数据信息的封装。
(3)构造函数、析构函数、拷贝构造函数、静态成员等。结合某个游戏类,对类增加恰当的需求应用,展开对这些知识点的讲解。例如,在游戏集锦中,仅要求每个游戏类生成一个对象。可由此需求引入静态成员的知识点进行讲解,然后演示如何设计单例模式解决这个问题。
(4)类的继承与派生。要求增加功能:统计每个游戏的进入次数。用户每进入一次游戏,该游戏的进入次数加一。在学习类的继承与派生之前,学生只能在逐个游戏类里面添加私有变量int count,并在各个类的游戏入口函数处增加count++的语句。提问学生:如果有一百个小游戏,是否需要分别在一百个类里面做重复的定义count和count++的操作?如果有一个类忘记对count加1会出现什么情况?引入面向对象程序设计的另一个重要特点——继承。在案例中,定义一个游戏基类Game类,Game类包含成员count,再派生出各个小游戏类。要求学生掌握类的继承与派生之后,写一个游戏的游客类。游客类与玩家类的区别在于,游客类每的对象每次登录游戏集锦时,分数清零;玩家类的分数不清零。要求思考该如何对游客类和玩家类的代码进行重构、设计。
(5)类的多态性。多态是面向对象程序设计最复杂也最难诠释的一个特点。在案例中,要求增加功能:菜单按游戏的热门程度(进入游戏的次数)排序。提问若采用已学过的知识,这种做法是否方便:定义一个数组统计各类小游戏的访问次数,然后对数组进行排序,得到小游戏的菜单列表,再根据用户输入的选择找到相应的游戏入口函数。引入基类指针指向派生类对象和多态的知识点,提出可以将Game类设计成虚基类,采用Game类指针数组存储指向各个小游戏的对象的指针,则可以方便地对指针数组排序,实现按游戏热门程度排序的功能。要求学生掌握多态性的知识点后,写一个在线玩家(包括游客)的列表,要求将在线玩家和游客按游戏成绩排名显示。
4 结语
《面向对象程序设计》是计算机专业的一门重要的基础课程,该课的学习质量直接影响专业后续课程的学习。本文探讨了教学过程遇到的一些问题,分析了学生学习困难的原因,讨论如何用递进案例教学,通过递进案例让学生脱离枯燥的语法学习,将学习重心转移到对知识点的领悟与运用上,提高教学质量。
[1]廖湖声.面向对象程序设计课程的教学改革探讨[J].计算机教育,2016.3.
[2]王文冰,李辉.以实例贯穿课堂的面向对象程序设计课程教学改革[J].计算机教育,2011.1
[3]肖志娇.以游戏为实例进行面向对象程序设计趣味教学[J].现代计算机,2011(1):14-16.
[4]王婧.游戏案例在面向对象程序设计教学中的应用[J].电脑知识与技术,2016,12(2):124-126.