教授面向对象(c++)由外到内vs由内到外的方法

Teaching OOP (C++) outside-in vs inside-out approach

本文关键字:vs 方法 面向对象 c++      更新时间:2023-10-16

我在一所高中经营一个编程俱乐部,我用c++中简单的类向我的学生介绍OOP。我相信至少理论上他们明白这个道理。我希望能够提供给他们一个具体的项目,他们可以一起工作。我的问题是采取哪种方法。当我在大学学习编程课程时,我看到了两种不同的方法,但在我看来,它们都有严重的缺点。最后,我大部分时间都是在睡觉,然后自己从书本和例子中学习。现在我站在老师的立场上,我想听听你的意见,哪种方法更好,或者是否有第三种选择。

方法1是在黑板上(或者在有投影屏幕的计算机上)写程序。类定义总是首先编写的。通常学生在这一点上看起来真的很困惑,因为变量和方法的目的对他们来说似乎完全模糊不清。他们唯一一次了解每个变量和方法的作用以及它们是如何相互作用的,是在讲师最终编写实现的时候(我称之为由外而内的方法)

方法2是解释我们试图实现的目标,并根据需要创建类和成员。这有相反的问题。他将编写一个方法,该方法将使用这些稍后必须实现的假想类。但学生们不知道其他课程是如何运作的。

碰巧我是靠当老师挣钱读完大学的。我现在是一个软件工程师。

根据我的经验,学生在编程项目中投入情感是至关重要的。我马上回答你的问题,这是一个必要的开场白。

为了达到这个目的,我把节目的主题定为他们真正感兴趣的东西,不管它看起来有多傻,只要它是与他们的世界有关的东西。

所以,这可能是(取决于你的学生的年龄)关于歌星的天赋水平排名,包括贾斯汀·比伯。你可以想象当时的喧嚣。

比如,下载他们的歌词,数一数他们说"宝贝"这个词的次数。一些有创意的,有趣的。

这会让"枯燥"的问题变得生动起来。比如,"歌手"课程应该是什么样的。为什么它应该有像"八度范围"这样的属性,这是很直观的。

singer类应该有一个叫做barfOnStage的方法吗?(比伯一家不久前在舞台上吐了)。当然,为什么不呢?他们很容易看出方法和属性之间的区别。

我的意思是,我只是随口说说,我相信你可以运用你自己的创造力和创造力,为你的孩子做任何适合的事情。

我很想听听你是怎么做的,以及孩子们的项目结果如何。

对于初学者,我会使用修改后的第2种方法,即从一个简单的问题开始,然后在此基础上进行构建。经验是最好的老师....就像我的高中老师让我们"迭代"20个离散变量作为一个"列表",然后教我们数组....

你需要选择正确的问题。它需要是一个锻炼"面向对象肌肉"而不是"算法肌肉"的问题。它需要是一些你可以在它上面建立需求的东西来练习面向对象。一个简单的CRUD程序就足够了。你只需要约束他们使用对象,而不是数组,我认为他们会很舒服。我将把具体的规格留给你。

首先,让他们写一个程序,只允许他们将记录添加到"数据库"。仅仅通过在他们的"数据库"中创建一个"行",他们将被迫学习如何创建一个对象并实例化一个对象。

下一个,让他们修改他们的程序来显示他们的'数据库'的内容。当他们读取他们的"数据库"时,他们会使用。show函数或者你实现该功能的任何方式。

第三个,让他们这样做,以便他们可以改变'记录'的内容。更新将强化如何告诉对象修改自己。

最后,他们应该修改程序以允许删除"记录"。这将加强适当的对象销毁。

进入下一个层次(因为这是c++),你可以:

  • 要求他们实现他们的'数据库'作为一个链表

  • 写规范,这样你就可以做一些需要对象的事情

  • 增加了数据的作用域,使程序结构更好通过模板或继承(vehicle 'database')来实现例如汽车和摩托车)

根据我的经验,做是最好的老师。让别人教我如何做某件事(或作为一个小组在黑板上做这件事)会缩短学习的时间。与它搏斗并获得一些苏格拉底式的指导,可以让你更深入地理解它,并产生更好的编程大脑。

如果他们还没有准备好做"创建"功能,那么在白板上以小组形式编码就可以了,但是一旦他们有了一个如何将所有东西组合在一起的模板,他们就需要在电脑后面弄清楚。

如果这是一个初学者编程课程,我会说面向对象方面是一个小问题。关注表达式、语句和控制流。

如果重点是面向对象,我会说从面向对象的历史和面向对象的重点是什么开始。从中我们可以看到如何用不同的语言来描述这些概念。(即ADT, Simula等http://retis.sssup.it/~lipari/courses/oosd2010-1/02.oop.pdf)

…然后进行实验。

"如果我们看一下整个历史,我们会发现oop的原型是从ADT开始的……"——Alan Kay (http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en)