徐 翔
[摘要]C++程序设计是计算机专业的核心课程,目前在教学过程中普遍存在重“语法”,轻“设计”的现象。给出一种新的教学方法,通过采用故事演绎,结合UML进行面向对象分析,以及案例教学的方式引导学生提高实际的编程能力,达到较好的效果。
[关键词]C++ 面向对象 UML
中图分类号:G42文献标识码:A文章编号:1671-7597(2009)0120155-02
一、引言
C++是一门面向对象的程序设计语言,在讲授C++程序设计的过程中,应该注重面向对象思想的灌输。但是,在实际的教学过程中教师往往将重心放在讲授一些语法和语句结构上,对学生面向对象的系统分析和设计能力的培养没有落到实处,最终导致学生学习完C++后,仍然只知道C++语言本身的一些语法,对于老师提出的诸如“如何找类?”、“每个类的属性和行为应该有哪些?”等问题仍然无从回答。没有真正掌握面向对象的思想方法,更谈不上解决实际问题,同时也严重影响了后续课程的学习。因此,有必要对该课程的教学内容和教学方法进行改革。
二、教学改革探讨
(一)以故事演绎的方式建立面向对象的世界观
传统的教学方法都是直接介绍C++语言对类、继承和多态的语法实现和编写规则,但是却忽略了对学生进行面向对象世界观的建立,导致很多学生学完了课程后,虽然掌握了类的编写语法,但仍然不明白应该何时去使用类去构建系统,到底应该构建哪些类,最终导致去解决实际问题时,虽然表面上使用了面向对象的语言和面向对象的工具,但其实还是假对象。这种现象非常普遍,他们中的对象绝大多数不过是对传统程序的一个简单包装,却根本没有考虑到面向对象的目的:抽象、继承、高效率、可靠性、灵活性、更好的体系结构、更快的客户响应等问题。因此,在学习具体面向对象编程之前,让学生建立起面向对象的世界观尤为重要。
因此在教学内容的安排上,我们不急于向学生讲授C++的相关语法,而是首先通过采用一些通俗简单的生活事例来演绎对各种面向对象的基本概念的认识。比如我们会举例“某位同学考上了研究生”,然后引导大家对他考上研究生的过程进行故事演绎,通过从以下几个不同的角度培养学生去看待故事中的事物:
角度一:故事里有什么事物?
角度二:每个事物看上去是什么样的?
角度三:每个事物能做什么?
角度四:这些事物之间有什么关系?
角度五:这些事物最终是如何完成目标的?
学生完成了对问题的讨论后,也就自然了解了找对象的过程,以及对象的属性和方法。同时也了解了对象之间是如何通过分工合作,相互发消息完成最终目标的。在轻松愉快的环境中让学生树立起面向对象的世界观。提高了学习面向对象编程的热忱。
(二)结合UML进行面向对象分析设计能力的培养
为了培养学生面向对象的分析问题和解决问题的基本能力,我们在教学内容上还设置了“面向对象的系统分析和设计基础”部分,该部分主要从系统分析和设计的角度出发解释面向对象的系统设计的基本过程,使学生了解面向对象的基本概念,培养学生采用面向对象的思维去思考问题、分析问题的能力。
在这个阶段我们设计了一个“超市销售系统”的教学案例,通过对案例的分析,培养学生如何从需求说明书中通过词汇分析获取类的参考列表,如何获取在类的参考列表的基础上,根据实际的系统需求完善类的层次结构等等。
在这个阶段借助UML建模工具Rational Rose,以图形化的方式描述整个系统的类之间的关系。UML是标准的建模语言,它内容丰富,功能强大,在通过大约为期两个星期的面向对象的系统分析训练之后,学生基本上能完成对该系统的类模型和时序模型的建立,达到了预期的效果。
以“超市销售系统”的教学案例为例,具体实施过程如下:
1.提出需求
为某超市开发一款销售系统,完成日常销售业务。基本要求如下:
编写一个函数实现客户购买商品找零的过程模拟。其中每种商品有一个标价,但是客户在购买时除了按标价付费外,还必须支付额外的税费,而且不同类型的商品计算税费的方式不同,具体描述如下:
衣服:税费=0.01*标价。
食品:税费=0.03*标价。
电器:如果标价>1000,税费=50元。否则,税费=0.05*标价。
其次,客户分不同的等级,每种等级的打折策略不同,具体描述如下:
钻石会员:购买总费用>1000,返现300;否则打75折。
金卡会员:购买总费用>1000,返现200;否则打85折。
银卡会员:打95折。
2.引导学生完成类的设计
在完成了面向对象的分析和设计后,给出系统中现有类的实现,学生在老师的引导下,都能写出诸如“衣服”、“食品”、“电器”、“钻石会员”、“金卡会员”和“银卡会员”等类。并给出每个类的相关属性和方法的定义。(见图1)
3.构建类的继承体系
在完成了类的定义后,引导学生发现类之间的共性,从而将这种共性抽象到一个共同的基类中,并完成整个系统的继承体系的构建。完成这一部后,学生已经能感觉到这种抽象继承所带来的好处了。(见图2、图3)
4.编写通用的交易函数
系统最终的目的是要写一个函数实现客户购买商品并完成找零的过程模拟,同时老师在这一阶段提出更高的要求,希望这个函数足够通用,不会因为新增的商品和新的会员类型而发生修改。此时,将多态所带来的隐藏具体实现,解决相似性问题的好处讲解给学生听,并通过继承和虚函数给出实现形式,让学生在实践中明白什么叫做“同一接口,多种方法”。以及多态性所带来的简化程序设计逻辑,增强程序的可读性与可维护性。(见图4)
5.最终实现代码
通过对上述教学案例的演绎,真正让学生明白了面向对象的强大所在,也激发了学生对编程的热爱,为今后用面向对象的方法解决实际问题打下了坚实的基础。实践证明,通过这样的改革实践,效果是很明显的。
三、总结
面向对象技术的基础是封装,面向对象的核心是多态,而多态是接口和实现分离的更高级升华,使得在运行时可以动态根据条件来选择隐藏在接口后面的实现,面向对象的表现形式是类和继承。面向对象的主要目标是使系统对象化,良好的对象化的结果,就是系统的各部分更加清晰化,耦合度大大降低。通过让学生彻底了解C++语言和面向对象的关系及其特点,才能理顺面向对象程序设计的思路。
本文探讨了在教学中通过如何树立学生面向对象的世界观,培养学生面向对象的分析设计能力,让学生掌握如何运用C++语言完成面向对象的程序设计等方面的教学改革实践。除上述讨论的问题以外,在《C++面向对象程序设计》课程教学过程中还会遇到很多的问题。这只有通过不断的分析、探索和研究才能找出更好的解决方案。
参考文献:
[1]刘宗田主编,C++编程思想[M].北京:机械工业出版社,2005.
[2]钱能,c++程序设计教程[M].北京:清华大学出版社,2004.
[3]张迎新,面向对象程序设计课程的研究[J].北京工商大学学报(自然科学版),2003,(4).
作者简介:
徐翔,男,湖北仙桃人,硕士,讲师,主要研究方向:软件工程。