正文
大家好,我是bug菌!今天更新的文章,我相信是大伙喜欢的,来聊聊面向接口编程。不是一直都吹嘘着面向对象编程吗?怎么今天又来一个面向接口编程,很多人要说我不讲武德了。1
面向接口是啥?
不用慌,其实面向接口编程不是什么新鲜玩意,说得直白点就是函数指针的使用,不过我觉得可以形成一种编程的思想来指导嵌入式程序设计,特别是对于降低代码的耦合还是比较奏效的。
面向接口编程比面向对象要更牛吗?为什么不直接玩面向对象编程呢?
其实bug菌这么多年开发过来,真正把C完完全全用面向对象的方式进行编写是非常少的,像C++中的继承、多态、虚函数等等面向对象特性,如果均用C语言来维护和实现是非常复杂的,并且你还不能保证没有bug。
再说了你写了一堆代码让C的特性更加的像C++,那为什么不直接使用C++呢?难道你觉得那些特性你能用C写得比C++更好?别重复造轮子了。
不过,话说回来,能够在C语言中借鉴一些面向对象的语言特性和思想,确实能够让C代码更加的优雅和灵活,所以今天聊聊面向接口编程,它仅仅只是面向对象的一部分,不过在一般的嵌入式开发中使用性价比还是比较高的。
2
面向接口编程
话不多说,先上一个面向接口编程的Demo:
参考demo:1#includestdio.h2#includestdlib.h34/********************************************5*Note:共用接口的定义6*author:bug菌7*******************************************/8structInterface{9int(*Initial)(void*handle);10int(*Send)(void*handle,char*buff,intcount);11int(*Recv)(void*handle,char*buff);12int(*Destory)(void*handle);13};/********************************************16*Note:具体类型的定义17*author:bug菌18*******************************************/19typedefstruct_tag_protocolType1{20structInterfacebi;//公共通信接口21char*CommTypeName;//通信名称22//不同通信类型的其他成员......23}protocolType1;/********************************************27*Note:其中一种报文协议的简单接口实现28*author:bug菌29*******************************************/30voidprotocol_Initial(void*handle)31{32protocolType1*p=(protocolType1*)handle;33p-CommTypeName="protocolType1";//可以通过公共接口传参访问原对象的所有成员printf("%sInitial\n",p-CommTypeName);36}voidprotocol_Send(void*handle,char*buff,intcount)39{40protocolType1*p=(protocolType1*)handle;printf("%sSend\n",p-CommTypeName);43}voidprotocol_Recv(void*handle,char*buff)46{47protocolType1*p=(protocolType1*)handle;printf("%sRecv\n",p-CommTypeName);50}voidprotocol_Destory(void*handle)53{54protocolType1*p=(protocolType1*)handle;printf("%sDestory\n",p-CommTypeName);57}/********************************************60*Note:根据不同的类型,进行接口的初始化61*author:bug菌62*******************************************/63voidInitial(structInterface*pInterface,inttype)64{65pInterface-Initial=protocol_Initial;pInterface-Send=protocol_Send;pInterface-Recv=protocol_Recv;pInterface-Destory=protocol_Destory;}/********************************************76*Note:主题框架基本上不需要修改,这里只是简单示例,你可以更复杂77*author:bug菌78*******************************************/79voidProcess(structInterface*pInterface)80{81pInterface-Initial(pInterface);pInterface-Send(pInterface,NULL,0);pInterface-Recv(pInterface,NULL);pInterface-Destory(pInterface);}/********************************************93*Note:应用程序94*author:bug菌95*******************************************/96intmain(intargc,char*argv[]){protocolType1protocol;Initial((structInterface*)protocol,1);Process((structInterface*)protocol);return0;}运行结果:分析一下:对于一名合格的程序员,代码show出来,本文就没有写下去的必要了,不过为了全文的整体性,还是啰嗦几句。其实面向接口编程所采用就是面向对象编程中的继承,只不过它把所有的公共接口全部抽象出来供框架程序进行调用。这样当我们需要增加其他类型的对象处理时,可以通过构造并替换不同的接口函数来进行处理,从而使得整体程序改动最小。凡是一种复用的架构都会牺牲一定的性能,不过也会增加程序的可维护性,降低程序的耦合度,如果你开发的项目并不是很复杂,也确定了以后接口不会有新的变化,其实不使用接口也是OK的。对于自动测试程序框架,接口的预留是非常重要的,可以通过虚拟接口来测试业务逻辑,能够模拟更多实际环境下不同的工况来进行测试。
2、最后
创作不容易呀~你确定不给个赞再走?推荐专辑点击蓝色字体即可跳转
?MCU进阶专辑
?嵌入式C语言进阶专辑
?“bug说”专辑
?专辑
Linux应用程序编程大全
?专辑
学点网络知识
?专辑
手撕C语言
?专辑
手撕C++语言
?专辑
经验分享
?专辑
电能控制技术
bug菌一个有态度的技术号!