欢迎来到程序设计!

在本章中,我们将探讨计算机科学家最常用的两大“思维工具”:抽象 (Abstraction)分解 (Decomposition)。别被这些深奥的词汇吓到了!事实上,它们只是你每天用来解决问题时所运用的技巧,只是换了个专业名称而已。读完这些笔记后,你将会发现,这些技巧能将一个“不可能的任务”般的程序编写项目,转变为一系列轻松、易于管理的小任务。


1. 抽象:专注于重点

试想一下,当你在查阅城市地图寻找巴士站时,地图会显示每一根草吗?它会显示每个人家门口的颜色吗?当然不会!如果地图包含了所有细节,就会变得太杂乱而无法阅读了。

抽象是移除或隐藏问题中不必要细节的过程,目的是让你能够专注于重要的部分。在计算机科学中,我们利用抽象来降低复杂度,并让设计解决方案的过程变得更容易。

现实生活中的比喻:驾驶汽车

当你在开车时,你其实就在使用抽象。你只需要操作方向盘、脚踏板和排挡杆。你不需要知道引擎内部的活塞如何运作,也不需要了解燃油喷射系统的原理,就能顺利开车去超市。这些细节因为对于“驾驶”这个任务来说并不重要,所以被“抽象”了。

为什么抽象很重要?

1. 简化问题: 让核心逻辑更容易被看见。
2. 节省时间: 不会把精力浪费在对结果没有影响的细节上。
3. 提升设计: 让你能够建立出真正有效的模型(例如气象图或飞行模拟器)。

你知道吗? 著名的伦敦地铁图就是抽象的经典例子。它并没有显示轨道的实际距离或弯曲程度,它只显示车站之间的连接关系,因为这就是乘客需要知道的一切!

快速复习:抽象

定义: 隐藏不必要的细节。
目标: 简化问题。
例子: 汽车仪表盘或简化的地图。


2. 分解:拆解问题

如果有人叫你“盖一栋房子”,你可能会感到不知所措,甚至不知道从何下手。但如果他叫你“为前墙铺砖”,这听起来就容易多了。

分解是将一个大型且复杂的问题,拆解成较小、较易于管理的子问题的过程。每一个子问题都对应一个具体且明确的任务。这些小任务可以进一步拆解,直到它们变得足够简单,能轻易解决为止。

步骤示例:泡一杯茶

如果我们将“泡茶”这个任务进行分解,可能会像这样:

1. 烧开水:(装水入水壶、插电、等待水开)。
2. 准备杯子:(拿杯子、放入茶包)。
3. 冲泡:(倒入热水、等待 3 分钟、取出茶包)。
4. 完成:(加入牛奶/糖、搅拌)。

这些步骤中的每一个都是一个明确的任务。只要你能完成这四件小事,你就成功解决了“泡茶”这个大问题。

程序设计中的分解

在 9645 计算机科学领域中,我们透过使用子程序 (subroutines)(也称为函数或过程)来达成分解。我们不会编写一大段程序代码,而是编写多个小型的子程序,每个子程序处理程序的一部分,例如 calculateTax()(计算税款)或 validatePassword()(验证密码)。

记忆法:分而治之 (Divide and Conquer)

分解想象成“分而治之”。你把巨大的敌人(问题)分开 (divide),变成一支你可以逐一 征服 (conquer) 的小军队。

快速复习:分解

定义: 将问题拆解成较小的子问题。
目标: 使复杂的任务变得可管理。
程序实现: 我们使用子程序来代表这些子问题。


3. 两者如何协同运作

如果起初觉得这两者很像,也不用担心!它们就像硬币的两面。以下是如何区分它们的方法:

抽象关于细节 (DETAIL)。(我能忽略什么?)
分解关于结构 (STRUCTURE)。(我该如何将此拆解成碎片?)

示例:制作一款电子游戏
你使用抽象来决定“玩家”只是一个拥有“生命值”数字和“位置”的角色——你忽略了他们的眼睛颜色或早餐吃了什么。
你使用分解将游戏拆解为各个任务:“处理输入”、“更新物理模拟”以及“渲染图形”。


4. 常见错误,需多加留意

混淆两者: 请记住,如果你是在删除信息,那就是抽象;如果你是在将问题切割成各个部分,那就是分解。
过度分解: 不要将任务拆解到变得难以管理!如果拆解后的碎片比原本的任务还难处理,那就没必要了(你不需要为 1 + 1 写一个单独的子程序)。
忘记目标: 这两者的共同目标,都是为了让程序员在程序设计 (Program Design) 阶段时,工作能更轻松。


总结重点

1. 抽象通过移除不必要的细节来简化问题。
2. 分解通过将问题拆解为较小的子任务,使问题变得易于管理。
3. 结合使用这两种技巧是结构化程序设计的必要条件。
4. 子程序是我们在此程序代码中实现分解的主要方式。

做得好!你刚刚掌握了程序设计的基础。这些概念将会让你学习 Oxford AQA 大纲中其他章节时,感到更加轻松!