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豪华大厦"是"码头区四居室复式公寓",是"伦敦公寓",是"家"是住宅。
"埃塞俄比亚素食主义者食物帐篷旁边的蓝色帐篷"是"我在格拉斯顿伯里的帐篷",是"临时住所",也是"住所"
我建议抽象是关注相关的细节,忽略其他细节。
比如说你想雇个厨师。
你一定要注意
- 训练
- 他能做什么菜
- 介绍食物有多好
- 他/她将如何与团队其他成员互动
- 这食物煮得怎么样
但是,你不需要注意
- 发色
- 纹身
- 他画得多好
- 鼻毛
- 他/她女朋友的穿孔
等等。
我要说的是,抽象是将复杂概念概括为相对简单的概念,重点是概念的哪些部分在当前的上下文中很重要。
这辆车对我来说太先进了。购物车怎么样?你推,它就动。