为新程序员定义OOP

时间:2009-02-28 01:09:56

标签: oop

在没有编程背景的人教第一语言的时候,我很难定义OOP,尽管我更喜欢OOP,我怎样才能为那些编程经验很少(或为零)的人定义OOP?

15 个答案:

答案 0 :(得分:26)

答案 1 :(得分:15)

我使用'弹跳球'示例。想象一下,你有一个盒子里面有一个弹跳球。

您可以通过两种方式对其进行编程:

一种方法是运行循环,跟踪球的当前位置,计算下一个位置,检查碰撞,从当前位置擦除,将其绘制到新位置。重复。

另一种方法是让球跟踪自己的位置和方向,并教它计算下一个位置以及如何移动到那里以及如何处理碰撞。然后,运行循环并告诉球不断更新。

现在想象你有100个球。然后是重球和轻球以及爆炸球。这些是具有附加特征的基本球。你还会使用方法1吗?

答案 2 :(得分:12)

好吧,你应该用例子。大多数人理解的一个例子是参考视频游戏。所以,你有怪物和怪物有一些属性,如颜色,大小,形状,武器数量等等。然后一些怪物有不同的“能力”,如呼吸火,射击枪,等等。这些都是愚蠢的例子,但很容易理解。我认为向新手解释比“广场”,“圈子”等所有这些业务更容易。

答案 3 :(得分:6)

不要浪费时间“定义”OOP。

只需在所有示例中使用OOP语言。

对象非常明显。现实世界充满了物体。

不要“定义”对象。只要展示编程示例,“对象性”就会很明显。

没有编程背景的人没有基于程序编程的愚蠢期望。

学习COBOL或Basic的人会有问题。


部分内容取决于语言。有些语言使OOP很难。

例如,在C ++中,“类”只是定义的。它在运行时不作为离散对象存在。

在Java和C ++中,有些东西是对象,但是一些“原始”类型不是对象。

有些语言使OOP更容易。

Python和Smalltalk一切都是对象。没有原始类型可以使水变得混乱。当你用像Python这样的语言学习OO时,对象性是清晰而明显的,因为它遍及一切。就像现实世界一样,物体无处不在。

答案 4 :(得分:5)

我会将其解释为一种模拟现实世界信息的方式。有一个常见的类比,使用汽车和车辆来显示类型层次结构。如果你能正确解释的话,我认为这对大多数人来说很容易理解。

也许你应该首先解释原始类型,然后讨论像结构一样的复合类型,然后展示如何使用继承将这些类型作为类相关。

编辑:在考虑之后,动物的例子要好得多。有关同一主题,请参阅Explaining OOP without Mentioning Classesthis SO thread

答案 5 :(得分:5)

运动队。在任何时候场地/球场的球员可以根据他们所扮演的位置来指定。但是整个团队可能有多个成员可以担任某个职位。

每个职位都像OO中的一个班级;它规定了一组责任。团队成员是这些课程的实例。

剧本中的剧本是模式。每一个都指定如何通过(实例)位置(类)的交互来实现特定结果。

答案 6 :(得分:4)

假设您要描述一系列具有相同属性的物品,但可能具有不同的名称,颜色或其他外观差异。

例如,您想要描述一个家庭在车库中拥有的车辆。您感兴趣的每辆车都有属性:

  1. 每辆车的型号和年份是什么?
  2. 车辆有多少车轮?
  3. 驾驶特定车辆的人是谁?
  4. 在这种情况下,您可能有一组两辆车,以下是真的:

    Vehicle A's Model is a Toyota.
    Vehicle A's Year is 2001.
    Vehicle A has four Wheels
    Vehicle A is driven by Mom, Dad, and Junior
    
    Vehicle B is a Moto Guzzi
    Vehicle B was made in 2004
    Vehicle B has two wheels
    Vehicle B is driven by Dad
    

    在各种语言中,您可能会以下列等效方式粗略地引用这两个示例:

    A = new Vehicle();
    A.model = "Toyota";
    A.year = 2002;
    A.wheelCount = 4;
    A.drivers = [ "Mom", "Dad", "Junior" ];
    
    B = new Vehicle();
    B.model = "Moto Guzzi";
    B.year = 2004;
    B.wheelCount = 2;
    B.drivers = [ "Dad" ];
    

    在OOP中,您正在封装这些车辆的属性,以便您可以通过其功能来描述它们。你的工作是编写代码来获取和设置这些功能的值(以及使用这些功能做其他有趣的事情)。

    此外,您可以“子类化”,这是一种在不同上下文中重用对象的方法。例如,您可以使用更具体的Vehicle对象类型,例如Car和Motorcycle,它们从Vehicle的描述继承其功能:

    A = new Car();
    B = new Motorcycle();
    

    汽车和摩托车对象是车辆的更具体描述。这两个子类可以有自己的特殊属性。汽车可能有儿童安全锁,而摩托车通常不需要儿童安全锁。

    您可以说只有Car具有Lock属性,而不是设置Vehicle的Childproof Lock属性。这使您的车辆描述更清晰,更易于编写和维护。

答案 7 :(得分:3)

据我所知,面向对象编程最初意味着您将程序的所有概念组织到对象中,然后将所有逻辑流定义为这些对象之间的消息。我认为,为了理解原始意图,你必须学习Smalltalk。

答案 8 :(得分:2)

面向对象编程说谎:

  1. 程序中的所有内容都是(Object)。这个东西有解释它的属性(大小,形状,颜色等)
  2. 程序员要求做的事情/回答问题:让你的体型大(setSize)或你的体型(getSize)
  3. 仅在您要求时调整其属性(调用方法)。您无法直接检查或更改事物的属性。您只能检查或更改属性事物让您看到。因此,事物可以确保正确查看和更改属性。

    这可以防止程序员告诉大小 大小 红色。如果你直接告诉它的大小是红色它应该拒绝(红色不是有效的大小)。另外,它允许事物管理改变其属性的副作用。

    假设事物的 originalSize 。如果只是将事物的 尺寸更改为必须记得告诉事情它不再是 originalSize 。如果我要求 大小更改为,则会将其大小更改为小并将originalSize更改为假。现在,当我问问它是否是原始大小时,它将以no。

    响应

    基本上,这允许您将数据和功能打包在一起,使事物更加模块化/划分。这使您可以更好地组织代码并更轻松地重用代码。 OOP并不是什么特别的东西,只是一种更好地组织代码的方法。在初学者级别并不重要,但对大型项目至关重要。在一个Object的函数中,事情通常变得像初学者习惯的那样程序化。

答案 9 :(得分:2)

这是一个简单的定义。

Gun gun = new Gun(new Bullet);
gun.Aim = Appendage.Foot;
gun.PullTrigger();

答案 10 :(得分:1)

对OOP的任何解释都很大程度上取决于解释者对该概念的解释。我对这个概念的解释是这样的。

现实世界在很大程度上被理解为一组演员。每个actor都有一组属性和行为。在大多数情况下,演员的属性是根据其行为表达的,与其与其他演员的互动有关。

计算机程序通常是对某些实际过程的模拟,因此它通常有助于程序员基于actor-behavior-properties模型构建程序。也就是说,整个程序的每个元素都可以分成代表单个参与者的较小程序。

当然,到目前为止你只能接受这一点。并非我们想要建模的一切都是单一的演员。例如,货币是守恒的,但在许多方面是无限可分的。

此外,对现实世界进行建模的其他方式可能会以更大的抽象为代价提供更严格的正确性保证,例如源自集合论的关系模型。 OOP没有这样的数学基础。

答案 11 :(得分:1)

对象只是一堆具有命名属性的东西。这些属性的值定义对象的 state 。对象之间的交互是通过消息传递完成的。消息由名称和一组参数组成。当对象收到消息时,该消息将由该对象处理。处理消息可能会导致对象状态的更改以及发送到其他对象的消息。

答案 12 :(得分:1)

它就像馅饼拼写一样容易。 oo的3个基本原则是:

封装 遗产 多态性

向新手展示大多数oo编程书籍中的标准绘图形状示例的代码。同时向他们展示使用大量具有全局数据的开关的非oo代码。

他们应该根据两组代码之间的组织差异来了解oo。

答案 13 :(得分:-1)

无论你解释这个是什么,在他能够学习OOP意味着什么之前需要知道什么是基本编程,因为它是编程语言的一个分支。如果他不了解OOP的同行,他永远无法理解OOP的特殊之处。所以你的问题有两个部分;如何解释编程语言是什么以及OOP与其他编程语言的区别。

向他解释一般编程的最简单方法是将其与数学运算进行比较。您可以通过将编程定义为一些数学表达式来进行解释,这些数学表达式采用导致输出的输入。您希望详细说明的内容取决于您。

通过这个解释,我们已经完成了基础工作,让他了解OOP的含义。现在我们可以将对象定义为数学函数和数据集。因此,我们不是将逻辑视为全局代码块,而是将这些代码块收集到对象中以收集相关的代码片段并找到隔离它们的方法。从这一点开始,您可以解释Object抽象带来的更多优势(例如,多态,松散耦合)。

答案 14 :(得分:-1)

很奇怪。 你问的是对那些对编程一无所知的人教授OOP,每个人都在回答“如何教OOP?”

答案是,你没有。你如何向从未编程过的人教授函数式编程?你没有。你有函数,代码被塞进它们,它们被重用,等等。在Java中,你的所有代码都必须在一个类中。什么是课程?首先,它是放置代码的地方。程序从Main方法开始。稍后,您可以实例化它,每个类都有自己的方法和属性。然后你谈论静态方法和变量。然后有一段时间你会谈论polimorphism和继承。有时在那里他们开始设计自己的API并使用servlet和持久化类或者最新实现的东西(snervlets?IHibernate?)

但如果您以前从未见过编程,则无需坐下来进行大OOP聊天。只有在您从非OOP编程中拯救某人时才需要这样做。只是教编程。 OOP编程?还有其他什么?是的,但我们今天没有教这个,所以我们不要担心。

[通过类比:当你去参加武术课时,他们通常不会花很多时间来解释。首先你伸展,他们让你锻炼,然后他们教你一些技巧。如果你想知道你正在学习哪种武术,你就去图书馆。]