抽象化思维简介
欢迎!你即将深入了解计算机科学中最关键的技能之一:抽象化 (Abstraction)。别让这个名称吓倒你——其实你每天都在无意中运用抽象化!在本章中,我们将学习如何“像计算机科学家一样思考”,即剔除现实世界中繁杂的细节,从而找出隐藏其下的简单逻辑。这是解决任何大型难题的第一步。
如果起初觉得这些文字有点抽象,不用担心。只要看过例子,你就会豁然开朗!
1. 抽象化的本质
从核心来说,抽象化就是删除不必要的细节,只专注于问题中最重要部分的程序。
想象你在看一棵树。
• 植物学家看到的是物种、叶片的结构和养分水平。
• 艺术家看到的是颜色、光线照射枝叶的方式以及树皮的纹理。
• 计算机科学家如果正在制作一款电子游戏,他可能只看到一个简单的形状(一个顶部有绿色圆形的圆柱体)。
这位计算机科学家已经对这棵树进行了抽象化。他们忽略了数以百万计对其特定目标无关紧要的微小细节。
现实世界的类比:伦敦地铁图
著名的伦敦地铁图是抽象化的完美范例。
• 现实:隧道蜿蜒曲折,站与站之间的距离大不相同。
• 抽象化:地铁图使用了直线和相等的间距。
为什么?因为作为乘客,你不在乎隧道有多深,也不在乎你确切行驶了多少米。你只在乎你身处哪条路线以及在哪里换乘。通过剔除“真实”的地理信息,地铁图变得更易于使用。
重点总结:抽象化就是筛选对解决当前问题无用的信息。
2. 为何需要抽象化
为什么我们不能把所有细节都包括进去?为什么我们需要抽象化?主要有三个原因:
1. 降低复杂度
现实世界极其复杂。如果你试图通过计算引擎中每一个原子的运动来编写汽车模拟器,电脑将会死机!抽象化让我们能够一次专注于一个可管理的部分。
2. 节省时间和资源
在计算领域,更多细节意味着需要更多的内存 (RAM) 和处理能力 (CPU)。通过使用抽象模型,程序运行速度更快,占用的空间也更少。
3. 更专注于目标
如果你正在编写一个管理学校时间表的程序,你需要的是学生的姓名和课程。你不需要知道他们喜欢什么颜色或鞋子的尺码。包含这些额外的数据只会让程序更难编写,且更容易出错。
快速复习:
• 抽象化 = 简化。
• 它使问题变得可解决。
• 它节省了计算资源。
3. 抽象化与现实
了解抽象化是现实的“呈现”,而非现实本身,这一点非常重要。两者之间永远存在着“差距”。
让我们看看在不同情境下,“客户”是如何被看待的:
现实:一个有性格、有家庭、有住址、有银行存款、有购物记录和当下情绪的人。
抽象化(数据库模型):
• 客户 ID (CustomerID)(用于识别)
• 姓氏 (Surname)(用于称呼)
• 电子邮件地址 (EmailAddress)(用于联络)
• 最近购买日期 (LastPurchaseDate)(用于追踪活跃度)
应避免的常见错误:
学生常认为“细节越多越好”。在计算机科学中,这是错误的!最佳的抽象化是为了正确完成任务而保留最少量必要细节的模型。
重点总结:现实是无限的;而抽象化则是有限且聚焦的。
4. 设计抽象模型
在考试中,你可能会被问到如何为特定情况创建抽象模型。请遵循以下步骤:
步骤 1:确定目标
程序实际上要达到什么目的?(例如:“我想模拟一次飞行。”)
步骤 2:确定需求
什么信息是必需的?(例如:“空速、海拔高度、燃油量、方向。”)
步骤 3:去除“噪音”
我们可以忽略什么?(例如:“座椅套的颜色、乘客在吃什么、飞行员养的狗叫什么名字。”)
例子:为“图书馆书籍”建模
如果我们要在构建一个图书馆管理系统,我们对一本书的抽象模型将包括:
• ISBN(唯一识别码)
• 书名
• 作者
• 是否外借 (IsOnLoan)(是/否)
我们会忽略纸张的厚度、内文使用的字体风格,或者封面上划痕的数量。
你知道吗?
电子游戏会利用抽象化来制作“碰撞箱 (hitboxes)”。电脑通常不会去检查剑是否击中了角色复杂盔甲的每一个像素,而是简单地在玩家周围放置一个不可见、简化的长方形框。如果剑进入了那个框,就判定为命中!这种简单的抽象化使得游戏能够流畅地实时运行。
重点总结:要设计一个模型,只需保留有助于目标的各种信息,丢弃其他所有东西。
总结:抽象化思考
基础:抽象化是隐藏细节以专注于核心特征。
目标:使复杂问题更易于编写程序,且运行效率更高。
方法:确定特定目标,仅包含直接服务于该目标的数据点。
比较:现实是“本体”,而模型是该事物的“简化地图”。
你刚刚掌握了计算思维的第一个要素!下次当你使用地图或查看天气图标时,请记住——你正在看的就是一种抽象化!