如何向非技术人员解释OOP概念?


10

我经常尝试避免告诉别人我是程序员,因为大多数时候我都会向他们解释这到底意味着什么。当我告诉他们我使用Java编程时,他们经常问有关该语言以及它与x和y有何区别的一般性问题。我也不善于解释事物,因为1)我在该领域没有太多经验,并且2)我真的讨厌向非技术人员解释事物。

他们说,一旦您向其他人解释事物,您便真正理解了事物,在这种情况下,您将如何向非技术人员解释OOP术语和概念?


有权访问的人可以将此添加为社区Wiki吗?谢谢。

2
我已经几次看到这个问题,几乎一个单词一个单词。

1
@Michael您可以张贴一些链接吗?


要了解设计模式(以及类似的面向对象设计),请访问shop.oreilly.com/product/9780596007126.do关于它的最直观的书
cl-r

Answers:


27

我通常尝试通过使用实际示例来描述面向对象的编程。

例如,我可能会说一个名为class的类Vehicle描述了车辆的最低限度条件。我会请该人告诉我他或她认为车辆是什么。有时他们会说“好吧,就像小汽车或卡车”之类的话,我会点头同意。然后,我将问问汽车和卡车之间的区别是什么。有时他们提到尺寸,有时提到目的,等等。

然后,我将要求他们忘记汽车或卡车,而仅要求他们继续描述车辆:

“哦,它移动了”

“它有操作员或驾驶员”

等等...

很快,我们知道了什么是车辆,我说过在OOP中我们将定义车辆,并且为了争论起见,它可以移动,并赋予其某种驾驶员。然后我会问,好的,那么汽车有什么?

“门”

“视窗”

然后是卡车...

“门”“窗户”“更多轮子!”

很快,经过大量讨论,对方通常确定了:

1)什么构成车辆

2)什么构成汽车

3)什么是卡车

4)什么构成飞机。

全部没有任何技术性。我们已经将每个属性划分为正确的区域。他们了解继承(“是的,汽车是汽车,卡车是汽车,但汽车不是卡车,这很简单,du!”)。

他们甚至理解多态性,“当然,他们基本上会做同样的事情,但是这样做可能会略有不同。” 我们可以讨论行为以及行为应该存在于我们的对象树中。

根据他们的学历和背景,有些人会比其他人更快地得到它。但是,当我将OOP与现实生活中的对象进行比较时,大多数人都会得到它。实际上,我在与非技术人员的对话中发现了我从未想到的事情。车辆不必有人驾驶(例如无人机),但是程序员会认为车辆的操作员是车辆的属性吗?我并不是说提到一个运算符是对还是错,但是它使我们考虑开发软件时要建模的内容以及要达到的目的。

现在,另一方面,部分模板专门化.... :)


3
大声笑+1是一个很好的答案,但我希望我能再给您一部分模板专门化知识!我倾向于使用动物类比,因为在这种情况下继承更为自然。地狱,你甚至可以用这种方式解释多重(双重)继承!
Chinmay Kanchi 2011年

每个人都以汽车为例。这就是为什么它令人沮丧地无法在看起来像OOP这样毫无意义的代码库中工作。
埃里克·雷彭

14

对象是名词,方法是动词。


8
够奇怪的是,我不得不经常向程序员解释这一点。
怀亚特·巴内特

7
不总是。例如:我反对您的方法。;)
Dan J

在JavaScript中,方法也是函数,属性,名词和动词。
Erik Reppen

3

这是我给非技术人员的罐头答复的某些版本:

编程是试图在计算机上创建现实的表示。已经有许多工具和设备可以执行此操作-考虑电子表格如何使我们更容易表示会计或统计数据,或者Powerpoint演示文稿如何使我们能够存储和显示演示文稿。

有时,我们需要在反映我们业务流程的新应用程序或现有应用程序中构建现实的自定义表示形式。有很多编程方法,而最常见的编程方法之一就是面向对象的编程,我们构建的代码专门用于复制现实的概念。现实中的“事物”具有属性和行为。例如,一个人经常有胳膊和腿,头发的颜色,种族,并且经常会说话和走路。

口语和步行可以有不同的种类,例如一种人说什么语言,或者一种人走路的速度或方式。

人类通常与其他类型的“事物”互动,无论它们是动物,其他人类,其他生物或无生命的物体。现实中的主题通常需要一种表示方式,例如“事物”之间的交互,事物的分类等。请考虑组织中正在进行的业务流程。存在非常复杂的“业务逻辑”,需要在我们组织使用的软件中表示出来。

面向对象的编程提供了一种精确表示这些“现实世界概念”和“业务逻辑”的方法。

->此声明通常足以消除他们的好奇心(或使他们流泪),但如果他们有更多问题,以上声明(我相信)为对话的进行打下了良好的基础。我真的不认为非技术人员对技术术语(例如“抽象”,“组成”,“多态性”等)的关注不是太多,但是如果确实如此,我在固定语句中使用的语言允许我以此为基础的例子。


1

我总是这样学习OOP:

您有一个时钟,它可以指示时间-嗯,在编程中,您将所有必须完成的代码和工作放在一起(听起来很明显,但早期人们并不习惯这样做)。无论如何,这称为封装

现在您有了时钟,您可能想要一个闹钟-好吧,一旦所有东西都放到一起,您就可以向其中添加东西以使其做更多的事情-例如设置闹钟并使其响铃。这称为继承

另外,您可以查看我手腕上的时钟,但是您可以查看其他时钟,例如祖父时钟或数字时钟。它看起来有所不同,但仍然是时钟,这就是所谓的多态

那里有面向对象编程的三个角落。剩下的只是编码。


1

我只是告诉他们如果他们真的想了解一门OOP课程。

我的意思是,所有类似于Car.startEngine()的类比;是的,让我们面对现实-纯说唱。很多年前,当我第一次进入OOP时,我发现它们只能进一步抽象该域。

大约80%的编程书籍作者认为,程序员是无知的白痴,需要用简单的语言来表达(参见讽刺意味?),而不仅仅是解释OOP是关于管理过程语言的复杂性。

是的,解释列表和向量是完全正常的,因为这是我们最常使用的,而不是Car.Engine和PoliceMan.Arrest(除非您是游戏开发者,但是再说一遍,您仍然必须拥有前任的)。

回到主题,我只是告诉他们,我创建了纯粹存在于程序员心中的无形对象,用于工资单处理/游戏/航天飞机导航等目的。

如果他们还有疑问,请停止讨论,因为这样做不值得。大多数人都无法想象抽象概念,并且需要为几乎所有事物提供示例(实际上,这意味着对实际主题的更多简化/专业化)。


+1 OO是Xerox SPARC发明的,正是因为他们认为Car.startEngine()东西可以使所有人的编程变得简单,并且对于非程序员或初学者来说也很容易理解。很清楚,这根本没有解决……
Ericson2314

1

我在这里的回答中谈到了我与妻子的对话:https : //softwareengineering.stackexchange.com/questions/45464/how-to-convince-non-programmer-his-notions-about-电脑错误/ 45467#45467

编辑:我在那里回答的问题已经缓和,所以我将在这里重新回答。

她和妻子坐在一家餐馆里,她问我“面向对象是什么意思?”

我开始大谈代码重用,封装和多态性,在某个时候,我意识到她的眼睛终究被蒙住了双眼。

所以我从容器中拿出一个Splenda小包。我说:“这是一个对象。它的属性是什么?”

她说:“它是矩形的,它是用纸制成的,包含锦绣花,它是蓝色,上面印有文字。”

我拿起一个糖包。“这与它有什么共同点?”

她说:“矩形,纸,就是印刷。”

我说:“它们都含有甜味吗?”

她说:“可以。”

我说:“因此,这两个都是我们可以称为抽象甜味剂包装的实例。如果您愿意,可以提供柏拉图式理想甜味剂包装。”

她说:“可以。”

我说:“每个人都有从抽象数据包继承的属性,然后在其上进行特定于其类型的变化。”

她说:“对。哦!如果我想制作一个糖精小包,我会拿一个通用的,为糖精设置详细信息,然后我就可以了!”

我说:“宾果:面向对象编程。”

您和我知道她只是将自己的方式理解为Factory设计模式。随你。它说明了继承,封装,对象类身份……好东西。


德拉特 链接的答案由于“适度原因”而被删除。多么am昧无助!:-(
Ogre Psalm33 '02

@ OgrePsalm33-大致上是我的回答。
Dan Ray

0

然而,这个问题似乎是封闭的候选人。

像大多数事情一样,OOP实际上很容易在概念上进行解释。程序员建模对象;和:

  • 对象具有状态(字段/数据成员)
  • 对象具有动作(方法/功能)
  • 对象彼此建立(继承)

当然,这些是数百个更详细的细节。但是,如果您只是想给某人10秒的概述,我认为这是一个好的开始。您是否还有其他难以解释的具体概念?


0

手机示例:

假设您是工厂老板,您想描述一个通用电话

  • 步骤1:列出此通用电话的属性,例如:身高,体重,颜色等
  • 步骤2:列出此通用电话功能, 例如:拨打电话,接听电话,发送短信等

现在,您已经有了通用的“蓝图”,请创建以下电话:

电话1:

  • 高度-> 102mm

  • 重量-> 85g

  • 颜色->粉红色

电话2:

  • 高度-> 125mm

  • 重量-> 96g

  • 颜色->红色


0

我认为向非技术类型解释OOP的最佳方法是将其与他们联系起来。

本质上,OOD和OOP希望您将正在设计和实现的系统视为一个交互世界。

因此,为了争辩(在互联网上永远无法顺利进行),我们要说的是向垃圾收集者解释OOD&P。他叫鲍勃。您曾经在15年前和他一起上学,在酒吧碰过他,你们俩都对彼此的生活充满了兴趣。

“所以,约翰,你说你是一名程序员。我的侄子全是胡说八道。继续着眼于面向对象的编程之类的事情。这是怎么回事?” 请注意,鲍勃是英国人,从他拼写错误的方式来看。

“好吧,鲍勃。”你回答,对定向感到畏缩。“这真的很简单。你收集垃圾,对吗?你通常在工作中做什么?”

“好吧,我跟随城镇周围的面包车捡垃圾,然后将其放入面包车,”鲍勃疑惑地回答。

您将需要注意这一点。这些是我们的行为。这实际上就是设计所需的全部。面向对象的编程实质上就是实现设计的方式。每种语言都不同。”

鲍勃喝啤酒睡着了。你走开


1
啊! 由否决驱动。异想天开的魅力。
马特·艾伦

1
有意思,兄弟。您还会在皮带上绑洋葱吗?
Donal Fellows,

只有大黄色的,因为战争。
马特·艾伦

0

我喜欢用汽车的例子来解释继承(我倾向于使用动物而不是车辆,但这是相同的想法),但是为了解释面向对象程序的工作原理,我指的是我曾经在克里斯·克劳福德的网站上读过的一个类比:该程序就像一个非常有效的官僚机构。该计划中的所有不同对象就像一个官僚机构中的不同部门一样。每个部门都有自己指定的任务,定义明确的输入(与谁交谈以及填写哪些表格),而其他部门通常对内部发生的事情并不了解。人力资源就像一个抽象工厂,IT就像一个单身人士,等等。

由于在计算机程序中键入了错误的内容而收到错误消息,就像填写错误的表格提交给办公室一样。


0

OOP是对人类思维过程和对世界的理解的抽象(如果有的话),可以将功能投影到数字“空隙”中,从而以数字方式模仿熟悉的过程和分类,从而大大简化了操作过程。在许多方面,它更多地是关于我们的原始语言状态,而不是“我们像计算机一样思考”。

如果编程模仿了现实或人类的思想,那么自然界中的过程将更加有机,混乱和无序,甚至是横向的。相反,我们将现实简化为婴儿步,“ 2 + 2逻辑”,粗略类别,可重用的小工具和史前推理。

我们仍在尝试如何将我们的思想和愿望下载到协议和通用语言中,我认为历史学家有一天会被其复杂的粗俗深深吸引-就像我们现在看到的象形文字一样。它根本不是“聪明”的,它只是强调了我们不能轻易解释我们如何决定或理解最简单的事情。计算仍处于思想演变的“狗是狗,因为它不是猫”的水平-它甚至比基本的语言落后了几千年。


0

有两种向导。有人用魔术词使特定的事情发生。他有传言说要开火。他有话要说让冷冻的鸡凭空出现。还有一个词用来创造充满琐碎美好的力量(我更喜欢绿色,发光和半透明的力量)。正确运用他的话语,他可以生产炸鸡。

然后是OOP向导。谁会召唤一个小鬼,他知道如何去杂货店,买鸡(或您要他准备的其他食物的食材),做饭并为您服务。OOP向导不必告诉小鬼如何去做。他只需要让他知道他想要什么,在这种情况下是炸鸡。不仅如此,OOP向导还可以召唤其他小兵来告诉他的小厨师要做什么。

因此,魔鬼般的家伙给聚会留下了深刻的印象,但是当您要开一家魔术餐厅时,OOP向导是您想要的,那里有一堆人物(例如,一个生气的独角兽服务员和一个巨魔地板经理),必须一起工作。如果您尝试调用解决“餐厅”问题的每一步,那么您很容易陷入细节之中,而且很容易犯错误。OOP向导对他的仆从进行了预训练,以便为他整理细节,因此他可以通过与他人互动来专注于解决更大的问题。

更不用说重新使用主厨小点心解决您的小学食堂问题了,那么它是通过一次调用一个单词来分离一次完成所有可能或可能不会重复使用的垃圾以及调用其他单词集的单词(随着您必须处理更多种问题,单词的数量将会更多)。

公平地讲,使用非常非常小心的应用程序,魔咒向导可以像OOP向导一样快速地完成所有任务。他可以以正确的方式分解事物,这样,调用正确的咒语就不需要OOP向导完成更多工作了。但是,这项工作很难理解或重复,也很难重用大部分内容,因为它们针对一个特定的复杂问题而捆绑在一起。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.