模块化编程分析与设计的基本理论
在理想的模块化编程中,每个模块都可以看做是一个黑盒,只需要了解模块提供的功能以及使用的方法,不需要关心具体实现该模块功能的策略和方法,即提供的是机制而不是策略,机制即功能,策略即方法。就好像我们买了一部手机,只需要会用它所提供的各种功能即可,至于各种功能在底层是如何实现的,用户不需要关心。
在大型程序开发中,一个程序由不同的模块组成,可能不同的模块会由不同的人员负责。在编写某个模块的时候,很可能需要调用别人写好的模块的接口。这个时候关心的是:其他模块提供了什么样的接口,应该如何去调用,至于模块内部是如何实现的,对于调用者而言,无须过多关注。模块对外提供的只是接口,把不需要的细节尽可能对外部隐藏起来,这正是采用模块化程序设计所需要注意的地方。
一个最小的模块单元包含两个文件:一个是“.h”文件(又称为头文件);另一个是“.c”文件(又称为源文件)。
1.“.h”文件(又称为头文件)
该文件可以理解为一份接口描述文件,其文件内部一般不包含任何实质性的函数代码,可以把这个头文件理解成为一份说明书,其内容就是这个模块对外提供的接口函数、接口变量以及使用说明等。
此外,该文件也可以包含一些很重要的宏定义以及一些数据结构的信息,离开了这些信息,该模块提供的接口函数或者接口变量很可能就无法正常使用。
头文件的基本结构原则是:不该让外界知道的信息就不应该出现在头文件里,而供外界调用的模块内接口函数或接口变量等需要的信息就一定要出现在头文件里,否则,外界就无法正确地调用该模块提供的功能。
当外部函数或者文件调用该模块提供的接口函数或变量时,就必须包含该模块提供的这个接口描述文件:“.h”文件(头文件)。同时,该模块的“.c”文件也需要包含这个模块头文件(因为它包含了模块源文件中所需要的宏定义或数据结构等信息)。
通常,头文件的名字应该与源文件的名字保持一致,这样便可以清晰地知道哪个头文件是对哪个源文件的描述。
2.“.c”文件(又称为源文件)
该文件主要功能是对“.h”文件中声明的外部函数进行具体的实现,对具体实现方式没有特殊规定,只要能实现其函数的功能即可。
注意:嵌入式开发过程中,有时候会碰到包含很多文件的相对复杂的模块,其实这些复杂的模块就是最小的模块单元的集合,将需要提供给外部的接口函数或者接口变量再次重新封装到一个或几个头文件中,然后提供给外部使用。