C语言的面向接口编程

面向接口是啥?
不用慌,其实面向接口编程不是什么新鲜玩意,说得直白点就是函数指针的使用,不过我觉得可以形成一种编程的思想来指导嵌入式程序设计,特别是对于降低代码的耦合还是比较奏效的。
面向接口编程比面向对象要更牛吗?为什么不直接玩面向对象编程呢?
其实bug菌这么多年开发过来,真正把c完完全全用面向对象的方式进行编写是非常少的,像c++中的继承、多态、虚函数等等面向对象特性,如果均用c语言来维护和实现是非常复杂的,并且你还不能保证没有bug。
再说了你写了一堆代码让c的特性更加的像c++,那为什么不直接使用c++呢?难道你觉得那些特性你能用c写得比c++更好?别重复造轮子了。
不过,话说回来,能够在c语言中借鉴一些面向对象的语言特性和思想,确实能够让c代码更加的优雅和灵活,所以今天聊聊面向接口编程,它仅仅只是面向对象的一部分,不过在一般的嵌入式开发中使用性价比还是比较高的。
面向接口编程
话不多说,先上一个面向接口编程的demo:
参考demo: 1#include  2#include  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,p->commtypename); 36}  37 38void protocol_send(void* handle,char * buff,int count) 39{ 40    protocoltype1* p = ( protocoltype1*)handle; 41 42    printf(%s send,p->commtypename); 43}  44 45void protocol_recv(void* handle,char * buff) 46{ 47    protocoltype1* p = (protocoltype1*)handle; 48 49    printf(%s recv,p->commtypename); 50}  51 52void protocol_destory(void* handle) 53{ 54    protocoltype1* p = (protocoltype1*)handle; 55 56    printf(%s destory,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; 99100    initial((struct interface*)&protocol,1);101102    process((struct interface*)&protocol); 103104    return 0;105} 运行结果:
分析一下: 对于一名合格的程序员,代码show出来,本文就没有写下去的必要了,不过为了全文的整体性,还是啰嗦几句。其实面向接口编程所采用就是面向对象编程中的继承,只不过它把所有的公共接口全部抽象出来供框架程序进行调用。这样当我们需要增加其他类型的对象处理时,可以通过构造并替换不同的接口函数来进行处理,从而使得整体程序改动最小。凡是一种复用的架构都会牺牲一定的性能,不过也会增加程序的可维护性,降低程序的耦合度,如果你开发的项目并不是很复杂, 也确定了以后接口不会有新的变化,其实不使用接口也是ok的。对于自动测试程序框架,接口的预留是非常重要的,可以通过虚拟接口来测试业务逻辑,能够模拟更多实际环境下不同的工况来进行测试。


扎根底层技术,推动机器人换代式升级
吉时利KEITHLEY2612A 数字源表
思谋科技宣布已完成2亿美元B轮融资
直流开关电源保护电路
microBUCK系列集成同步降压稳压器SiC414(Vis
C语言的面向接口编程
LED节点添加、配置、连线等基本开发过程
华为Mate 40系列参数指标被坐实 搭载鸿蒙OS成最强机皇
银欣发布 ITX 机箱:模块化设计支持 240 水冷
小米10标准版入网 或在2月11日之前登场
轻量化5G RedCap的技术优势与应用场景
虚拟运营商正式商用后的现状 与传统的业务有什么区别
苹果预计最快 2022 年9月发布第一款折叠 iPhone
数字绝缘电阻测试仪与绝缘电阻测试仪的区别
中芯国际下架14nm工艺的原因 中芯国际看好28nm
英政府计划2023年全面禁止汽油、柴油车及混合动力车的销售
工业网络中的CAN 总线连接方案
新的医疗设备有望彻底改变肿瘤学研究和药物开发
盘点汽车电子中的MEMS传感器TOP10
精彩回顾!本源量子携手“科技袁人”带你走进量子计算!