如何解释一个对象?

Rob*_*ean 27 language-agnostic oop object

我想到这一点已经好几年了,但是我很快就会训练一些真正的青少年,需要向一个不知道它是什么的人解释一个对象是什么.

根据您在现实世界中使用的内容,我应该重点解释的对象的关键点是什么.例如:

  • 访问级别
  • 遗产
  • 封装
  • 多态性
  • 抽象化
  • 接口

Joo*_*kka 121

当我学习OOP时,我对所有这些"汽车/动物/无论"的比喻感到困惑.他们根本没有帮助我.然后有人说类/对象只是一组变量(类成员)和处理它们的函数(方法) - 这实际上是正确的.就这么简单!

使用所有这些流行的比喻只会误导人们,恕我直言.汽车与OOP并没有太多共同之处.你已经知道它们的意思时,很容易理解这些隐喻,但是试着从它们开始......不.

  • 或者你可以说car.start()并停止试图违反汽车的封装. (45认同)
  • +1 - 我真的很喜欢这个答案.如果可以的话,我会给予更多的选票. (9认同)
  • 动物或汽车实际上是优秀的OO示例 - 只是不常用它们.也就是说,不要试图对动物/汽车本身进行建模,而不是对您的软件实际上可能相关的属性.例如,讨论一个动物园管理计划 - 然后你需要模拟动物的类型,它们的喂食时间表和内容,它们与其他动物的关系,你需要什么样的保护等等....或管理汽车租赁公司,你需要模拟里程,座位,税收,许可证等... Car.start()或lion.eat()真的不清楚. (7认同)
  • 动物的东西主要用于解释(抽象)继承似乎,我仍然认为它是一个有用的东西,但不能很好地适应现代组合/界面驱动的OO.它忽略了太多其他方面. (3认同)
  • 同意.流行的汽车类比并没有真正奏效.例如,car.startEngine()方法已经造成很多麻烦:如果你启动引擎,你不是在与引擎交互吗?所以你可能想把它重新改写为car.turnKey(),因为这并没有把重点放在内部,但现在你引入了一个新的对象(键),所以它应该是key.insertInto(car) )(或者是car.insertKey(键)?)然后是key.turn(顺时针) - 这只是为了开始开车. (2认同)

Chu*_*uck 43

我喜欢Alan Kay使用的原始隐喻,他创造了"面向对象编程":对象就像身体中的细​​胞.它们每个都有自己的行为编程,并通过将消息传递给彼此进行通信,然后它们再次响应自己内部定义的行为.没有一个细胞知道另一个细胞是什么 - 他们只知道如何处理自己的任务并相互沟通.

  • 并且同步函数调用只是模糊处理,用于通过处理器推送二进制数据,以实现原始代码的目标.从设计的角度来看,它是消息.仅仅因为演员不在多线程系统中工作并不意味着概念上不是正在发生的事情. (2认同)

Pad*_*ddy 13

如果你想要一些真正有用的东西,不要忘记解释原因.这个概念似乎经常被忽略 - 为什么这个有用......


Ter*_*cox 10

动物/汽车隐喻的存在是为了解释面向对象设计的哲学,这比理解实施要重要得多.

如果你跳过这些比喻并从"它只是处理它们的变量和函数"开始,你就会错过任何责任描述.我经常与不考虑课堂责任的开发人员打交道(参见CRC卡),而是将数据和方法放入到当时正在编辑的任何地方.

你也错过了"告诉,不要问".动物的比喻在这里运作良好.在OO,我告诉狗要清理自己.我不问他怎么做,因为那是一个我不想看到里面的黑盒子.狗知道所以我不需要.

一定要教你的学生这些只是隐喻,而不是实际的东西."抵押贷款危机"中的"完美风暴"实际上并不涉及风暴或任何融化.


Gib*_*nag 5

我会从Access Levels和Encapsulation开始,然后从那里搬出去.封装是一个相当简单的概念,有一些明显的好处.从那里你可以很容易地谈论抽象,继承和多态.

作为一名本科生,我发现Encapsulation在一个相当抽象的领域是一个很好的锚定概念.