C语言-接口与实现

1. 模块化编程

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

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

2. 接口

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

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

<arith.h>
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的标准范例是栈。

<stack.h>

#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语言接口网上的资料是少之又少,所以下面这些文字全是我一个字一个字打印上来的希望大家 能对的起我的付出: 现在的程序员都面临大量的关于应用程序接口(Application Programming Interface,API) 的信息,大多数人都会使用API和程序库,并在其所写的每一个应用程序中实现它们,但是很少人 会创建或发布新的能广泛应用的API,事实上,程序员似乎倾向循环使用他们自己的东西,而不 愿意查找,能满足他们要求的程序库,这或许是因为写特定应用程序代码要比查找设计好的API容易。 这里我所提到的是一种基于接口实现的设计方法,并且通过对24个接口及其实现的描述详细地演示了这种方法,这些接口涉及到计算机领域的很多知识,其中包括数据结构,算法,字符串处理 和并发程序,这些实现并不是简单的玩具----它们是为了在你们所设计的软件代码中使用而设计的。(当然了我会通过阅读量来看是否继续发下去,人要少了我就没有必要浪费时间了) c编程语言对基于接口设计方法的支持是极少的。 而面向对象语言,如c++,Modula-3,则鼓励将接口实现分离,基于接口的设计独立任何特定 的语言,但是它要求程序员对像c一样的语言有更多的驾驭能力和更高的警惕性,因为这类语言很容易破坏带有隐含实现信息的接口,反之亦然。 然而一但掌握了基于接口的设计方法,就能够在服务于众多应用程序的通用接口基础上建立应用程序,从而加速开发,在一些c++环境中的基础类库就体现了这种效果。 增加对现有软件的重用---接口实现库,能够减少初始开发成本,同时还能减少维护成本,因为应用程序的更多部分都建立在经过良好测试的通用接口实现上,这里我提到的接口是针对数据结构的,但它并不是数据结构,我重点将放在算法引擎----包装数据结构以供应用程序使用----而不在数据结构算法本身,接口的示例和实现都以literate程序的方式给出,换句话说就是源代码及其解释是按照最适合理解代码的顺序交织出现的。 下面我将我想要给大家讲的内容分一下类: 基础 1,接口实现 2,异常断言 3,内寸管理 4,进一步内寸管理 数据结构 5,链表 6,表格 7,集合 8,动态数组 9,序列 10,环 11,位向量 字符串 12,原子 13,格式化 14,低级字符串 15,高级字符串 算法 16,扩展精度算法 17,任意精度算法 18,多精度算法 线程 19,线程 建议: 看到这里的朋友我相信对c语言都有了很长时间的学习 如果你还没有搞懂c语言的全部内容,我强烈建议你先别看这里
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智小星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值