- Python编程零基础入门
- (美)安娜·贝尔
- 1781字
- 2023-03-10 15:33:23
2.2 以烘焙为比喻
假设我们需要烘焙一块面包。从接到这个任务开始,直到面包出炉,需要经历什么过程呢?
2.2.1 理解“烘焙一块面包”这个任务
第一个步骤是确信自己理解给定的任务。“烘焙一块面包”这样的表述可能有些含糊不清。为了更清晰地了解这个任务,我们需要理解下面这些问题。
● 需要烘焙的面包的大小。
● 需要烘焙的面包是普通的面包还是某种风味的面包?是否必须使用或者不能使用某些特殊的配料?我们是不是缺少某些配料?
● 我们需要什么设备?是不是已经为我们提供了这个设备?或者需要自己准备?
● 是不是存在时间限制?
● 有什么菜谱可供我们查阅和使用?或者我们必须创建一份自己的菜谱?
重要的是我们必须得到这些细节,以避免从头开始完成这个任务。如果无法得到这个任务的更多细节,我们所设计的解决方案应该尽可能简单,并尽量减少需要完成的工作量。例如,我们应该查阅一份简单的菜谱,而不是自己研究配料的正确组合。另一个例子是先烘焙一小块面包,不要添加任何调味品或佐料,并使用面包机(如果有)以节省时间。
2.2.2 寻找菜谱
明确与这个任务有关的所有问题并解开了一些误会之后,就可以寻找一份菜谱或者自己研制一份菜谱了。菜谱告诉我们怎样完成这项任务。自己研制菜谱是完成这个任务最困难的部分。有了一个可以使用的菜谱之后,我们只需要把所有的任务细节组合在一起。
现在你可以快速浏览任何一份菜谱。图2.1展示了一份示例菜谱。
图2.1 一份面包菜谱示例
菜谱应该包含以下内容。
● 应该采取的步骤以及这些步骤的顺序。
● 具体的分量要求。
● 关于什么时候重复执行一项任务以及重复几次的指令。
● 某些配料的替代品。
● 成品的所有收尾工作以及怎样交给顾客。
图2.1所示的菜谱包含了一系列的步骤,我们必须按照这些步骤来烘焙面包。这些步骤是按顺序进行的。例如,把面团放在锅底之前,我们不能从烤箱里拿出面包。在某些步骤中,我们可以选择用某种配料代替另一种配料,例如我们可以放入黄油或菜籽油,但不能两者皆放。有些步骤可能需要重复,例如在面包烘焙完成之前需要不定期地检查面包皮的颜色。
2.2.3 用流程图展示菜谱的可视化表现形式
当我们阅读一份菜谱时,它的步骤序列很可能是用文本描述的。作为一名程序员,我们可以考虑用流程图以可视化形式来表示菜谱,如图2.2所示。
图2.2 一份简单的面包烘焙菜谱的流程图。矩形框表示一个行动。菱形框表示一个决策点。箭头指向前一个步骤的线表示一系列的重复。按照箭头方向我们可以跟踪菜谱的各种不同的实现路径
图2.2展示了怎样用一幅流程图描述烘焙面包的过程。在这个场景中,我们使用的是一台面包机,所使用的配料与图2.1所描述的略有不同。在这幅流程图中,步骤是在矩形框中展示的。如果一份菜谱允许使用替代品,就用菱形框表示这种选择。如果一份菜谱需要我们重复某个任务,就绘制一个向上的箭头,指向这个重复序列的第一个步骤。
2.2.4 使用现有的菜谱或自己创建一份菜谱
烘焙面包的菜谱有很多,我们如何知道该使用哪一个菜谱呢?对于诸如“烘焙一块面包”这样的含糊表述,所有的菜谱都是适用的,因为它们都能完成这个任务。从这个意义上说,当我们有一组菜谱可供选择时,越基本的表述越容易处理,因为每种菜谱都可能适合。
但是,如果有一位挑剔的食客,他要求烘焙的面包并无菜谱可参照,这时候我们想要完成任务就很困难了。我们必须试验各种不同的配料组合和数量,并试验各种不同的温度和烘焙时间。很可能,我们需要推倒重来好几次。
我们面临的最常见的问题类型就是某个特定的任务向我们提供了一些信息,例如“给我烘焙一块两斤重的迷迭香面包,用4杯面粉、1汤匙糖、1汤匙黄油、1茶匙盐和1茶匙酵母”。我们无法准确地找到一份能够完美地完成这个任务的菜谱,但我们已经得到了与这个任务有关的大量关键信息。在这个例子中,除了迷迭香的数量,其他配料的数量我们都已经知悉。这个任务最困难的地方在于试验各种配方的组合方式以及迷迭香的添加数量。如果我们并不是第一次烘焙面包,我们会对添加多少迷迭香具有一些直观概念。我们的经验越丰富,这个任务就越简单。
这个烘焙面包例子可以概括的一个主要思想是在烘焙面包时,我们需要做的事情要远远多于一份菜谱的步骤。我们首先要理解需要烘焙什么东西,其次必须确定是否有任何现有的菜谱可供参照。如果没有,我们必须自己设计一份菜谱,并对它进行试验,直到做出与需求相匹配的最终产品。在下一节中,我们将看到怎样把这个烘焙例子转换到编程中。