it-swarm.cn

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

我经常尝试避免告诉别人我是一名程序员,因为大多数时候我都会向他们解释这到底意味着什么。当我告诉他们我正在使用Java在该领域没有太多经验,2)我真的很讨厌向非技术人员解释事情。

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

10
John

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

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

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

“哦,它移动了”

“它有操作员或驾驶员”

等等...

很快,我们知道了什么是车辆,我说过在OOP)中,我们将定义一辆车辆,为了争辩说它可以移动,并给它提供某种驾驶员。会问,好吧,那么汽车有什么?

“门”

“视窗”

然后是卡车...

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

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

1)什么构成车辆

2)什么构成汽车

3)什么是卡车

4)什么构成飞机。

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

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

根据他们的学历和背景,有些人会比其他人更快。但是,当我将OOP)与现实生活中的对象进行比较时,大多数人总是会得到它。实际上,我在与非技术人员的交谈中发现了我从未想到的东西。例如,必须要有人驾驶(无人机),但是程序员会否认为车辆的操作员是车辆的属性?我并不是说提到驾驶员是对还是错,但这使我们思考关于我们正在建模的东西以及我们在开发软件时想要达到的目标。

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

27
Moo-Juice

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

14
k rey

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

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

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

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

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

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

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

3
Tim Claason

我总是学会OOP像这样:

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

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

另外,您可以查看我手腕上的时钟,但是您可以查看其他时钟,例如祖父时钟或数字时钟。看起来不一样,但仍然是时钟-嗯,这叫做多态性

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

1
gbjbaanb

我在这里的回答中谈到了我与妻子的对话: https://softwareengineering.stackexchange.com/questions/45464/how-to-convince-non-programmer-his-关于计算机的概念错误/ 45467#45467

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

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

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

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

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

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

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

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

她说:“可以。”

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

她说:“可以。”

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

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

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

您和我知道她只是凭直觉就采用了Factory设计模式。随你。它说明了继承,封装,对象类身份……好东西。

1
Dan Ray

我只是告诉他们要在OOP=如果他们真的想了解这门课程。

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

不仅仅是解释OOP是关于管理过程语言的复杂性,)几乎80%的编程书籍作者都认为程序员是笨笨的白痴,需要简单地说出来(见此处的讽刺意味?)条款。

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

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

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

1
Jas

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

像大多数事物一样,OOP实际上在概念上很简单。程序员为对象建模;并且:

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

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

0
zourtney

手机示例:

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

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

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

电话1:

  • 高度-> 102mm

  • 重量-> 85g

  • 颜色->粉红色

电话2:

  • 高度-> 125mm

  • 重量-> 96g

  • 颜色->红色

0
Darknight

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

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

0
jhocking

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

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

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

0
Glyn

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

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

因此,魔咒人在聚会上给人留下深刻的印象,但是OOP向导是您要创建一堆带有多个角色的魔术餐厅时所需要的向导(例如,生气的Unicorn服务员和一个巨魔地板经理)谁都必须一起工作。如果您尝试调用解决“餐厅”问题的每一步,那么您很容易陷入细节上,而且很容易犯错误。 OOP向导对他的小兵进行了预训练,以便为他整理细节,因此他可以通过与他人互动来专注于解决更大的问题。

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

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

0
Erik Reppen

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

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

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

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

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

“好吧,我沿着城镇周围的面包车捡垃圾,然后把它放进面包车。”鲍勃疑惑地回答。

“太好了。好吧,想象一下我正在编写一个模拟该程序的程序。在面向对象的设计中,第一步是确定存在的对象。在您的工作中似乎有街道,垃圾箱,您和货车。这些就是我们的工作。接下来,我们需要知道每个对象执行的行为。我不确定它在现实世界中的工作方式,但是假设您被告知需要清理的街道。有一种行为-街道在需要清理时通知这意味着需要侦听需要清理的街道,我想既然您跟随面包车,那么面包车就会侦听需要清理的街道-那是两个,第三个显然是您跟随面包车。是在垃圾箱中放垃圾吗?您还会发现垃圾箱中是否有垃圾。我想这是什么时候,垃圾箱需要通知您,您需要侦听这些。这就是我们的行为。设计的需要面向对象编程本质上就是您的象征进行设计。每种语言都不同。”

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

0
Matt Ellen