原子函数
- 1984 年,史托曼开始 GNU 项目,这个项目的目的是创建一个自由、开放的 UNIX 操作系统(Free UNIX)。但是创建一个操作系统谈何容易?而且在当时的 GNU 是仅有史托曼一个人单打独斗的,这是实在是太麻烦,但又不想放弃这个项目,那可怎么办呢?
- 聪明的史托曼干脆反其道而行之:“既然操作系统太复杂,我就先写可以在 UNIX 上面运行的小程序,这总可以了吧。”
——《鸟哥的 Linux 私房菜 基础学习篇》 P31
不记得是在哪里看到原子函数这个说法的了。大意就是,不要编写内容复杂繁重的大函数,而应该编写仅进行单个操作的短小函数。
有哪些好处呢?
- 使得程序逻辑清晰,每一行的功能都会非常明显,有利于阅读、修改。
- 将会多次使用到的代码抽出,避免代码重复。
- 在正确抽象出这些函数的功能后,只需要确保每个函数都能正确实现其功能,程序便会正确工作。
那是不是不能编写实现几个功能的函数呢?并不是这样,只不过应将这样的大函数划分为几个主要功能,再将这些主要功能一一编写为函数。
一个例子:
大作业的点菜窗口中涉及到这么一个问题:菜单中的菜DishInfo
加入食物托盘列表(创建一个Dish
),食物托盘列表中的菜删除,这两个操作都涉及到重绘食物托盘列表的显示器,那么该如何编写重绘函数呢?
为了解决这个问题,不妨先分析一波这两个函数的功能:
- 将菜加入食物托盘的函数:
- 接收传入的
DishInfo
- 向食物列表的
multiset
中加入一条Dish
- 向食物托盘列表的显示窗中加入一条信息
- 接收传入的
- 将菜从食物托盘删除的函数:
- 接收传入的
Dish
- 从食物列表的
multiset
中删除一条Dish
- 清空食物托盘列表显示窗
- 将
multiset
中所有的 Dish 加入食物托盘列表的显示窗
- 接收传入的
可以看到,分析了函数的功能后,该如何划分原子函数就很明了了:
- 操作
multisey
可直接用两条语句,也可以用函数包装以便以后增加功能。 - 向食物托盘列表的显示窗中加入信息写为单独函数(比如叫做
insert_to_table
),接收const Dish&
参数。 - 而清空显示窗并将所有的
Dish
加入显示窗的函数应包含两个操作: a. 清空显示窗,一条语句解决。 b. 用for
循环读取multiset
中所有的Dish
,并调用insert_to_table
函数添加信息。