软件设计从架构上来说,以下几点是其基本的指导原则:
1:低耦合、高内聚
2:开闭原则,即对扩展开放,对修改关闭
3:功能的模块化、正交化
。。。
所有这些原则的根本目的是:提高软件的可复用性、可扩展性。
各种高级编程语言,为了实现这一目的,都在自身语言中提供了相应的支持。如 类class,接口interface。在这篇文章里,我将从最基本的语言:C 谈起,来说说C语言对软件的结构化、模块化设计的支持。
主要包括一下几个概念:
1:文件
包括头文件和源文件,这是最基本的。将函数按功能安排在不同的源文件中,使得每个源文件或每几个源文件并同头文件组成一个功能完整的子模块,源文件之间的信息共享是通过头文件来完成的。
C中,每个源文件都是一个完整且独立的编译单元。而头文件中的变量和函数声明用于每个编译单元之间的共享和最终的链接。
要完成以上功能,C语言中提供了以下几个主要且重要(其他与结构化设计关系不大的概念,这里将不介绍)关键字和概念:
static,extern;作用域(可见性),生命期;全局,局部;
下面进行简单说明:
static: 将函数或变量(统称为标识符)的作用域限制在文件作用域中(如果该标识符原来是external);(如果该标识符原来是块作用域的,即位于某函数中,则作用域不变)
extern: 在函数外部声明的标识符默认为external, extern修饰的标识符用来告诉编译器该标识符已经在其他源文件中定义了,并且是external的,所以我这里想要直接拿来用,而不用我自己再定义了。对于一个良好的设计,extern声明一般都放在头文件中,对于需要使用该标识符的源文件可以通过包含该头文件来使用它。
作用域:主要的是:文件作用域和块作用域。(其他两种作用域:函数声明作用域和函数作用域基本没啥用处,但要知道是什么东西)
生命期:生命期的长短与标识符(这里尤其指的是变量或对象)的存储位置相关,并且也受到static关键字的控制。
全局:在函数之外定义的标识符都是在当前文件中是可见的,缺省情况下在整个程序中也是可见的。但使用static可将其可见性只限于当前文件
局部:在函数内定义。
通过上面的介绍,我们将得到这几个工具来实现一个良好的C程序:static, extern, 头文件,源文件,函数
指导原则如下:
1:函数的定义全部放在源文件(.CPP)中
2:如果该函数只需要在当前文件中使用,则请务必在前面加static修饰
3:如果希望该函数被其他源文件使用,则将该函数的extern声明放在一指定头文件(.h)中,再在需要使用该函数的源文件中包含该头文件
4:变量的使用规则与函数相同
C语言毕竟相对简单,没有提供很多更高级的代码复用技术,但只要真正理解(要理解底层的内存布局和分配)了上述的软件设计原则,一样可以设计出很好的软件架构。