以“软件设计模式”促进“面向对象程序设计”课程教学方法研究

2019-10-08 11:55尹梓名周雷郑建立
软件 2019年8期
关键词:教学方法

尹梓名 周雷 郑建立

摘  要: “面向对象程序设计”是高校计算机类专业的核心课程,其中有关面向对象的继承、多态、反射等概念一直是授课讲解时的难题,缺乏能将这些概念应用并向学生解释清楚的案例。本文基于“知识降维”思想,将软件设计模式这门课中的部分通俗易懂的内容经过简化后引入“面向对象程序设计”的课程中,解决了讲解面向对象概念缺乏案例,学生不易理解部分抽象概念等问题,同时加深了学生对于这些概念的理解,取得了较好的课堂效果。

关键词: 面向对象程序设计;软件设计模式;教学方法

中图分类号: TP311    文献标识码: A    DOI:10.3969/j.issn.1003-6970.2019.08.049

本文著录格式:尹梓名,周雷,郑建立. 以“软件设计模式”促进“面向对象程序设计”课程教学方法研究[J]. 软件,2019,40(8):216219+228

【Abstract】: “Object-oriented programming” is the core course of computer specialty in colleges and universities. Concepts such as inheritance, polymorphism and reflection of object-oriented are always difficult problems in teaching. There are few cases that can apply these concepts and explain them clearly to students. Based on the idea of “knowledge dimensionality reduction”, this paper simplifies some easy-to-understand contents in the course of software design pattern and introduces them into the course of “object-oriented programming”. It solves the problems of lack of cases in explaining object-oriented concepts and difficulty for students to understand some abstract concepts. At the same time, it deepens students' understanding of these concepts and achieves better effects.

【Key words】: Object-oriented programming; Software design patterns; Teaching method

0  引言

“面向對象的程序设计”一直是高校计算机相关专业的专业基础课[1],是学生学习其他多门计算机课程的基础,所以是计算机教学课程的重中之重[2]。但是在面向对象的教学过程中,如何让学生从“面向过程”的编程思维转变为“面向对象”的编程思维,并快速地树立“面向对象”的编程思想一直是这门课程的教学难点。笔者在高校中同时兼任“面向对象程序设计”和“软件设计模式”这两门课的教学工作,在教学过程中发现,如果把二者的授课内容穿插结合起来,既有助于学生对于“面向对象”编程思想的理解,也有助于学生对于面向对象程序设计这门课中部分核心概念的理解[3]。但是,一般认为“软件设计模式”是“面向对象程序设计”的后续课程,是面向对象思想的高级应用[4]。如果不经修改直接把“软件设计模式”课程中的部分例子挪到“面向对象程序设计”的课堂,反而不利于学生理解,加深学生的困惑,不会起到非常好的教学效果。所以本文基于一种“知识降维”思想,即将“软件设计模式”中的知识充分简化后,结合实际例子[5],再放到“面向对象程序设计”的课堂进行讲解,会使学生从中受益。

1  课程定位及教学目标

1.1  面向对象程序设计

“面向对象程序设计”是计算机相关专业本科生的一门专业基础课。该课程主要讲授面向对象程序设计的思想和方法,使学生深刻理解和领会面向对象程序设计语言的基本概念、基本语法以及面向对象程序设计的精髓:抽象、封装、继承、多态及模板等,使学生养成面向对象的编程思维习惯。在此基础上,通过大量的程序实例,使学生熟练运用面向对象程序设计的方法分析和求解实际设计问题,使学生充分掌握面向对象程序设计的精髓。该课的前修课程是C语言或者有其他程序设计语言 基础[6]。

1.2  软件设计模式

“软件设计模式”是计算机相关专业本科生的一门专业选修课。该课程是一门具有较强理论性和实践性的软件设计和开发类课程。主要学习软件设计模式基础知识、UML类图、面向对象设计原则、常用的创建型设计模式、结构型设计模式和行为型设计模式。本课程要求学生掌握常用软件设计模式的动机、定义、结构、实现、使用效果以及应用实例,能够将所学知识应用到实际软件项目设计与开发中,进一步培养学生的工程实践能力和专业技术水平,为今后从事相关工作奠定基础[7]。

本课程面向的学生是前期已经学习过“面向对象程序设计”,并具有一定的项目开发经验,但对面向对象的编程思想认识较肤浅,对设计模式还没有概念。通过本门课的学习,使学生对软件架构方法和面向对象有一个深入的了解,通过程序的不断重构和演变,把设计模式的学习门槛降低,使学生初步掌握程序的设计模式[8]。

2  面向对象和设计模式课程之间的关系

经过多年的教学实践,笔者深刻地体会到“面向对象程序设计”和“软件设计模式”是两门关系极为密切的课程,就好比是武侠小说中“九阴真经”的上卷和下卷,必须同时修炼才能达到良好的效果。“面向对象程序设计”这门课是“软件设计模式”的基础,而“软件设计模式”是“面向对象程序设计”的升华。一般学校的计算机专业在设置课程的时候都会把这两门课设为不同的课程,建议学生选课时两门课都选,如果只选择其中一门课则不会达到良好的学习效果。如果只学习面向对象而没有学习设计模式,则无法深刻理解面向对象这种编程方法的好处,最突出的问题就是不理解抽象类和接口这些多态技术的意义,学生在学习中最突出的疑问就是“既然已经有了普通类,为什么一定要使用抽象类?”一旦解决这个疑惑,将极大有助于他们对于面向对象思想的理解。而这个问题的最好的答案就在设计模式中。非常多的设计模式都能体现出使用抽象类编程的好处。反过来,如果只学习设计模式而没有学习面向对象,由于缺乏面向对象的编程基础和思维训练,很难去深刻理解利用设计模式编程的妙处,需要付出极大的努力才能完全掌握。两门课的关系可以归纳为“面向对象,入门根基;设计模式,登峰造极”。

3  以“软件设计模式”促进“面向对象程序设计”课程教学案例

本文为了说明如何以“软件设计模式”促进面向对象的课程教学,选取了三个案例。这三个案例分别对应“面向对象程序设计”教学中比较难以讲解的三个问题:一是继承,二是反射,三是多态。

3.1  案例1——设计模式促进学生对于继承的理解

继承是面向对象程序设计中的基本概念,与封装和多态合称面向对象的三大基本特征。一个类从另一个类派生出来时,称之为派生类或子类,被派生的类称为基类或父类。派生类从基类那里继承特性,从一个基类派生出来的多层类形成了类的层次结构。继承的优点:1、提高代码的复用性;2、提高代码的可扩展性。

如何向学生讲解“继承”这个概念,是“面向对象程序设计”这门课要解决的重要问题之一。对于初次接触面向对象的学生来说,这是比较难以理解的概念。根据面向对象这门课的课程安排,“继承”一般是在“类和对象”这两个概念之后讲解,而学生在初步接受了“类”这个概念后,会本能地认为“需要用到哪个功能就将这个功能设计成一个或几个类”,不理解继承的功用。究其原因,这是因为学生接触到的软件设计题目都比较初级,还未接触到复杂的需要用到继承的题目。因此,从“知识降维”的角度,需要在课堂上讲解一个实例,对比使用继承和不使用继承二者的区别,就可以说明使用继承的妙处。

在设计模式中,几乎每一种模式都会用到类和类之间的继承,考虑到学生刚接触类和对象这些概念,对于面向对象的设计方式还处于较为粗浅的阶段,所以选择较为简单的一种模式——简单工厂模式来进行讲解比较合适。經简化后的讲解案例如下:

“某公司要编写图像编辑器软件,可以解析并显示各种格式类型的图像,包括BMP,JPEG,PNG等,该公司设计人员希望设计一个灵活易用的图像编辑器,通过设置不同的参数即可显示不同格式的图像,而且可以较为方便地对图像编辑器进行扩展,以便能够在将来增加一些新类型的图像。”

本题目对于初学的学生来说,如果不使用继承,而是用到什么功能就设计什么类,会设计成如图1所示。

从图中可以看出,客户端(Client)要与三种图像格式类打交道,每个类中都维护了描述图像基本

信息的字段,如图像的高(Height),图像的宽(Width),图像的分辨率(Resolution)等。本文只是举例,如果在实际工程项目中,需要处理的图像基本信息会更多。这部分字段在各个类中无疑是冗余的。如果某部分代码有问题,就需要在所有的图像类中都进行修改,这会增加代码修改不彻底的风险。利用简单工厂模式,可以将该案例题目设计成如下形式:

如图2所示,Image是简单工厂模式的抽象产品类,ImageFactory是简单工厂模式的工厂类,BMP,JPEG,PNG是简单工厂模式的具体产品类,是Image这个抽象类的子类,分别对应三种图像格式。如果要求图像编辑器再增加解析GIF格式的图像,只需要将GIF类继承抽象的Image类,由于在Image类中已经有图像的基本信息字段,这些字段同样可以用在GIF图像的解析过程中,所以不必再在GIF类中定义,简化了代码。

从这个例子中可以看出,将跟图像相关的各种图像格式共有的类成员放到抽象类中,在子类中不需要将同样的代码书写多次;同时将对于不同格式图像的解码方法Decode设置成抽象方法,在不同的子类中予以不同的实现,这体现了类之间继承的好处——代码复用与便于扩展。

3.2  案例2——设计模式促进学生对于反射的理解

反射是面向对象程序设计这门课比较难以理解的概念,通过反射可以在运行时获得每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、时间和构造函数等,还可与获得每个成员的名称、限定符和参数等。有个反射,编程人员即可对每一个类型了如指掌。如果获得了构造函数的信息,可以直接创建对象,即使这个对象的类型在编译时还不知道。

学生在学习反射时总是摸不清这个技术的优势,因为这部分知识相对独立,与前面的类和对象的知识是一种逆向关系。如果单从面向对象这门课很难举出一个例子来说明。如果结合设计模式这门课中的内容,就非常容易说明这个知识点的优势了。

在多种设计模式中,如果不用反射技术,就难以完全符合开闭原则,比如工厂方法模式,抽象工厂模式,适配器模式等。本文以工厂方法模式为例,说明在程序中使用反射的必要性。

图3为工厂方法模式的UML图。按照设计,客户端只需要和同为接口的抽象工厂类和抽象产品类打交道就可以。但是在实际运用中,如果不使用反射机制,客户端无法避免和具体工厂类打交道,这就造成当需要再增加一种产品时,就需要修改客户端的代码,这并不符合面向对象设计原则中的开闭原则(对扩展开放,对修改关闭)。运用设计模式的初衷就是让上层客户端只跟抽象层打交道而不和具体实现类打交道,这样才能使程序具备良好的扩展性。所以为了使工厂方法模式完全符合开闭原则,需要使用反射技术。客户端通过配置文件读取需要实例化的具体产品类名,然后通过反射技术生成这个类的对象,并将这个对象赋值给抽象工厂类的对象引用变量。以上即可实现工厂方法模式,又完全符合开闭原则。这个例子就可以说明反射机制的优势以及必要性。

3.3  案例3——设计模式促进学生对于多态的理解

笔者曾经在面向对象程序设计这门课中做过不记名投票,写出这门课比较难以理解的知识点,共有50人参与,每人最多写2个,共计90个,归纳起来投票结果如下:

从图4的统计数据可以看出,投票數量最多的三个分别是抽象类和抽象方法、虚函数、接口。这三个概念都是在程序多态设计中要用到的,所以可以看出,学生对于多态的概念的理解还是不到位,多态是面向对象程序设计教学中的重点,同时也是面向对象程序设计这门课最难理解的难点之一,需要教师在授课中花大力气去进行概念讲解、总结归纳与课堂练习。

多态是实现各种设计模式的核心手段之一。为了符合面向对象设计的开闭原则,很多种设计模式都分成相对稳定的抽象层和具备不同实现的实现层,这就实现了多态。抽象类和接口是设计模式实现多态的两种最常用的手段。设计模式中的关于抽象类和接口的用法和例题非常适合在面向对象程序设计的课堂上给学生讲解,用以加深其对这两个概念的理解。为了简化理解,降低同学们的学习负担,基于“知识降维”的思想,还是以设计模式中的简单工厂模式为例。如果不用抽象类,如图1所示,如果客户要求增加图像编辑器可以打开的图像类型,那么必须修改上层客户端的代码。而在实际中上层和下层往往是不同团队在负责,下层稍有修改,上层就要跟着修改,然后经过测试,发布等流程。这样设计程序,程序维护起来非常麻烦。

而采取图2的简单工厂模式,在客户端和具体的三个图像类BMP,JPEG,PNG之间加入一个抽象类Image,就可以使得程序的扩展相对容易。本文仍然以再增加解析GIF格式的图像为例,由于图像解析所需的字段已经定义在了抽象基类Image中,在GIF类中只需要重写GIF格式图像解析的Decode方法即可。增加GIF类后,虽然增加了解析GIF图像的功能,但是对于上层客户端来说,代码无需任何改动。因为客户端是针对抽象层来编程的,而抽象层是稳定的。本例可以说明使用抽象类的必要性。

4  总结

面向对象的程序设计对于接触计算机编程事件不太长的学生来说,很多概念有些难以理解。对于授课教师来说,缺乏能说明面向对象程序设计这门课中一些概念的例子。本文认为这些例子恰恰存在于软件设计模式这门课中。可以借助设计模式的部分例子,经简化后,去讲解面向对象课程中的一些概念,将起到事半功倍的效果,加深学生的理解。未来本研究还会运用一些教学质量评价模型去评价本教学方法带来的效果[9-10]。

参考文献

[1] 陈晶. 计算机科学与技术专业核心课程考核方式改革的研究[J]. 软件, 2018, 39(11): 33-35.

[2] 江红, 余青松. C#程序设计教程(第2版)[M]. 北京: 清华大学出版社, 2014.

[3] 钱诚, 徐煜明. 面向对象程序设计课程案例法教学探讨[J]. 电子世界, 2018(22): 100.

[4] 戴华, 杨志和. 软件设计模式课程的教学模式改革探讨[J]. 课程教育研究, 2017(31): 247-248.

[5] 李晓东, 魏惠茹, 董振华. 项目驱动教学法在计算机程序设计语言课中的探索[J]. 软件, 2015, 36(4): 107-109.

[6] 李建伏, 沈中林, 衡红军. 案例教学法在面向对象程序设计课程中的应用[J]. 软件, 2015, 36(3): 48-51.

[7] 刘伟. C#设计模式[M]. 北京: 清华大学出版社, 2013.

[8] 王晓丽, 徐敏, 李芳巍, 等. 比较教学法在医学院校计算机基础课程中的应用[J]. 软件, 2018, 39(7): 48-51.

[9] 康苏明, 张杰, 张景安. 基于云模型的高校课堂教学质量评价模型及方法研究[J]. 软件, 2015, 36(4): 50-54.

[10] 石黎, 孙志梅. 教学质量评价的BP神经网络模型[J]. 软件, 2015, 36(3): 19-21.

猜你喜欢
教学方法
教学方法与知识类型的适宜
数学复习教学方法
浅谈高等数学中教学方法的创新
实用型中医人才培养中慕课教学方法的探讨
文言文教学方法实践初探
高中文言文教学方法之我见
中医康复学教学方法探讨与实践
语文阅读教学方法略谈
我的教学方法