C语言实现面向接口编程

今天更新的文章,我相信是大伙喜欢的,来聊聊面向接口编程。

不是一直都吹嘘着面向对象编程吗?怎么今天又来一个面向接口编程,很多人要说我不讲武德了。

1

面向接口是啥?

不用慌,其实面向接口编程不是什么新鲜玩意,说得直白点就是函数指针的使用,不过我觉得可以形成一种编程的思想来指导嵌入式程序设计,特别是对于降低代码的耦合还是比较奏效的。

面向接口编程比面向对象要更牛吗?为什么不直接玩面向对象编程呢?

其实bug菌这么多年开发过来,真正把C完完全全用面向对象的方式进行编写是非常少的,像C++中的继承、多态、虚函数等等面向对象特性,如果均用C语言来维护和实现是非常复杂的,并且你还不能保证没有bug。

再说了你写了一堆代码让C的特性更加的像C++,那为什么不直接使用C++呢?难道你觉得那些特性你能用C写得比C++更好?别重复造轮子了。

不过,话说回来,能够在C语言中借鉴一些面向对象的语言特性和思想,确实能够让C代码更加的优雅和灵活,所以今天聊聊面向接口编程,它仅仅只是面向对象的一部分,不过在一般的嵌入式开发中使用性价比还是比较高的。

2

面向接口编程

话不多说,先上一个面向接口编程的Demo:

参考demo:
1#include <stdio.h>
2#include <stdlib.h>
3
4/********************************************
5 * Note: 共用接口的定义 
6 * author:bug菌 
7 *******************************************/
8struct Interface {
9    int (*Initial)(void* handle);
10    int (*Send)(void* handle,char * buff,int count);
11    int (*Recv)(void* handle,char * buff);
12    int (*Destory)(void* handle);
13};
14
15 /********************************************
16 * Note: 具体类型的定义 
17 * author:bug菌 
18 *******************************************/
19typedef struct _tag_protocolType1 {
20    struct Interface bi; //公共通信接口 
21    char* CommTypeName; //通信名称 
22    //不同通信类型的其他成员...... 
23}protocolType1;
24
25
26/********************************************
27 * Note:其中一种报文协议的简单接口实现 
28 * author:bug菌 
29 *******************************************/
30void protocol_Initial(void* handle)
31{
32   protocolType1* p = ( protocolType1*)handle;
33    p->CommTypeName = 'protocolType1'; //可以通过公共接口传参访问原对象的所有成员 
34
35    printf('%s Initial\n',p->CommTypeName);
36} 
37
38void protocol_Send(void* handle,char * buff,int count)
39{
40    protocolType1* p = ( protocolType1*)handle;
41
42    printf('%s Send\n',p->CommTypeName);
43} 
44
45void protocol_Recv(void* handle,char * buff)
46{
47    protocolType1* p = (protocolType1*)handle;
48
49    printf('%s Recv\n',p->CommTypeName);
50} 
51
52void protocol_Destory(void* handle)
53{
54    protocolType1* p = (protocolType1*)handle;
55
56    printf('%s Destory\n',p->CommTypeName);
57} 
58
59/********************************************
60 * Note : 根据不同的类型,进行接口的初始化 
61 * author : bug菌 
62 *******************************************/
63void Initial(struct Interface *pInterface,int type)
64{
65    pInterface->Initial  = protocol_Initial;
66
67    pInterface->Send     = protocol_Send;
68
69    pInterface->Recv     = protocol_Recv;
70
71    pInterface->Destory  = protocol_Destory;
72
73}
74
75/********************************************
76 * Note :主题框架基本上不需要修改,这里只是简单示例,你可以更复杂 
77 * author : bug菌 
78 *******************************************/
79void Process(struct Interface *pInterface)
80{
81    pInterface->Initial(pInterface);
82
83    pInterface->Send(pInterface,NULL,0);
84
85    pInterface->Recv(pInterface,NULL);
86
87    pInterface->Destory(pInterface);
88
89}
90
91
92/********************************************
93 * Note :应用程序 
94 * author : bug菌 
95 *******************************************/
96int main(int argc, char *argv[]) {
97
98    protocolType1  protocol;
99
100    Initial((struct Interface*)&protocol,1);
101
102    Process((struct Interface*)&protocol); 
103
104    return 0;
105}
运行结果:
分析一下:
对于一名合格的程序员,代码show出来,本文就没有写下去的必要了,不过为了全文的整体性,还是啰嗦几句。
其实面向接口编程所采用就是面向对象编程中的继承,只不过它把所有的公共接口全部抽象出来供框架程序进行调用。
这样当我们需要增加其他类型的对象处理时,可以通过构造并替换不同的接口函数来进行处理,从而使得整体程序改动最小。
凡是一种复用的架构都会牺牲一定的性能,不过也会增加程序的可维护性,降低程序的耦合度,如果你开发的项目并不是很复杂, 也确定了以后接口不会有新的变化,其实不使用接口也是OK的。
对于自动测试程序框架,接口的预留是非常重要的,可以通过虚拟接口来测试业务逻辑,能够模拟更多实际环境下不同的工况来进行测试。
(0)

相关推荐

  • vxworks中常用的各种数据结构总结

    一: 基本数据结构 typedef struct node/* Node of a linked list. */ { struct node *next;/* Points at the next  ...

  • Python 中的面向接口编程

    "面向接口编程"写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝. 最 ...

  • 为什么我们要面向接口编程?!

    到底面向?编程 面向过程编程(Procedure Oriented.简称PO) 和 面向对象编程(Object Oriented.简称OO) 我们一定听过,然而实际企业级开发里受用更多的一种编程思想那 ...

  • 面向接口/协议?看DuerOS的技能开发

    一般地,开发一个对话系统或者机器人问答系统会涉及诸多领域的技术,除了硬件系统之外,还包括语言识别,自然语言处理/识别,知识图谱的搭建,自然语言生成及TTS播报等等,这对于企业及开发者个人而言,几乎是难 ...

  • 文化和自然遗产日|语言资源库上新!30种国内少数民族语言资源面向公众开放

    中国一共有多少种语言?你可能想不到,答案远远多于民族数量,130多种.但这130多种语言,"活力"却不尽相同,除了几种使用人口较多的语言外,大部分语言都在走向濒危. 在全球化背景下 ...

  • 以后再也不用面向Google编程了

    2021-07-01 09:51·技术联盟总坛 码农翻身刘欣 码农翻身 编程中遇到问题,Google一下, 复制.粘贴.调试...... 估计很多人都有这样的经历吧. 今天看到一个VS Code的插件 ...

  • 一文吃透 Go 语言解密之接口 interface

    大家好,我是煎鱼. 自古流传着一个传言...在 Go 语言面试的时候必有人会问接口(interface)的实现原理.这又是为什么?为何对接口如此执着? 实际上,Go 语言的接口设计在整体扮演着非常重要 ...

  • Stata的面向函数式编程——以独董职业背景多元化赫芬达尔指数的计算过程为例

    众所周知,在学习python的时候,老师们一般喜欢将编程的思维分成面向过程.面向函数和面向对象式编程几种,学习的过程层层递进.在使用stata的时候,我们一般都喜欢面向过程式编程,这也是stata经常 ...

  • (50条消息) 面向 Kubernetes 编程: Kubernetes 是下一代操作系统

    此文章适合没有任何 Kubernetes/容器/Docker 经验的同学 -- 在不久的将来,你不懂如何操作 Kubernetes 接口,就等于现在的你不懂最普通的 Linux 命令.导言 此文章着重 ...

  • 请不要面向监狱编程

    导语:上篇文章不是说了句爬虫没烦恼,牢饭少不了嘛,然后就引起了我的好奇心,加上之前老是看到程序员靠技术吃牢饭的新闻,所以有了这篇文章,理性看待请勿上头. 平时上网冲浪的时候,总是觉得网上别家程序猿们的 ...