亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

淺談:什么是數據驅動編程的詳解

2020-10-28 18:49:57
字體:
來源:轉載
供稿:網友
前言:
最近在學習《Unix編程藝術》。以前粗略的翻過,以為是介紹unix工具的?,F在認真的看了下,原來是介紹設計原則的。它的核心就是第一章介紹的unix的哲學以及17個設計原則,而后面的內容就是圍繞它來展開的。以前說過,要學習適合自己的資料,而判斷是否適合的一個方法就是看你是否能夠讀得下去。我對這本書有一種相見恨晚的感覺。推薦有4~6年工作經驗的朋友可以讀一下。
正題:
作者在介紹Unix設計原則時,其中有一條為“表示原則:把知識疊入數據以求邏輯質樸而健壯”。結合之前自己的一些經驗,我對這個原則很有共鳴,所以先學習了數據驅動編程相關的內容,這里和大家分享出來和大家一起討論。
數據驅動編程的核心
數據驅動編程的核心出發點是相對于程序邏輯,人類更擅長于處理數據。數據比程序邏輯更容易駕馭,所以我們應該盡可能的將設計的復雜度從程序代碼轉移至數據。
真的是這樣嗎?讓我們來看一個示例。
假設有一個程序,需要處理其他程序發送的消息,消息類型是字符串,每個消息都需要一個函數進行處理。第一印象,我們可能會這樣處理:
復制代碼 代碼如下:

void msg_proc(const char *msg_type, const char *msg_buf)
{
    if (0 == strcmp(msg_type, "inivite"))
    {
        inivite_fun(msg_buf);
    }
    else if (0 == strcmp(msg_type, "tring_100"))
    {
        tring_fun(msg_buf);
    }
    else if (0 == strcmp(msg_type, "ring_180"))
    {
        ring_180_fun(msg_buf);
    }
    else if (0 == strcmp(msg_type, "ring_181"))
    {
        ring_181_fun(msg_buf);
    }
    else if (0 == strcmp(msg_type, "ring_182"))
    {
        ring_182_fun(msg_buf);
    }
    else if (0 == strcmp(msg_type, "ring_183"))
    {
        ring_183_fun(msg_buf);
    }
    else if (0 == strcmp(msg_type, "ok_200"))
    {
        ok_200_fun(msg_buf);
    }
    。。。。。。
    else if (0 == strcmp(msg_type, "fail_486"))
    {
        fail_486_fun(msg_buf);
    }
    else
    {
        log("未識別的消息類型%s/n", msg_type);
    }
}

上面的消息類型取自sip協議(不完全相同,sip協議借鑒了http協議),消息類型可能還會增加。看著常常的流程可能有點累,檢測一下中間某個消息有沒有處理也比較費勁,而且,沒增加一個消息,就要增加一個流程分支。
按照數據驅動編程的思路,可能會這樣設計:
復制代碼 代碼如下:

typedef void (*SIP_MSG_FUN)(const char *);
typedef struct __msg_fun_st
{
    const char *msg_type;//消息類型
    SIP_MSG_FUN fun_ptr;//函數指針
}msg_fun_st;
msg_fun_st msg_flow[] =
{
        {"inivite", inivite_fun},
        {"tring_100", tring_fun},
        {"ring_180", ring_180_fun},
        {"ring_181", ring_181_fun},
        {"ring_182", ring_182_fun},
        {"ring_183", ring_183_fun},
        {"ok_200", ok_200_fun},
        。。。。。。
        {"fail_486", fail_486_fun}
};
void msg_proc(const char *msg_type, const char *msg_buf)
{
    int type_num = sizeof(msg_flow) / sizeof(msg_fun_st);
    int i = 0;
    for (i = 0; i < type_num; i++)
    {
        if (0 == strcmp(msg_flow[i].msg_type, msg_type))
        {
            msg_flow[i].fun_ptr(msg_buf);
            return ;
        }
    }
    log("未識別的消息類型%s/n", msg_type);
}

下面這種思路的優勢:
1、可讀性更強,消息處理流程一目了然。
2、更容易修改,要增加新的消息,只要修改數據即可,不需要修改流程。
3、重用,第一種方案的很多的else if其實只是消息類型和處理函數不同,但是邏輯是一樣的。下面的這種方案就是將這種相同的邏輯提取出來,而把容易發生變化的部分提到外面。
隱含在背后的思想:
很多設計思路背后的原理其實都是相通的,隱含在數據驅動編程背后的實現思想包括:
1、控制復雜度。通過把程序邏輯的復雜度轉移到人類更容易處理的數據中來,從而達到控制復雜度的目標。
2、隔離變化。像上面的例子,每個消息處理的邏輯是不變的,但是消息可能是變化的,那就把容易變化的消息和不容易變化的邏輯分離。
3、機制和策略的分離。和第二點很像,本書中很多地方提到了機制和策略。上例中,我的理解,機制就是消息的處理邏輯,策略就是不同的消息處理(后面想專門寫一篇文章介紹下機制和策略)。
數據驅動編程可以用來做什么:
如上例所示,它可以應用在函數級的設計中。
同時,它也可以應用在程序級的設計中,典型的比如用表驅動法實現一個狀態機(后面寫篇文章專門介紹)。
也可以用在系統級的設計中,比如DSL(這方面我經驗有些欠缺,目前不是非常確定)。
它不是什么:
1、它不是一個全新的編程模型:它只是一種設計思路,而且歷史悠久,在unix/linux社區應用很多;
2、它不同于面向對象設計中的數據:“數據驅動編程中,數據不但表示了某個對象的狀態,實際上還定義了程序的流程;OO看重的是封裝,而數據驅動編程看重的是編寫盡可能少的代碼?!?BR>書中的值得思考的話:
數據壓倒一切。如果選擇了正確的數據結構并把一切組織的井井有條,正確的算法就不言自明。編程的核心是數據結構,而不是算法。――Rob Pike
程序員束手無策。。。。。只有跳脫代碼,直起腰,仔細思考數據才是最好的行動。表達式編程的精髓。――Fred Brooks
數據比程序邏輯更易駕馭。盡可能把設計的復雜度從代碼轉移至數據是個好實踐。――《unix編程藝術》作者。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品综合久久久久久97| 丝袜情趣国产精品| 久久精品久久久久久国产 免费| 国产精品视频网址| 日韩精品一二三四区| 日韩成人av一区| 国产精品成久久久久三级| 亚洲精品aⅴ中文字幕乱码| 欧美国产日韩一区| 亚洲国产精品久久久久| 久久久精品免费视频| 在线精品91av| 亚洲精品久久久久国产| 91精品视频在线看| 5566日本婷婷色中文字幕97| 日韩欧美一区二区三区久久| 日韩视频在线一区| 亚洲欧美国产va在线影院| 91免费的视频在线播放| 最近2019中文字幕一页二页| 欧美xxxx18国产| 欧美第一黄网免费网站| 国产精品丝袜久久久久久高清| 久久久噜噜噜久噜久久| 国产精品成人在线| 欧美一区二区三区免费观看| 亚洲福利视频久久| 日韩av在线网| 国产精品无av码在线观看| 亚洲免费福利视频| 国产成人在线一区二区| 91九色视频在线| 亚洲精品av在线播放| 97精品在线观看| 爽爽爽爽爽爽爽成人免费观看| 日韩欧美视频一区二区三区| 久久精品国产欧美激情| www.亚洲天堂| 最近2019中文字幕大全第二页| 亚洲精品综合精品自拍| 国产欧美 在线欧美| 成人写真福利网| 精品日本高清在线播放| 日本a级片电影一区二区| 免费不卡在线观看av| 亚洲美女在线看| 国产91网红主播在线观看| 精品亚洲aⅴ在线观看| 欧美国产日本高清在线| 午夜精品久久久久久久99热| 国产精品永久免费| 亚洲女人被黑人巨大进入al| 亚洲国产精品va在线看黑人| 亚洲欧美日韩国产中文| 中国日韩欧美久久久久久久久| 国产精品久久77777| 最近更新的2019中文字幕| 欧美日韩在线免费观看| 蜜臀久久99精品久久久久久宅男| 68精品久久久久久欧美| 日本久久亚洲电影| 亚洲少妇激情视频| 成人两性免费视频| 欧美在线精品免播放器视频| 亚洲精品福利免费在线观看| 91在线直播亚洲| 性日韩欧美在线视频| 久久这里只有精品视频首页| 欧美丰满少妇xxxx| 91精品国产综合久久香蕉| 久久天天躁狠狠躁夜夜躁2014| 久久香蕉国产线看观看av| 国产不卡av在线免费观看| 777精品视频| 亚洲一区av在线播放| 欧美一性一乱一交一视频| 久久影视电视剧免费网站清宫辞电视| 狠狠躁夜夜躁久久躁别揉| 欧美黑人性生活视频| 欧美成人午夜激情| 午夜精品免费视频| 91精品国产高清久久久久久91| 91欧美精品午夜性色福利在线| 麻豆成人在线看| 日韩精品视频免费| 91久久在线视频| 国产综合久久久久| 亚洲成avwww人| 欧美另类xxx| 亚洲一区二区久久久久久| 精品一区二区三区四区在线| 亚洲xxxx做受欧美| 久久久亚洲成人| 欧美与黑人午夜性猛交久久久| 97视频在线观看网址| 国产一区二区三区四区福利| 成人伊人精品色xxxx视频| 成人福利视频在线观看| 国产91色在线播放| 亚洲wwwav| 欧美国产日韩xxxxx| 久久久亚洲精选| 国产亚洲精品一区二555| 91精品免费久久久久久久久| 国产精品爽黄69天堂a| 8050国产精品久久久久久| 日韩欧美精品网站| 亚洲国产高清福利视频| 久久天天躁狠狠躁夜夜躁2014| 日韩福利在线播放| 91久久夜色精品国产网站| 亚洲香蕉av在线一区二区三区| 国产精品露脸av在线| 欧美黄色片视频| 亚洲第一中文字幕在线观看| 国产mv免费观看入口亚洲| 97视频在线免费观看| 91久久精品国产91性色| 97国产一区二区精品久久呦| 午夜精品久久久久久99热软件| 久久综合久久美利坚合众国| 欧美精品免费播放| 午夜精品久久久久久久99热| 久久免费成人精品视频| 日韩av手机在线| 国产69精品久久久久99| 欧美亚洲成人xxx| 国产999精品| 日韩电影视频免费| 国产偷亚洲偷欧美偷精品| 欧美大胆在线视频| 欧美亚洲激情在线| www.国产精品一二区| 久久久久久18| 成人h片在线播放免费网站| 亚洲人成电影在线观看天堂色| 午夜精品一区二区三区在线视频| 久久久久女教师免费一区| 国产精品男女猛烈高潮激情| 国产成人亚洲综合青青| 日韩欧美a级成人黄色| 国内精品视频一区| 欧美成人免费大片| 亚洲第一网中文字幕| 激情亚洲一区二区三区四区| 欧美视频中文在线看| 欧美贵妇videos办公室| 亚洲美女中文字幕| www.亚洲成人| 91精品国产自产在线观看永久| 亚洲一区久久久| 国产精品久久久久久久午夜| 久久精视频免费在线久久完整在线看| 日韩亚洲成人av在线| 欧美成人午夜免费视在线看片| 欧美性xxxxxxxxx| 久久综合国产精品台湾中文娱乐网| 91av在线视频观看| 91成人免费观看网站| 日韩禁在线播放| 欧美另类99xxxxx| 日韩av在线免费| 国产91网红主播在线观看| 日韩中文字幕视频在线观看|