代码之家  ›  专栏  ›  技术社区  ›  domgblackwell

如何教授面向对象编程-知道从哪里开始吗?

  •  17
  • domgblackwell  · 技术社区  · 6 年前

    我在中学、计算机培训所等方面教C++大约2年。在教过有关变量、数组、结构、函数的基础知识之后,我总是用传统的例子来开始面向对象的例子,比如:

    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
    }
    

    然后 完成 这个人上课,教新东西,比如为什么getter和setters方法 邪恶的 通过创建其他类(如学生、员工、版主等)、必要的OOP技能和概念来避免访问器、继承和多态性。

    [编辑]: 并使这些类对解决编程问题有用。(例如计算每个员工对象的工资、学生平均分数以及许多其他对象)

    另一个基本示例是车辆类、形状类等。

    我想知道你对如何( 只是 )启动OOP教室。

    期待伟大的想法。

    9 回复  |  直到 11 年前
        1
  •  12
  •   Stephan Eggermont    12 年前

    我会从没有密码,有CRC卡开始。让全班扮演卡片角色,并进行真正的OO设计课程。在这里,您可以介绍单一责任原则,讨论has-a-vs-is-a和继承、封装。我遇到太多程序员,他们对OO一无所知,仍然在C++、C语言、Java或Delphi中编程。

    [编辑] 稍后,您可能希望将基于类与基于javascript(或self)和基于原型的OO进行比较,以讨论不同的分类方式。

        2
  •  7
  •   Nick Manley    12 年前

    正如其他人所建议的,使用现实世界中的例子来解释事情,比如车辆类和卡车类来继承。但重要的是。一旦他们了解了现实世界中的例子,他们就需要在下一步看到与程序相关的例子,然后才能真正理解为什么它对编程很重要。

    我见过很多可怕的C++代码,不仅仅是那些不理解概念的人。我见过许多编码人员,他们确切地知道对象是什么,并且能够完美地解释多态性和所有这些技术OOP术语。但是如果他们不知道何时使用它,他们就永远无法充分利用它。我知道,因为我自己就是这样。我在高中读过一本关于OOP的书,它解释了所有的概念,但是我在使用它们之前花了很多年的时间,因为我不知道它们什么时候真正有益于我的代码。尝试给出编程任务,在没有OOP的情况下进行编程会更有挑战性。学生们会自然而然地采取更容易的路线并开始理解。做是最好的学习方式。

    您可能有一个链表类,并要求它们从中继承,通过编写自己的push/pop、enqueue/dequeue方法来生成堆栈或队列。或者生成一个二叉树类,并要求它们通过重写insert方法将其转换为二叉搜索树。让他们使用动态内存,这样他们就能明白为什么[复制]构造函数/析构函数很重要。让他们编写一个计时器类,它将时间存储为秒,但使用getter/setter自动转换为分钟或小时。

    我不知道您的学生是否从一开始就使用了char数组或std::strings。让它们同时使用。当他们理解char数组有多困难时,他们会更欣赏string类,并理解类的意义是抽象,而不仅仅是代码组织。如果您的学生确实询问过代码组织,并且不确定特定的数据或方法应该放在哪里,请记住这句话:

    “事实上,我会声称一个糟糕的程序员之间的区别 一个好的问题是他是否考虑他的代码或数据结构 更重要的是。糟糕的程序员担心代码。优秀的程序员 担心数据结构及其关系。”—Linus Torvalds

        3
  •  6
  •   just somebody    15 年前

    从避免使用getter和setter类开始。OOP的主要承诺之一是“数据和程序结合在一起”。它的目的是解决程序程序中一个长期存在的问题:在一个点上对数据结构的更改会随着数据流而在程序中产生涟漪。OOP通过确保数据 留置 . getter和setter只是一种绕过OOP(数据传入)的机制 a->setX(y->getX()) 最后你会得到成堆的样板文件。

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

        4
  •  4
  •   deamon    15 年前

    我不想用C++来教OOP,因为C++不是一种优雅的语言,而OOP在C++中有点奇怪。我更喜欢Java或者斯卡拉或者Python,这是一种很好的教学语言。我的第一选择是scala,因为它有很强的概念。例如,没有静态成员破坏OOP。别忘了,如果编程很有趣(C++不是很有趣的话),教学更有效。

    我会说:

    • OOP的目标是什么?
    • 具有继承和接口的多态性
    • 对象的责任
    • 包封
    • 对象之间的消息
        5
  •  3
  •   jalf    15 年前

    展示一下这些与 程序设计 ?任何人被告知“你可以用类来模拟物理对象,比如说一个人”,会得到什么呢?

    这和他们想做的事有什么关系? 学习 ?也就是说,编程?

    这种“教”OOP的方式完全是胡说八道,对任何不教的人都是毫无用处的。 已经 熟悉OOP的概念。

    如果你想教OOP,给他们看一些有用的东西 编程中 . 类等OOP概念如何帮助解决实际的编程问题?他们提供的解决方案是否比必须使用的解决方案更清洁?

    很容易接受这样一个抽象的事实:“我们可能有一个个人类”。也很容易接受“我们可以从这个人的阶级中衍生出一个更专业的人的阶级,比如看门人、孩子或女人”。缺少的是关于这在编程中如何有用的任何线索。继承在解决编程问题中是如何有用的?多态性如何有用?为什么我们关心数据隐藏?

    关于这一点,您的具体示例是什么?它只是一个getter和setter的列表。实际上没有数据隐藏。没有抽象。这只是我们一直可以做的额外代码。如果你不能写 好的 班上,你有资格教书吗?

    看在上帝的份上,使用 std::string 而不是 char* . 是的,这意味着你必须告诉你的学生 STD::字符串 是一个字符串”,但至少您不必具有char指针管理的所有混乱和噪音。保持代码干净,没有不必要的噪音。

        6
  •  2
  •   Mike Hanson    15 年前

    随着在当今编程世界中接口越来越重要,我将集中于类的工作(行为),而不是它的字段和属性。这有助于强化“IS-A”思维的概念(A.K.A. Liskov Sustitution Principle )

        7
  •  1
  •   donohoe    15 年前

    正如我们所知,面向对象的概念非常接近于人类,所以,当我从OO概念开始时,我总是给出实时的例子,这有很大的不同。 前任。。。 --多态性:实时多态性的例子是“我”,我自己看到只有一个人是我,但我有不同的角色,比如我在家的时候1。我是我父母的儿子。2。当我在学校的时候,我是老师。3.当我在地面上时,我就是一名球员……只看到一个人,即我,但我有不同的角色……即多态性

    --抽象:我是一名教师,你(学生)对我的教学感兴趣,而不是我为收集这些数据所做的以及我昨晚所做的。也就是说,抽象避免给用户不想要的东西。

        8
  •  1
  •   Thomas Padron-McCarthy    15 年前

    当我教授面向对象编程时,我尽量不从代码开始,而是从概念、想法和原因开始。这里是 a horrible Google translation 原来的 Swedish web page 在这里,我写下了我用来给出的OO介绍。

        9
  •  0
  •   Yin Zhu    15 年前

    如果时间允许,学生们渴望并且能够学习。你可以教他们编写简单的图形用户界面程序,而构建图形用户界面也是OOP擅长的地方。

    Qt,在C++中设计得很好,对这个任务非常有用。学生在看到现实世界的例子之前,不能欣赏继承和虚拟功能。