面向接口是啥?
不用慌,其實面向接口編程不是什么新鮮玩意,說得直白點就是函數指針的使用,不過我覺得可以形成一種編程的思想來指導嵌入式程序設計,特別是對于降低代碼的耦合還是比較奏效的。
面向接口編程比面向對象要更牛嗎?為什么不直接玩面向對象編程呢?
其實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*******************************************/
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:其中一種報文協議的簡單接口實現
28*author:bug菌
29*******************************************/
30voidprotocol_Initial(void*handle)
31{
32protocolType1*p=(protocolType1*)handle;
33p->CommTypeName="protocolType1";//可以通過公共接口傳參訪問原對象的所有成員
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:根據不同的類型,進行接口的初始化
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:主題框架基本上不需要修改,這里只是簡單示例,你可以更復雜
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:應用程序
94*author:bug菌
95*******************************************/
96intmain(intargc,char*argv[]){
97
98protocolType1protocol;
99
100Initial((structInterface*)&protocol,1);
101
102Process((structInterface*)&protocol);
103
104return0;
105}
運行結果:
分析一下:對于一名合格的程序員,代碼show出來,本文就沒有寫下去的必要了,不過為了全文的整體性,還是啰嗦幾句。其實面向接口編程所采用就是面向對象編程中的繼承,只不過它把所有的公共接口全部抽象出來供框架程序進行調用。這樣當我們需要增加其他類型的對象處理時,可以通過構造并替換不同的接口函數來進行處理,從而使得整體程序改動最小。凡是一種復用的架構都會犧牲一定的性能,不過也會增加程序的可維護性,降低程序的耦合度,如果你開發的項目并不是很復雜, 也確定了以后接口不會有新的變化,其實不使用接口也是OK的。對于自動測試程序框架,接口的預留是非常重要的,可以通過虛擬接口來測試業務邏輯,能夠模擬更多實際環境下不同的工況來進行測試。
審核編輯 :李倩
-
C語言
+關注
關注
180文章
7604瀏覽量
136704 -
編程
+關注
關注
88文章
3614瀏覽量
93686
原文標題:C語言實現面向接口編程
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論