當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式微處理器
[導(dǎo)讀]1、聊一聊 今天為大家介紹數(shù)據(jù)驅(qū)動(dòng)編程技巧,能夠幫助大家在平時(shí)寫出高質(zhì)量的代碼。 2、什么是數(shù)據(jù)驅(qū)動(dòng)編程 ? ? 作者一直覺(jué)得"沒(méi)有設(shè)計(jì)思想的代碼是沒(méi)有靈魂的",所以在這么多年的程序設(shè)計(jì)中一般首先設(shè)計(jì)程序架構(gòu)然后再進(jìn)行編碼,之前作者為大家介紹了一下<【


1、聊一聊


今天為大家介紹數(shù)據(jù)驅(qū)動(dòng)編程技巧,能夠幫助大家在平時(shí)寫出高質(zhì)量的代碼。


2、什么是數(shù)據(jù)驅(qū)動(dòng)編程

    作者一直覺(jué)得"沒(méi)有設(shè)計(jì)思想的代碼是沒(méi)有靈魂的",所以在這么多年的程序設(shè)計(jì)中一般首先設(shè)計(jì)程序架構(gòu)然后再進(jìn)行編碼,之前作者為大家介紹了一下<【殺手锏】用“萬(wàn)能C編程”來(lái)引出"面向?qū)ο?>,應(yīng)該有很多之前沒(méi)有接觸過(guò)這方面內(nèi)容的小伙伴從中受益,同時(shí)也希望作者能夠帶來(lái)更多類似的文章,所以就有了該新作。


1

通過(guò)MP3來(lái)看看數(shù)據(jù)驅(qū)動(dòng)編程

    


    這里拿MP3播放器作為一個(gè)例子為大家引出數(shù)據(jù)驅(qū)動(dòng)思想,使用MP3播放器進(jìn)行音樂(lè)播放需要有MP3格式的文件,并且不同的歌曲都會(huì)遵循該格式的文件依次存放。

    那么對(duì)應(yīng)的MP3播放器會(huì)按照MP3音樂(lè)文件進(jìn)行對(duì)應(yīng)的解析,這樣對(duì)于不同的音樂(lè)文件都是統(tǒng)一的解析方式,并不需要換另外一種解析方式,以后我們想播放其他的音樂(lè)僅僅只需要添加對(duì)應(yīng)的音樂(lè)文件即可,而并不需要再更新對(duì)應(yīng)的音樂(lè)播放器。

    同時(shí)當(dāng)我們需要切歌、定義播放模式等等,僅僅只需要對(duì)播放文件索引進(jìn)行邏輯處理即可,該實(shí)例就為我們展示了數(shù)據(jù)驅(qū)動(dòng)思想的特點(diǎn): 認(rèn)為數(shù)據(jù)易變,而邏輯相對(duì)比較固定,這樣便把數(shù)據(jù)和邏輯分離,降低代碼邏輯的重復(fù),增強(qiáng)代碼的聚合度。

2

數(shù)據(jù)驅(qū)動(dòng)實(shí)現(xiàn)框架圖

    在之前的文章中作者在介紹結(jié)構(gòu)體的時(shí)候說(shuō)到了一個(gè)妙處不知道大家還是否記得?<【典藏】大佬們都在用的結(jié)構(gòu)體進(jìn)階小技巧>,在該文中說(shuō)到結(jié)構(gòu)體可以囊括所有數(shù)據(jù),并且幾乎所有的事物進(jìn)行抽象以后都可以歸為數(shù)據(jù),所以采用數(shù)據(jù)驅(qū)動(dòng)開(kāi)發(fā)也將是行之有效的思路。


分析一下:
  • 左邊是所有的數(shù)據(jù),包括用戶的輸入,所采集的數(shù)據(jù)、還有各種處理數(shù)據(jù)的方法都是數(shù)據(jù),獲得所有的數(shù)據(jù)以后,正常思路是直接編碼進(jìn)行數(shù)據(jù)解析,最終實(shí)現(xiàn)項(xiàng)目需求。

  • 然而對(duì)于數(shù)據(jù)驅(qū)動(dòng)開(kāi)發(fā),并不是立馬進(jìn)行數(shù)據(jù)解析,而是首先進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì),這里作者所謂的數(shù)據(jù)庫(kù)并不是mysql什么的,而是一種數(shù)據(jù)結(jié)構(gòu),表明數(shù)據(jù)與數(shù)據(jù)的關(guān)系等,類似于前面提到的MP3格式文件。

  • 設(shè)計(jì)好數(shù)據(jù)庫(kù)以后,需要構(gòu)造數(shù)據(jù)庫(kù)解析的方式,該解析方式的目標(biāo)是實(shí)現(xiàn)項(xiàng)目功能目標(biāo)的全部或者是一部分,也就類似于前面提到的MP3播放器。


3、實(shí)現(xiàn)合集

    對(duì)于數(shù)據(jù)驅(qū)動(dòng)編程最大的難點(diǎn)在抽象出數(shù)據(jù)庫(kù)和數(shù)據(jù)解析(有點(diǎn)類似于一個(gè)文本解析器),這兩部分的設(shè)計(jì)的靈活度就決定了程序的擴(kuò)展性和緊湊性。

    目前比較簡(jiǎn)單的就是用數(shù)組等作為數(shù)據(jù)庫(kù),數(shù)據(jù)解析基本上是查表,所以也有很多小伙伴直接稱為表驅(qū)動(dòng)編程,然而對(duì)于數(shù)據(jù)驅(qū)動(dòng)編程遠(yuǎn)遠(yuǎn)可以設(shè)計(jì)得比表驅(qū)動(dòng)復(fù)雜,所以這也是在開(kāi)發(fā)中選擇數(shù)據(jù)驅(qū)動(dòng)方法編碼的一個(gè)決定因素。

   下面作者還是以比較基礎(chǔ)的實(shí)例跟大家分析分析:


1

狀態(tài)機(jī)的實(shí)現(xiàn)
參考demo:
 1#include <stdio.h>
2#include <stdlib.h>
3
4//構(gòu)造數(shù)據(jù)  
5#define STATUE1    (0
6#define STATUE2    (1
7#define STATUE3    (2
8#define MAX_STATUE (3
9
10int Statue1Process(int param);
11int Statue2Process(int param);
12int Statue3Process(int param);
13/***************************************
14 * Fuciton:數(shù)據(jù)驅(qū)動(dòng)編程實(shí)例  
15 * Author :(公眾號(hào):最后一個(gè)bug) 
16 ***************************************/

17 //構(gòu)造數(shù)據(jù)庫(kù)
18typedef int (*PStatueMachineProcess)(int param);
19PStatueMachineProcess MachineProcess[MAX_STATUE] =
20{
21    Statue1Process,
22    Statue2Process,
23    Statue3Process  
24};
25
26//構(gòu)造數(shù)據(jù) 
27int Statue1Process(int param)
28{
29    printf("Statue1Process\n");
30    return STATUE2;
31}
32
33int Statue2Process(int param)
34{
35    printf("Statue2Process\n");
36    return STATUE3;
37}
38
39int Statue3Process(int param)
40{
41    printf("Statue3Process\n");
42    return STATUE1;
43}
44
45
46int main(int argc, char *argv[]) {
47
48    int statue = STATUE1;
49    int count = 0;
50
51    //數(shù)據(jù)庫(kù)解析和邏輯引導(dǎo) 
52    while(1)
53    {
54        statue = (MachineProcess[statue])(0);
55        count++;
56        if(count > 10)break;
57    }
58
59    printf("公眾號(hào):最后一個(gè)bug\n");
60
61    return 0;
62}
分析一下:
  •  這樣實(shí)現(xiàn)狀態(tài)機(jī)應(yīng)該比if-else方便多了,上面的代碼對(duì)于有一定編程經(jīng)驗(yàn)的小伙伴而言,似乎僅僅只是用了一個(gè)函數(shù)指針數(shù)據(jù)就搞定了,如果我們?cè)僬J(rèn)真解讀一下,其實(shí)在該過(guò)程中僅僅就是狀態(tài)數(shù)據(jù)發(fā)生了變化,其他均是綁定一套連貫處理,這里的狀態(tài)數(shù)據(jù)作為了數(shù)組的標(biāo)識(shí),所以在此也說(shuō)明數(shù)據(jù)驅(qū)動(dòng)的特點(diǎn):僅僅只對(duì)數(shù)據(jù)敏感。

  •  從上面的處理可以發(fā)現(xiàn)該方式可以減少switch和if-else的使用。


2

消息處理機(jī)制
參考demo:
 1typedef enum
2{
3    OBJ_TYPE_1,
4    OBJ_TYPE_2,
5    OBJ_TYPE_3,
6}ENUM_OBJ_TYPE;
7
8typedef enum
9{
10    SIG_TYPE_1,
11    SIG_TYPE_2,
12    SIG_TYPE_3,
13}ENUM_SIG_TYPE;
14
15typedef int (*MessageProcess)(int param);
16
17typedef struct  _tag_MessagePack 
18{
19    ENUM_OBJ_TYPE       ObjType;    //對(duì)象類型  
20    ENUM_SIG_TYPE    SignalType;    //消息類型
21    MessageProcess   MessageProc;   //消息處理 
22}sMessagePack ;
23
24int obj1_Sig1_proc(int param)
25{
26
27
28.....
29 /***************************************
30 * Fuciton: 構(gòu)造數(shù)據(jù)庫(kù) 
31 * Author :(公眾號(hào):最后一個(gè)bug) 
32 ***************************************/

33sMessagePack stMessagePack[]= 
34{
35    {OBJ_TYPE_1, SIG_TYPE_1, obj1_Sig1_proc}
36    {OBJ_TYPE_1, SIG_TYPE_2, obj1_Sig2_proc}
37    {OBJ_TYPE_2, SIG_TYPE_1, obj2_Sig1_proc}
38    {OBJ_TYPE_2, SIG_TYPE_2, obj2_Sig2_proc}
39    {OBJ_TYPE_3, SIG_TYPE_1, obj3_Sig1_proc}
40    {OBJ_TYPE_3, SIG_TYPE_2, obj3_Sig2_proc}
41};
42
43/***************************************
44 * Fuciton:消息循環(huán)處理 
45 * Author :(公眾號(hào):最后一個(gè)bug) 
46 ***************************************/

47MessageProcess MessageLoop(ENUM_OBJ_TYPE objType, ENUM_SIG_TYPE signalType)
48{
49    int i = 0;
50    for (i = 0; i < (sizeof(stMessagePack)/sizeof(sMessagePack)); i ++)
51    {
52        if ((stMessagePack[i].ObjType == objType) && (stMessagePack[i].SignalType == signalType))
53        {
54            return stMessagePack[i].MessageProc;
55        }
56    }
57    return NULL;
58
分析一下:
  • 上面代碼僅僅只是給大家簡(jiǎn)單的體驗(yàn)一下數(shù)據(jù)驅(qū)動(dòng)編程方法,對(duì)于效率等等作者沒(méi)有過(guò)多的考慮,其性能與所設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)有關(guān)系。所以這樣的處理也避免了很多小伙伴進(jìn)行硬編碼的習(xí)慣。


4、最后小結(jié)

    最后對(duì)于數(shù)據(jù)驅(qū)動(dòng)編程并不是萬(wàn)能的,可能對(duì)于有些設(shè)計(jì)反而起到副作用,一般用于實(shí)現(xiàn)邏輯相對(duì)比較清晰的處理,不過(guò)對(duì)于簡(jiǎn)化條件語(yǔ)句還是非常好用的,所以對(duì)于這些編程思路,需要根據(jù)具體情況進(jìn)行選擇,同時(shí)也要對(duì)目標(biāo)項(xiàng)目有較強(qiáng)的理解能力。

    

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉