关于编程语言:向非程序员解释抽象

Explaining abstraction to a non-programmer

抽象是一个似乎很难解释的概念,如果不使用编程术语的话。我想了很多,但想不出一个令人满意的答案。有没有人有非常一般,但非常相关的解释?

隐喻、比喻等都是受欢迎的。


一辆小汽车

你通过抽象的方式与汽车互动——油门,方向盘,用来隐藏汽车的复杂性。

使用油门踏板来控制发动机转速,不必手动向发动机喷射气体并控制活塞。

方向盘是另一个抽象概念。你转动方向盘,它同时转动两个前轮,大大简化了你作为司机的任务。您可以在保留接口的同时将基本实现替换为另一个实现(例如,较新的汽车具有动力转向)。

自动变速器是另一个很好的例子。


抽象化

忽略了某些事情如何工作的细节。

例如,转动车钥匙启动汽车,这抽象的细节,如启动电机,电池,防盗系统,油箱…


大多数人整天都在从复杂的事物中抽象出相关的细节,所以我认为找到一个例子并不太困难。

如果我告诉你,我会给你10秒钟的时间来画东西,然后当我说"开始!画一栋房子"你不太可能想出和我画的有什么不同的东西:

1
2
3
4
 /\
/  \
|  |
 --

因为你的大脑提取了关于你房子最相关的细节:屋顶、墙壁——如果你有时间的话——门窗。

我们从每件事中提取细节仅仅是因为它使理解变得容易。我们并不了解椅子构造的每一个细节——我们只是去宜家买一个好看的。有很多很好的例子。


抽象可能意味着编写可以应用于更广泛环境的规则(或过程)。

你可以写一份玛格丽塔比萨的食谱,它需要:西红柿、马苏里拉奶酪、白面粉、水、罗勒、糖、盐、特级初榨橄榄油和酵母。

或者你可以做一个比萨饼的食谱,需要面团和配料。这是一个抽象的食谱。

然后你可以选择用白面粉、水、糖、盐、特级初榨橄榄油和酵母做面团。

你也可以选择用西红柿、马苏里拉奶酪、罗勒和特级初榨橄榄油做浇头。

但你也可以选择使用其他配料(例如,意大利辣香肠和辣椒),以及其他类型的面团(如全麦面粉或玉米粉)。


电话就是一个很好的例子。当你给某人打电话时,你不需要知道在你按一些号码和"拨号"之间以及在你打电话的人身上连接之间的所有技术步骤。你只知道当你按他们的号码和拨号时,你就接通了。细节是抽象出来的。


如果您所指的抽象类似于库/框架提供的抽象:

使用一个抽象的软件层可以看到,比如雇佣一个为你工作的人,而你不能或者不想自己去做。

将事物抽象到类和对象等典型的软件结构中有点难解释…


数字。

三头牛、三把椅子和三棵樱桃树有什么共同点?这些共同点有什么问题?你不能画出来,即使解释这个概念也很难,但它仍然是一个有用的概念。

引用刘易斯·卡罗尔的《爱丽丝梦游仙境》:

1
2
3
   "[doormice that were drawing everything that begins with an M,
such as mousetraps, and the moon and memory, and muchness — [..]
 did you ever see such a thing as a drawing of a muchness ?"

抽象是一个概念或概念,与任何特定的实例都没有关联。


为什么不直接做"住所"。

正如在"24A豪华大厦"是"码头区四居室复式公寓",是"伦敦公寓",是"家"是住宅。

"埃塞俄比亚素食主义者食物帐篷旁边的蓝色帐篷"是"我在格拉斯顿伯里的帐篷",是"临时住所",也是"住所"


我建议抽象是关注相关的细节,忽略其他细节。

比如说你想雇个厨师。

你一定要注意

  • 训练
  • 他能做什么菜
  • 介绍食物有多好
  • 他/她将如何与团队其他成员互动
  • 这食物煮得怎么样

但是,你不需要注意

  • 发色
  • 纹身
  • 他画得多好
  • 鼻毛
  • 他/她女朋友的穿孔

等等。


我要说的是,抽象是将复杂概念概括为相对简单的概念,重点是概念的哪些部分在当前的上下文中很重要。


这辆车对我来说太先进了。购物车怎么样?你推,它就动。