原子函数

  • 1984 年,史托曼开始 GNU 项目,这个项目的目的是创建一个自由、开放的 UNIX 操作系统(Free UNIX)。但是创建一个操作系统谈何容易?而且在当时的 GNU 是仅有史托曼一个人单打独斗的,这是实在是太麻烦,但又不想放弃这个项目,那可怎么办呢?
  • 聪明的史托曼干脆反其道而行之:“既然操作系统太复杂,我就先写可以在 UNIX 上面运行的小程序,这总可以了吧。”
——《鸟哥的 Linux 私房菜 基础学习篇》 P31

不记得是在哪里看到原子函数这个说法的了。大意就是,不要编写内容复杂繁重的大函数,而应该编写仅进行单个操作的短小函数。

有哪些好处呢?

  • 使得程序逻辑清晰,每一行的功能都会非常明显,有利于阅读、修改。
  • 将会多次使用到的代码抽出,避免代码重复。
  • 在正确抽象出这些函数的功能后,只需要确保每个函数都能正确实现其功能,程序便会正确工作。

那是不是不能编写实现几个功能的函数呢?并不是这样,只不过应将这样的大函数划分为几个主要功能,再将这些主要功能一一编写为函数。


一个例子:

大作业的点菜窗口中涉及到这么一个问题:菜单中的菜DishInfo加入食物托盘列表(创建一个Dish),食物托盘列表中的菜删除,这两个操作都涉及到重绘食物托盘列表的显示器,那么该如何编写重绘函数呢?

为了解决这个问题,不妨先分析一波这两个函数的功能:

  • 将菜加入食物托盘的函数:
    • 接收传入的DishInfo
    • 向食物列表的multiset中加入一条Dish
    • 向食物托盘列表的显示窗中加入一条信息
  • 将菜从食物托盘删除的函数:
    • 接收传入的Dish
    • 从食物列表的multiset中删除一条Dish
    • 清空食物托盘列表显示窗
    • multiset中所有的 Dish 加入食物托盘列表的显示窗

可以看到,分析了函数的功能后,该如何划分原子函数就很明了了:

  1. 操作multisey可直接用两条语句,也可以用函数包装以便以后增加功能。
  2. 向食物托盘列表的显示窗中加入信息写为单独函数(比如叫做insert_to_table),接收const Dish&参数。
  3. 而清空显示窗并将所有的Dish加入显示窗的函数应包含两个操作: a. 清空显示窗,一条语句解决。 b. 用for循环读取multiset中所有的Dish,并调用insert_to_table函数添加信息。

tandf

Tsinghua University, Department of Automation
One thing at a time. One thing done well.