抽象化思维简介

欢迎!你即将深入了解计算机科学中最关键的技能之一:抽象化 (Abstraction)。别让这个名称吓倒你——其实你每天都在无意中运用抽象化!在本章中,我们将学习如何“像计算机科学家一样思考”,即剔除现实世界中繁杂的细节,从而找出隐藏其下的简单逻辑。这是解决任何大型难题的第一步。

如果起初觉得这些文字有点抽象,不用担心。只要看过例子,你就会豁然开朗!

1. 抽象化的本质

从核心来说,抽象化就是删除不必要的细节,只专注于问题中最重要部分的程序。

想象你在看一棵树。
植物学家看到的是物种、叶片的结构和养分水平。
艺术家看到的是颜色、光线照射枝叶的方式以及树皮的纹理。
计算机科学家如果正在制作一款电子游戏,他可能只看到一个简单的形状(一个顶部有绿色圆形的圆柱体)。

这位计算机科学家已经对这棵树进行了抽象化。他们忽略了数以百万计对其特定目标无关紧要的微小细节。

现实世界的类比:伦敦地铁图

著名的伦敦地铁图是抽象化的完美范例。
现实:隧道蜿蜒曲折,站与站之间的距离大不相同。
抽象化:地铁图使用了直线和相等的间距。
为什么?因为作为乘客,你不在乎隧道有多深,也不在乎你确切行驶了多少米。你只在乎你身处哪条路线以及在哪里换乘。通过剔除“真实”的地理信息,地铁图变得更易于使用。

重点总结:抽象化就是筛选对解决当前问题无用的信息。

2. 为何需要抽象化

为什么我们不能把所有细节都包括进去?为什么我们需要抽象化?主要有三个原因:

1. 降低复杂度
现实世界极其复杂。如果你试图通过计算引擎中每一个原子的运动来编写汽车模拟器,电脑将会死机!抽象化让我们能够一次专注于一个可管理的部分。

2. 节省时间和资源
在计算领域,更多细节意味着需要更多的内存 (RAM)处理能力 (CPU)。通过使用抽象模型,程序运行速度更快,占用的空间也更少。

3. 更专注于目标
如果你正在编写一个管理学校时间表的程序,你需要的是学生的姓名和课程。你不需要知道他们喜欢什么颜色或鞋子的尺码。包含这些额外的数据只会让程序更难编写,且更容易出错。

快速复习:
• 抽象化 = 简化。
• 它使问题变得可解决
• 它节省了计算资源

3. 抽象化与现实

了解抽象化是现实的“呈现”,而非现实本身,这一点非常重要。两者之间永远存在着“差距”。

让我们看看在不同情境下,“客户”是如何被看待的:

现实:一个有性格、有家庭、有住址、有银行存款、有购物记录和当下情绪的人。

抽象化(数据库模型):
客户 ID (CustomerID)(用于识别)
姓氏 (Surname)(用于称呼)
电子邮件地址 (EmailAddress)(用于联络)
最近购买日期 (LastPurchaseDate)(用于追踪活跃度)

应避免的常见错误:
学生常认为“细节越多越好”。在计算机科学中,这是错误的!最佳的抽象化是为了正确完成任务而保留最少量必要细节的模型。

重点总结:现实是无限的;而抽象化则是有限且聚焦的

4. 设计抽象模型

在考试中,你可能会被问到如何为特定情况创建抽象模型。请遵循以下步骤:

步骤 1:确定目标

程序实际上要达到什么目的?(例如:“我想模拟一次飞行。”)

步骤 2:确定需求

什么信息是必需的?(例如:“空速、海拔高度、燃油量、方向。”)

步骤 3:去除“噪音”

我们可以忽略什么?(例如:“座椅套的颜色、乘客在吃什么、飞行员养的狗叫什么名字。”)

例子:为“图书馆书籍”建模

如果我们要在构建一个图书馆管理系统,我们对一本书的抽象模型将包括:
ISBN(唯一识别码)
书名
作者
是否外借 (IsOnLoan)(是/否)

我们会忽略纸张的厚度、内文使用的字体风格,或者封面上划痕的数量。

你知道吗?
电子游戏会利用抽象化来制作“碰撞箱 (hitboxes)”。电脑通常不会去检查剑是否击中了角色复杂盔甲的每一个像素,而是简单地在玩家周围放置一个不可见、简化的长方形框。如果剑进入了那个框,就判定为命中!这种简单的抽象化使得游戏能够流畅地实时运行。

重点总结:要设计一个模型,只需保留有助于目标的各种信息,丢弃其他所有东西。

总结:抽象化思考

基础:抽象化是隐藏细节以专注于核心特征。
目标:使复杂问题更易于编写程序,且运行效率更高。
方法:确定特定目标,仅包含直接服务于该目标的数据点。
比较:现实是“本体”,而模型是该事物的“简化地图”。

你刚刚掌握了计算思维的第一个要素!下次当你使用地图或查看天气图标时,请记住——你正在看的就是一种抽象化!