前言
把一个大的问题分解成小片段的策略的方法在程序设计过程的很多阶段都会用到。
比如碰到一个50行的函数时,最好的方法是把它分成几个相互调用的小函数来完成任务。
当碰到一个包含50个函数的程序时,最好的办法就是把程序再分成几个更小的源文件。
每个源文件都包含一组相关的函数。
- 模块(module)
由整个程序的一部分组成的较小的源文件。
可以把同一模块作为许多不同的应用程序一部分。
当把一个程序分成模块的时候,选择合适的分解方法来减少模块之间相互依赖的程度是很重要的。
- 主模块(main module)
包含main函数的模块称作主模块,在分解层次中处于最高层。
每个其他模块代表一个独立的抽象,其操作在一个接口中定义。
为了说明这个原则,假设已经编写了一个如图10-1所示的文件program.c
。
这个程序由一个文件组成,该文件包含一个主程序和两个过程ProcA
和ProcB
:
![](https://i-blog.csdnimg.cn/blog_migrate/8482c51077747178854e0eeeaa68af08.png)
可以把这个源文件分解成包括main
函数的主模块和两个子模块。
第一个子模块包括ProcA
,第二个子模块包括ProcB
,如图10-2所示:
![](https://i-blog.csdnimg.cn/blog_migrate/cb8aee886f9bfecbbbd2d4683486b242.png)
主模块现在只包含整个程序的部分代码。函数ProcA
和ProcB
的实现是在单独的模块中。
从某种意义上说,每个子模块都作为主模块的库。和任何库一样,每个模块必须有一个接口,为编译器提供关于模块所包含的函数的必要信息。
在图10-2中,这些接口表示为头文件module1.h
和module2.h
。
以上是一个简化了的模块开发的例子。在更典型的应用中,每个模块包含一系列相关的函数,这些函数可以形成一个可容易识别的作为一个整体的应用的组件。
参考
《C语言的科学和艺术》 —— 第10章 模块化开发