C语言-接口与实现

1. 模块化编程

       面向对象编程是一种思想,和语言无关。学过C++、java等面向对象编程语言的同学,应该都知道面向对象的三大特性是封装继承多态。而C语言一直被蒙上了面向过程编程的面纱。工作后从事的是嵌入式软件开发,在开发过程中运用最多的还是C语言,所以在程序的设计过程中,一直想使用C语言达到面向对象编程的效果,这里将讲解使用C语言来模拟面向对象编程的实现。

       在项目的开发过程中,我们将使用到很多的功能模块,由于C语言的灵活性和自由性,若在编程时不遵循模块化编程思想,其代码的可读性将是一件令人头痛的问题。为了提高项目工程的可读性和可维护性,我们将采用模块化编程思想,例如:将按键和液晶显示分为两个独立的模块key.c和lcd.c,每个模块应该尽量降低与其他模块的耦合性。模块分为两个部分,即模块的接口实现,在C语言中实现接口和实现的方法,即为xxx.h和xxx.c。

2. 接口

       接口规定了模块做什么,仅规定应用程序可能使用的那些标识符,而尽可能隐藏不相关的表示细节和算法。在C语言中,接口通过一个头文件指定,头文件的扩展名通常为.h。这个头文件会声明应用程序可能使用的宏、类型、数据结构、变量和接口声明。应用程序通过预处理指令#include导入接口。

       以下例子说明了接口的使用约定。下述接口


extern int Arith_max(int x, int y);
extern int Arith_min(int x, int y);
extern int Arith_div(int x, int y);
extern int Arith_mod(int x, int y);
extern int Arith_ceiling(int x, int y);
extern int Arith_floor(int x, int y);

      声明了6个整数算术运算函数,其它模块需要使用时,只需要通过#include导入。该接口命名为Arith,接口头文件命名为arith.h。在接口中,接口名称表现为每个标识符的前缀,这样能够有效的避免名称冲突,并且有助于程序代码文档化。

3. 实现

      实现会导出接口。它定义了必要的变量和函数,以提供接口规定的功能。实现具体解释了接口的语义,并给出其表示细节和算法,但在理想情况下,应用程序从来都不需要看到这些细节。

      一个接口可以有多个实现。只要实现遵循接口的规定,完全可以在不影响应用程序的情况下改变实现。在C语言中,一个实现通过一个或多个.c文件来提供。实现必须提供其导出的接口规定的功能,实现会包含接口的.h文件,以确保其定义与接口的声明一致。

      如arith.c所示:

#include "arith.h"

int Arith_max(int x, int y)
{
    return x > y ? x : y;
}

int Arith_min(int x, int y)
{
    return x > y ? y : x;
}

4. 抽象数据类型

       一个抽象数据类型是一个接口,它定义了一个数据类型和对该类型的值所进行的操作。一个数据类型是一个值的集合。在C语言中,内建的数据类型包括字符、整数、浮点数等。而结构本身也能定义新的类型,因而可用于建立更高级类型,如列表、树、查找表等。

       高级类型是抽象的,因为其接口隐藏了相关的表示细节,并只规定了对该类型值的合法操作。理想情况下,这些操作不会暴露类型的表示细节,因为那样可能使应用程序隐含地依赖于具体的表示。抽象数据类型或ADT的标准范例是栈。



#ifndef STACK_INCLUDED
#define STACK_INCLUDED

#define T Stack_T

typedef struct T *T;

extern T Stack_new(void);
extern int Stack_empty(T stk);
extern void Stack_push(T stk, void *x);
extern void *Stack_pop(T stk);
extern void Stack_free(T *stk);

#undef T
#endif

 

你可能感兴趣的:(C语言温故知新)