面向接口是啥?
不用慌,其實(shí)面向接口編程不是什么新鮮玩意,說(shuō)得直白點(diǎn)就是函數(shù)指針的使用,不過(guò)我覺得可以形成一種編程的思想來(lái)指導(dǎo)嵌入式程序設(shè)計(jì),特別是對(duì)于降低代碼的耦合還是比較奏效的。
面向接口編程比面向?qū)ο笠??為什么不直接玩面向?qū)ο缶幊棠兀?/span>
其實(shí)bug菌這么多年開發(fā)過(guò)來(lái),真正把C完完全全用面向?qū)ο蟮姆绞竭M(jìn)行編寫是非常少的,像C++中的繼承、多態(tài)、虛函數(shù)等等面向?qū)ο筇匦?/span>,如果均用C語(yǔ)言來(lái)維護(hù)和實(shí)現(xiàn)是非常復(fù)雜的,并且你還不能保證沒有bug。
再說(shuō)了你寫了一堆代碼讓C的特性更加的像C++,那為什么不直接使用C++呢?難道你覺得那些特性你能用C寫得比C++更好?別重復(fù)造輪子了。
不過(guò),話說(shuō)回來(lái),能夠在C語(yǔ)言中借鑒一些面向?qū)ο蟮恼Z(yǔ)言特性和思想,確實(shí)能夠讓C代碼更加的優(yōu)雅和靈活,所以今天聊聊面向接口編程,它僅僅只是面向?qū)ο蟮囊徊糠?,不過(guò)在一般的嵌入式開發(fā)中使用性價(jià)比還是比較高的。
面向接口編程
話不多說(shuō),先上一個(gè)面向接口編程的Demo:
參考demo:
1#include
2#include
3
4/********************************************
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};
14
15/********************************************
16*Note:具體類型的定義
17*author:bug菌
18*******************************************/
19typedefstruct_tag_protocolType1{
20structInterfacebi;//公共通信接口
21char*CommTypeName;//通信名稱
22//不同通信類型的其他成員......
23}protocolType1;
24
25
26/********************************************
27*Note:其中一種報(bào)文協(xié)議的簡(jiǎn)單接口實(shí)現(xiàn)
28*author:bug菌
29*******************************************/
30voidprotocol_Initial(void*handle)
31{
32protocolType1*p=(protocolType1*)handle;
33p->CommTypeName="protocolType1";//可以通過(guò)公共接口傳參訪問(wèn)原對(duì)象的所有成員
34
35printf("%sInitial
",p->CommTypeName);
36}
37
38voidprotocol_Send(void*handle,char*buff,intcount)
39{
40protocolType1*p=(protocolType1*)handle;
41
42printf("%sSend
",p->CommTypeName);
43}
44
45voidprotocol_Recv(void*handle,char*buff)
46{
47protocolType1*p=(protocolType1*)handle;
48
49printf("%sRecv
",p->CommTypeName);
50}
51
52voidprotocol_Destory(void*handle)
53{
54protocolType1*p=(protocolType1*)handle;
55
56printf("%sDestory
",p->CommTypeName);
57}
58
59/********************************************
60*Note:根據(jù)不同的類型,進(jìn)行接口的初始化
61*author:bug菌
62*******************************************/
63voidInitial(structInterface*pInterface,inttype)
64{
65pInterface->Initial=protocol_Initial;
66
67pInterface->Send=protocol_Send;
68
69pInterface->Recv=protocol_Recv;
70
71pInterface->Destory=protocol_Destory;
72
73}
74
75/********************************************
76*Note:主題框架基本上不需要修改,這里只是簡(jiǎn)單示例,你可以更復(fù)雜
77*author:bug菌
78*******************************************/
79voidProcess(structInterface*pInterface)
80{
81pInterface->Initial(pInterface);
82
83pInterface->Send(pInterface,NULL,0);
84
85pInterface->Recv(pInterface,NULL);
86
87pInterface->Destory(pInterface);
88
89}
90
91
92/********************************************
93*Note:應(yīng)用程序
94*author:bug菌
95*******************************************/
96intmain(intargc,char*argv[]){
97
98protocolType1protocol;
99
100Initial((structInterface*)&protocol,1);
101
102Process((structInterface*)&protocol);
103
104return0;
105}
運(yùn)行結(jié)果:
分析一下:對(duì)于一名合格的程序員,代碼show出來(lái),本文就沒有寫下去的必要了,不過(guò)為了全文的整體性,還是啰嗦幾句。其實(shí)面向接口編程所采用就是面向?qū)ο缶幊讨械睦^承,只不過(guò)它把所有的公共接口全部抽象出來(lái)供框架程序進(jìn)行調(diào)用。這樣當(dāng)我們需要增加其他類型的對(duì)象處理時(shí),可以通過(guò)構(gòu)造并替換不同的接口函數(shù)來(lái)進(jìn)行處理,從而使得整體程序改動(dòng)最小。凡是一種復(fù)用的架構(gòu)都會(huì)犧牲一定的性能,不過(guò)也會(huì)增加程序的可維護(hù)性,降低程序的耦合度,如果你開發(fā)的項(xiàng)目并不是很復(fù)雜, 也確定了以后接口不會(huì)有新的變化,其實(shí)不使用接口也是OK的。對(duì)于自動(dòng)測(cè)試程序框架,接口的預(yù)留是非常重要的,可以通過(guò)虛擬接口來(lái)測(cè)試業(yè)務(wù)邏輯,能夠模擬更多實(shí)際環(huán)境下不同的工況來(lái)進(jìn)行測(cè)試。
審核編輯 :李倩
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7575瀏覽量
134138 -
編程
+關(guān)注
關(guān)注
88文章
3521瀏覽量
93275
原文標(biāo)題:C語(yǔ)言實(shí)現(xiàn)面向接口編程
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論