如何教面向对象编程 - 任何想法从哪里开始?

Mic*_*kan 17 c++ oop

我在高中,计算机培训机构等教授C++约两年.在教授了关于变量,数组,结构,函数的基础知识后,我总是以传统的例子开始面向对象的例子,如下所示:

class Person {
public:

 Person();
 ~Person();
 char* getFirstName(); //we can use std::string instead of char* in optimization part
 char* getLastName();
 char* getFullName();
 int getAge();
 bool getGender();
 void printFullProfile();

 void setFirstName(char*);
 void setLastName(char*);
 void setAge(unsigned int); 
 void setGender(bool);
 void setGender(char);//f for female, m for male.

private:
 char* first_name; //or std::string but i prefer to use pointers in the beginning.
 char* last_name;
 unsigned int age;
 bool gender; //ladies 1(st) , male 0
}
Run Code Online (Sandbox Code Playgroud)

然后完成这个Person类并教导新的东西,例如为什么getter和setter方法是邪恶的,并通过创建其他类(如学生,员工,主持人等)避免访问器,继承,多态,必要的OOP技能和概念.

[编辑]:并使这些类有助于解决编程问题.(比如计算每个Employee对象的工资,学生标记平均值,以及许多其他人)

另一个基本的例子是Vehicle类,Shape类等.

我想知道你如何(只是)开始一个OOP课堂的想法.

期待伟大的想法.

Ste*_*ont 12

我会在没有代码的情况下开始使用CRC卡.让班级扮演卡片角色,并进行真正的OO设计会话.在那里你可以介绍单一责任原则,谈谈has-a vs is-a和继承,封装.我遇到了太多程序员,他们对OO没有任何线索,仍然使用c ++,c#,java或delphi进行编程.

[edit]稍后你可能想比较基于类的javascript(或self)和基于原型的OO来讨论不同的分类方法.


小智 7

正如其他人所建议的那样,用现实世界的例子来解释事物; 比如Vehicle类和继承的Truck类.但这是重要的部分.一旦他们理解了现实世界的例子,他们就需要先看到与程序相关的例子,然后再真正理解为什么它对编程很重要.

我见过很多糟糕的C++代码,而且不只是那些不理解这些概念的人.我见过很多编码人员,他们确切知道对象是什么,可以完美地解释多态性和所有技术OOP术语.但如果他们不知道何时使用它,他们将永远无法充分利用它.我知道因为我自己就是这样.我曾在高中读过一本关于OOP的书,解释了所有的概念,但是在我实际使用它们之前我已经多年了,因为我没有看到它们真正有益于我的代码.尝试给出编程任务,在没有OOP的情况下进行编程会更具挑战性.学生自然会走更轻松的路,开始理解.做是最好的学习方式.

您可能有一个链表类,并要求它们继承它以通过编写自己的push/pop,enqueue/dequeue方法来创建堆栈或队列.或者创建一个二叉树类,并通过重写insert方法让它们进入二叉搜索树.使它们与动态内存一起工作,这样他们就可以看到为什么[copy]构造函数/析构函数很重要.让他们编写一个计时器类,将时间存储为秒,但使用getter/setter自动转换为/分钟或小时.

我不知道你的学生从一开始就使用过char数组或std :: strings.让他们同时使用.当他们理解char数组的难度时,他们会更多地理解字符串类,并理解类的重点是抽象,而不仅仅是代码组织.如果您的学生曾询问代码组织并且不确定特定数据或方法应该去哪里,请记住以下引用:

"事实上,我会声称一个坏程序员和一个好程序员之间的区别在于他是否认为他的代码或他的数据结构更重要.糟糕的程序员担心代码.优秀的程序员担心数据结构及其关系." - Linus Torvalds


jus*_*ody 6

首先避免使用getter和setter的类.OOP的主要承诺之一是"数据和程序一起".它旨在解决程序性程序中一个长期存在的问题:在数据流动过程中,一个地点的数据结构变化就像程序一样涟漪.OOP通过确保数据保持不变来解决这个问题.getter和setter只是一种规避OOP(数据传输a->setX(y->getX()))的机制,你最终会得到大量的样板文件.

另外,不要使用C++教OOP.使用专为OOP设计的语言.具有真正封装的东西(对私有成员的更改不需要重新编译客户端代码)并统一处理所有类型(例如字符串文字是第一类对象).

  • @Michel:在这种情况下,不要教OOP.C++是一种教授任何范式的可怕语言,可能除了程序之外.教他们如何将他们用其他更干净的语言学到的东西翻译成它. (3认同)