日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 嵌入式 > 嵌入式微處理器
[導讀]1、聊一聊 今天為大家介紹數(shù)據驅動編程技巧,能夠幫助大家在平時寫出高質量的代碼。 2、什么是數(shù)據驅動編程 ? ? 作者一直覺得"沒有設計思想的代碼是沒有靈魂的",所以在這么多年的程序設計中一般首先設計程序架構然后再進行編碼,之前作者為大家介紹了一下<【


1、聊一聊


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


2、什么是數(shù)據驅動編程

    作者一直覺得"沒有設計思想的代碼是沒有靈魂的",所以在這么多年的程序設計中一般首先設計程序架構然后再進行編碼,之前作者為大家介紹了一下<【殺手锏】用“萬能C編程”來引出"面向對象">,應該有很多之前沒有接觸過這方面內容的小伙伴從中受益,同時也希望作者能夠帶來更多類似的文章,所以就有了該新作。


1

通過MP3來看看數(shù)據驅動編程

    


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

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

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

2

數(shù)據驅動實現(xiàn)框架圖

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


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

  • 然而對于數(shù)據驅動開發(fā),并不是立馬進行數(shù)據解析,而是首先進行數(shù)據庫設計,這里作者所謂的數(shù)據庫并不是mysql什么的,而是一種數(shù)據結構,表明數(shù)據與數(shù)據的關系等,類似于前面提到的MP3格式文件。

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


3、實現(xiàn)合集

    對于數(shù)據驅動編程最大的難點在抽象出數(shù)據庫和數(shù)據解析(有點類似于一個文本解析器),這兩部分的設計的靈活度就決定了程序的擴展性和緊湊性。

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

   下面作者還是以比較基礎的實例跟大家分析分析:


1

狀態(tài)機的實現(xiàn)
參考demo:
 1#include <stdio.h>
2#include <stdlib.h>
3
4//構造數(shù)據  
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ù)據驅動編程實例  
15 * Author :(公眾號:最后一個bug) 
16 ***************************************/

17 //構造數(shù)據庫
18typedef int (*PStatueMachineProcess)(int param);
19PStatueMachineProcess MachineProcess[MAX_STATUE] =
20{
21    Statue1Process,
22    Statue2Process,
23    Statue3Process  
24};
25
26//構造數(shù)據 
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ù)據庫解析和邏輯引導 
52    while(1)
53    {
54        statue = (MachineProcess[statue])(0);
55        count++;
56        if(count > 10)break;
57    }
58
59    printf("公眾號:最后一個bug\n");
60
61    return 0;
62}
分析一下:
  •  這樣實現(xiàn)狀態(tài)機應該比if-else方便多了,上面的代碼對于有一定編程經驗的小伙伴而言,似乎僅僅只是用了一個函數(shù)指針數(shù)據就搞定了,如果我們再認真解讀一下,其實在該過程中僅僅就是狀態(tài)數(shù)據發(fā)生了變化,其他均是綁定一套連貫處理,這里的狀態(tài)數(shù)據作為了數(shù)組的標識,所以在此也說明數(shù)據驅動的特點:僅僅只對數(shù)據敏感。

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


2

消息處理機制
參考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;    //對象類型  
20    ENUM_SIG_TYPE    SignalType;    //消息類型
21    MessageProcess   MessageProc;   //消息處理 
22}sMessagePack ;
23
24int obj1_Sig1_proc(int param)
25{
26
27
28.....
29 /***************************************
30 * Fuciton: 構造數(shù)據庫 
31 * Author :(公眾號:最后一個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 :(公眾號:最后一個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
分析一下:
  • 上面代碼僅僅只是給大家簡單的體驗一下數(shù)據驅動編程方法,對于效率等等作者沒有過多的考慮,其性能與所設計的數(shù)據結構有關系。所以這樣的處理也避免了很多小伙伴進行硬編碼的習慣。


4、最后小結

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

    

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

嵌入式ARM

掃描二維碼,關注更多精彩內容

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

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉