欢迎来到“预先规划”(Thinking Ahead)!

在本章中,我们将探讨程序员在动手写程序之前是如何规划工作的。想象一下专业厨师在准备繁忙的晚餐时段:他们不会直接开始烹饪,而是会先检查食材、准备工具,并思考如何在高峰时段加快出餐速度。在计算机科学中,我们称这种准备功夫为预先规划(Thinking ahead)

研读完这些笔记后,你将能理解如何界定程序启动的需求、明确预期的输出结果、处理先决条件,以及通过缓存(Caching)可重用性(Reusability)来优化程序执行效率的巧妙方法。


1. 识别输入与输出

每一个计算机程序本质上都是一个处理机器:它接收某些事物,进行处理,然后产出结果。

什么是输入(Inputs)?

输入是指进入系统的数据或信号。这些不一定只是用户键入的信息!输入的来源可以包括:

  • 用户输入:输入名字、点击按钮,或是使用游戏控制器。
  • 传感器:温度计的读数或全球定位系统(GPS)的坐标。
  • 文件/数据库:读取存储的高分记录或客户名单。

什么是输出(Outputs)?

输出是指系统在处理输入后产生的结果。例如:

  • 视觉:屏幕上显示的信息或打印出来的收据。
  • 物理:机械臂的动作或加热器的启动。
  • 数据:存储文件或发送电子邮件。

现实生活中的例子: 想象一下自动售货机。输入就是你投入的钱和输入的代码(例如“A1”)。输出就是掉下来的那份美味零食。

快速回顾:

要识别输入和输出,请随时问自己:“计算机在开始前需要知道什么?”以及“用户希望看到的最终结果是什么?”


2. 确定先决条件(Preconditions)

先决条件(Preconditions)是指程序或特定函数在成功执行前必须满足的条件。如果未满足这些条件,程序可能会崩溃或得出错误的答案。

为什么需要先决条件?

设定明确的先决条件能让程序更可靠、更容易除错。与其在复杂的函数“内部”检查错误,不如在函数执行“之前”确保一切状况完美。

示例: 如果你正在编写一个计算平方根的函数,一个先决条件就是输入的数字不能是负数(除非你在处理复数!)。

常见错误:
不要将先决条件与代码本身混淆。先决条件是一种在程序执行前必须存在的“状态”。例如,要让二分搜索法(Binary Search)运作,列表必须已经排序。“列表已排序”就是该函数的先决条件。

重点总结:

先决条件就像是函数的“条款与细则”。如果这些条件不满足,函数将无法保证产出正确的结果。


3. 缓存的威力(The Power of Caching)

缓存(Caching)(读音类似 "cashing")是指将曾经使用过的数据存储在临时的告诉存储区中,以便在未来需要时能更快速地读取。

运作原理

想象你在写作业时,必须不断查阅一本厚重课本里的同一个定义。与其每次都跑去书架查书,不如把定义写在便利贴上贴在桌子旁。那张便利贴就是你的缓存(cache)

缓存的优点:

  • 速度:从缓存中检索数据比从主要来源(如硬盘或互联网)提取快得多。
  • 效率:减轻中央处理器(CPU)的工作负载并节省网络带宽。

缓存的缺点:

  • 复杂度:决定存储什么数据以及何时删除它们,对程序员来说是有挑战性的。
  • 过期数据(Stale Data):如果原始数据已变更,但缓存未同步更新,程序就会使用“过期”(错误)的信息。

你知道吗? 当你浏览网页时,网页缓存(Web caching)无处不在。你的浏览器会存储你常访问网站的图片,这样你每次重新刷新页面时,就不必重新下载所有内容!

缓存总结:

缓存 = 速度。 它对提升效能极有帮助,但必须小心确保数据不会过期。


4. 可重用程序组件(Reusable Program Components)

在“预先规划”阶段,优秀的程序员会寻找只写一次代码但能多次使用的方法,这些被称为可重用程序组件

可重用组件的类型:

  • 函数(Functions)与程序(Procedures):执行特定任务的小型代码块(例如:计算税额)。
  • 函数库(Libraries):预先写好且任何人都能使用的函数集合(例如:用于三角函数的“数学”函数库)。
  • 子程序(Subroutines):程序中可以从任何地方被“调用”的特定部分。

可重用性的优点:

1. 节省时间:你不需要“重新发明轮子”。
2. 更易于测试:如果一个组件被重复使用,通常代表它已经过测试并证明是有效的。
3. 标准化:确保在整个大型项目中,执行同一个任务的方式都是一致的。

如果初次接触觉得困难也别担心…… 只要记得可重用性就像使用乐高积木。你不会在每次想盖房子时都重新模塑一个新的塑料积木;你会直接使用你现有的标准积木!

记忆口诀:可重用性的“T.E.D.”原则

T - Tested(已测试:确保运作正常)
E - Efficient(高效:节省编码时间)
D - Dependable(可靠:结果一致)


快速复习测验

用以下三道题检查你的理解程度:

1. 如果程序要求输入你的“出生日期”,这属于输入还是输出?(答案:输入)
2. 使用缓存的主要风险是什么?(答案:数据过期或信息错误)
3. 为什么使用预先写好的函数库是一个好主意?(答案:它们已经过测试,且能节省开发时间)

考试小贴士:当被问及关于“预先规划”时,一定要提到它的核心在于规划执行效率减少未来的工作量