以设计思想为导向的面向对象编程教学改革

2019-02-26 09:50:54陈荣鑫
计算机教育 2019年12期
关键词:设计模式面向对象编程

陈荣鑫

(集美大学 计算机工程学院,福建 厦门 361021)

0 引言

面向对象编程是目前高校计算机专业的一门重要学科基础课程。面向对象设计思想在现代软件开发实践中非常重要,其指导作用体现在小至对程序功能的编程实现,大至项目开发层面的软件工程,因此设计思想的培养成为面向对象编程教学中的一个关键点。传统的面向对象编程的教学过程中,通常采用主流的面向对象编程语言,Java 或C++等作为授课载体。授课内容组织往往以介绍语言的语法及功能为主线,再加入面向对象的设计方法。教学的出发点基本上局限于对特定一门编程语言的介绍,而未能真正凸显其中的设计思想[1]。由于在现有的教学课程体系中,面向对象课程往往不是首门编程课程,学生通常已经完成一门高级程序语言设计的系统学习,比如大多数学完了C 语言,具备了一些自学新语言的基础,如果该门课的教学定位仅限于对另一门新的高级语言的学习,将难以体现课堂教学的必要性。少数经典教材[2]在内容阐述中注重强调设计思想,但包含的内容较为庞杂,因课时所限,教学中需要加以选择。

1 课程定位

在编程开发的相关课程体系中,面向对象编程课程发挥着承上启下的关键作用,如图1 所示,本门课的前导课程是低年级开设的C 语言程序设计,其面向过程的基本语法和模块化编程方式为学习面向对象的高级语言提供了编程基础,而数据结构课程则为解决实际问题提供了算法设计基础。后续直接相关的课程有JavaEE 架构技术和Android 应用开发。由于.Net 应用开发采用面向对象的C#作为授课载体,因此与本门课有较强相关性。在后续的软件工程课程中,面向对象的软件工程方法是一个重要组成内容,而面向高年级开设的创新创业类课程是培养学生解决复杂工程问题的必修综合实践类课程,面向对象设计与编程技术在很多软件开发类选题中不可或缺。毕业设计作为最后一个实践环节,同样有大量软件类选题采用面向对象技术完成设计与开发。

在当前广泛开展的工程教育认证中,如何培养学生解决复杂工程问题的能力是一个十分关键的议题[3]。面向对象的思想本质是要求尽可能按照人类认识世界的方法和思维方式分析和解决问题,而面向对象编程能够培养学生面向对象的设计思想和软件开发技能,因此可以成为培养学生解决复杂工程问题的一个重要途径。本门课的教学除了向学生提供面向对象语言工具的编程技能训练,还可以通过设计思想的系统训练向学生提供更高层次的指导。

图1 编程开发主要相关课程

2 教学内容构建

2.1 教学内容纲要

教学内容组织纲要见表1。将面向对象编程的教学内容划分为5 个模块,同时对应3 种层级,其中基础篇用于介绍Java 语言的基本语法,包括数据类型、数组、字符串、运算符、表达式和语句等内容。鉴于学生已经学过C语言程序设计,这部分内容与C 语言有很大交集,采用的是面向过程的设计方法,基本上简要介绍就可以。学完这部分后,学生基本上就可以使用Java 进行面向过程的软件开发。接下来讲授的是面向对象篇,这部分是面向对象编程语言特有的内容,也是本课程的核心部分之一,该篇要引入面向对象设计的基本思想和设计方法。学完该篇后,学生基本上可以使用Java 进行面向对象的编程。功能篇展示了作为一门完整编程语言所能提供的解决常见实际问题的基本设施,这些功能包括异常处理、泛型、GUI 界面设计、数据库操作、多线程编程等方面。有了前面面向对象的基础和Java实现功能支持,接下来讲授设计模式篇。该篇是面向对象设计思想的延伸和提升部分,也是本课程的另一个核心部分,其内容包括经典设计模式和其他扩展设计模式等。最后一篇是综合应用,通过较为完整地解析一个应用案例,把语言工具和设计思想加以融合应用,该案例以重构的方式逐步完善,把学过的关键知识点串联起来。

表1 教学内容组织纲要

考虑对设计思想系统化解析支撑度不够显著的教学内容压缩课时,主要涉及一些利用编程语言实现软件具体功能的内容部分,如界面开发、数据库应用开发和多线程编程等,而一些对案例讲解没有直接支撑的独立专题,则可根据实际情况作为选讲内容,或作为附录安排学生课后自学,如文件IO、网络编程等部分。偏重设计思想层级的教学内容包括面向对象篇和设计模式篇。

2.2 面向对象内容构建

面向对象技术能有效用于描述现实世界中各种对象及其相互之间的关系,包括抽象、封装、继承、多态等基本特征,因此,面向对象的程序中包含各种表示事物概念的类,表示具体事物的对象,表示消息操作规范的接口,体现不同抽象层次的继承关系,体现不同操作方式和结果的多态现象等。这些面向对象编程技术的核心内容需要逐一解析清楚,同时要阐明各部分知识点之间的联系。内容构建时需要精心编制案例以配合理论讲解,案例的特点是简明扼要,能反映基本设计思想,最好有一定的实际意义和趣味性。展示案例时应当在类、对象、方法等面向对象的基本元素的合理应用和组织上重点强调,而不能在算法和功能具体实现上着墨过多。在介绍综合设计较复杂的内容时,为了直观地展示设计意图,引入UML 描述手段。在衔接和综合这两个关键环节中教学内容的组织如下。

(1)与面向过程编程方式的衔接。通过一个银行账户处理的案例,演示把面向过程的实现方式改造为面向对象的实现方式的过程。应用场景中存在不同类型的银行账户,要实现存取款、转账等业务。先用C 语言实现该案例,采用结构体描述账户信息,增加一个结构体成员描述账户类型以避免一个结构体仅对应一种账户;业务功能采用函数实现,但数据和函数无法获得访问保护;业务操作需要直接调用函数,逻辑上显得凌乱。而用Java 语言实现时,采用类描述账户信息,把业务功能以方法形式封装在类里;同时通过访问权限设置提供了数据域和方法域的保护;不同类型账户则优雅地通过继承方式表示;业务处理时通过对象的方法调用实现消息传递。由于学生刚要接触面向对象编程,这个案例尽可能做到简洁,但需完整可运行以便做对比。通过对比,学生对面向对象的特点有了初步认识,体会到面向对象设计的优势。

(2)小综合。小综合是介绍完面向对象基本设施后的一次综合应用讲解,同时对面向对象设计思想进行阶段总结。举一个经典游戏“星际争霸”的应用场景。场景中有常规的人族(Terran)和虫族(Zerg),它们既有共同的技能也有各自独特的技能;此外要求新增一种新种族(XRace),该族同时具备人族和虫族的特殊技能。授课时展示设计和开发的思路,先根据需求定义各种概念,通过类和接口进行描述,理顺各个概念之间的关系,然后写出代码框架,此框架中的类和接口描述都是描述体为空的情况,但之间的继承或实现关系已经用Java 关键字写好了。接下来在该代码框架上补充功能方法,逐步完善功能的代码实现。在测试场景时,通过对上转型对象的操作来验证多态效果,以功能规范的视角测试接口回调。讲解过程中需要强调基本设计原则,比如面向抽象原则、单一责任原则等。

2.3 设计模式内容构建

设计模式是人们在解决特定问题时总结出来的可复用的设计方案。软件领域中,影响最为深远堪称经典的是由Erich Gamma 等人总结出的面向对象软件开发的23 种设计模式[4]。此外,人们在各种软件架构的开发过程中,也发展出很多实用框架级设计模式,这些模式在经典的23 种设计模式之外。现代软件系统的开发离不开设计模式的有效应用,比如JavaEE 框架体系中就用到各种设计模式,Andriod 系统亦是如此。如果没有设计模式的预备知识,对这些框架的理解和应用将难以深入。由于设计模式源于面向对象设计思想,然而又超越了面向对象语言的语法设施层面,这部分内容应当适当融入课程教学中[5],以丰富面向对象设计思想的内涵。鉴于设计模式内容庞杂而课时有限,有必要选择较为常用的模式进行讲解。这部分教学内容构建如下。

(1)经典设计模式。根据设计模式的目的,经典设计模式分为3 类,即主要用于创建对象的创建型模式,主要用于处理类或对象的组合的结构型模式,以及主要用于描述对类或对象的交互和职责分配的行为型模式。为了便于对比,从这3 类模式中,每类分别选取两种常用模式进行讲解。创建型选择单例(Singleton)模式和工厂方法(Factory Method)模式。学生学完这类模式后,将体会到对象的生成不再局限于new 操作,还可以根据实际需求选择更强大的生成方式。行为型选择命令(Command)模式和观察者(Observer)模式。命令模式展示了如何进行调用功能的封装。观察者模式是JDK 中高频使用的模式,JDK已提供相应的类和接口可以快捷地实现该模式。命令模式对于新增命令很容易扩展;而观察者模式则实现了主题和观察者之间的解耦,二者均体现了开-闭设计原则的优势。结构型选择适配器(Adapter)模式和代理(Proxy)模式。适配器模式提供了一种转换机制,使得接口不兼容的事物可以一起工作,提高了复用的可能性。代理模式能为其他对象提供一种代理以控制对这个对象的访问,分布式计算架构中的RMI 和Corba 即采用了这种机制,应用场景十分广泛。学完这类模式后,将体会到构建事物之间的关系不再局限于简单的继承和组合,还可以通过巧妙的设计去满足特定的需求。选用于解析设计模式的实例应尽量有实际意义,让学生理解设计模式在解决实际问题中的作用,体会到设计之美,进而在软件开发实践中考虑加以灵活应用。

(2)扩展设计模式。在当前很多面向对象软件构建中非常流行的设计方案,然而又在经典23 种设计模式之外,我们称之为扩展设计模式,如MVC(模型—视图—控制器)、DAO(数据访问对象)、DI(依赖注入)等模式。由于这些设计模式在企业级软件框架如JavaEE 中应用广泛,且能很好地展示面向对象的设计思想,有必要加以介绍。MVC 模式实现了业务逻辑、数据和界面显示的解耦,为软件系统分层可扩展提供了可能性。DAO 模式实现数据访问逻辑与业务逻辑的分离,能简化代码量并提高程序的可移植性。DI 模式则提高了软件组件的可复用性,便于搭建一个可灵活配置、易扩展的平台。这些实用的扩展模式进一步充实了教学内容。

3 教学方法探索

3.1 课堂教学方法

1)理论课教学方法。

在面向对象内容的教学中,强调面向对象设计思想在分析和设计过程中的作用,以实际例子和应用场景的引入,让学生理解面向对象程序设计语言所提供的各种语法设施的必要性和优越性。比如随着应用系统类别的增加,通过共性提炼引入了抽象类,并改造应用场景中的调用方式,以面向抽象的风格进行重构;而对于语言设施的关键技术细节需要解析到位,让学生知其然同时也知其所以然。比如在对象初始化和清理的讲解时,深入解析在复杂的继承条件下,以及各种访问权限下,静态与非静态对象的生命周期,可结合演示在集成开发环境里设置断点进行跟踪调试。对于设计模式内容的教学,原则是简明扼要,突出设计思想的应用。通过对精选的几个重要的设计模式的深入解析,以点带面,引导学生去自学其他模式。使用简洁而有趣味性的案例,增强授课效果。强调设计的规范性,但不强调算法的设计与实现,以免分散学习注意力。在综合类例子的讲解时,突出重构设计思想。举同一个应用场景案例,根据需求的变化,设计与实现逐步迭代,适时引入设计模式进行重构。让学生在学习过程中体会到软件开发过程是从无到有、从简单到复杂的迭代过程,符合事物发展的一般规律。

此外,积极采用教学辅助手段帮助学生理解设计思想。自主开发一款面向对象程序可视化与评分系统(OOPVS 系统),能实现程序的可视化处理,并提供对程序的评分功能。该软件的可视化功能采用标准UML 类图方式显示,用户可以在系统里直观地查看面向对象程序的结构,有助于理解较为复杂的设计思路,尤其是带有各种设计模式的情况。程序评分功能可对指定的程序进行比照处理,给出相应的相似度评分值,以便为改进设计提供参考。

2)实验课教学方法。

配套理论课的实验设计题目有验证型实验和设计型实验。验证型实验要求对章节主要案例进行调试并分析,促进基本知识点的掌握。对于综合类的验证题要求对较多相关知识融会贯通,比如要求对某个开源框架软件进行分析,发现并总结其中涉及的设计模式。设计型题目既要紧扣教学知识点,给出具体的要求,又要让学生有自由发挥的余地,鼓励具有个性化的设计方案。综合类的设计题目应该覆盖主要的知识点,给出的要求需有层次性,比如基本要求是设计某些指定的类和接口,完成特定的功能,以及应用指定的设计模式完成重构;进阶要求是尝试采用某几种设计模式的组合进行重构,分析重构的效果。此外,我们尝试通过OOPVS 系统对学生完成的作品与参考实现进行对比,通过积极反馈评分的结果给学生成就感,进而激发学生的学习兴趣,形成教与学的良性互动。

3.2 考核方法

学习效果的检验需要通过合理的考核机制来完成。在本门课教学实践中,对应各个教学阶段设置了平时、中期和期末这3 种考核。

平时考核是对理论课后布置的思考题和实验课布置的实验作业的完成情况进行考查。实验作业的题目内容紧扣章节内容,每次作业一般包括验证型和设计型两类题目。

中期考核安排在课程中期进行,这时已完成面向对象篇的教学。通过对平时考核情况进行甄别,按一定比例抽取好、中、差三类学生进行口试。口试的内容采用随机抽取做过的实验作业题目进行问答,可根据实际情况临场提新问题。中期考核的重要性在于可根据考核结果对存在的问题进行总结,为下一步的教学调整提供依据。

期末考核在课程结束后进行。考虑到本门课程的教学目标是培养学生的设计思想和编程技能,考核形式不采用传统的试卷方式,而是完成一个系统的设计与实现并参加答辩。学习完最后的综合应用篇后,学生对面向对象编程知识体系和开发技能有了整体的把握,初步具备解决较为复杂工程问题的能力。考核要求学生全面应用面向对象的设计思想完成一个完整系统的分析与设计,采用面向对象的语言进行编码实现。给出个性化的不同选题以降低抄袭的可能性;题目要求条目具有层次性,有必做要求和选做要求。口试前一周公布选题,要求全员口试,未参加口试的学生期末考核成绩记零分。口试之前同样需要根据学生的平时学习情况进行区分,以便提问有的放矢,节省时间并提高实效。本门课的课程成绩根据平时成绩占40%、期末考核成绩占60%的比例综合给出。

4 结语

根据面向对象编程课程的定位,把设计思想的培养作为教学的核心,克服了传统讲授一门编程语言的局限性,促进了学生设计思维的拓展。为了系统化把设计思想的解析融入教学中,改革的教学内容包含面向对象设计和设计模式应用这两个有递进关系的不同层面的内容,既兼顾了面向对象编程的语言工具内容,又突出了面向对象设计思想。设计思想虽然以Java 语言作为载体进行教学,但对C++、C#等其他主流的面向对象语言仍然适用。在教学实施过程中,根据教学内容发展与之相适应的课堂教学方法和考核方法,使得操作可行且有实效。笔者在最近一届实施教改后的学生学习情况中看到了较好的教学成效。比如在笔者讲授的JavaEE 架构技术课程中发现,学生对软件框架的理解程度和应用掌握情况普遍好于往届;而在后续创新创业这门综合实践课程中,涉及面向对象软件开发时,不少学生能自觉应用面向对象设计思想,结合采用合适的设计模式完成系统实现,获得较为理想的效果。

猜你喜欢
设计模式面向对象编程
仿生设计模式的创新应用探索
玩具世界(2023年6期)2024-01-29 12:14:36
“1+1”作业设计模式的实践探索
编程,是一种态度
少先队活动(2021年2期)2021-03-29 05:41:04
元征X-431实测:奔驰发动机编程
编程小能手
学生天地(2020年17期)2020-08-25 09:28:48
纺织机上诞生的编程
交通机电工程设计模式创新探讨
面向对象的计算机网络设计软件系统的开发
电子测试(2018年15期)2018-09-26 06:01:34
面向对象的数据交换协议研究与应用
面向对象Web开发编程语言的的评估方法