日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解什么是數(shù)據(jù)驅(qū)動(dòng)編程

前言:

最近在學(xué)習(xí)《Unix編程藝術(shù)》。以前粗略的翻過,以為是介紹unix工具的?,F(xiàn)在認(rèn)真的看了下,原來是介紹設(shè)計(jì)原則的。它的核心就是***章介紹的unix的哲學(xué)以及17個(gè)設(shè)計(jì)原則,而后面的內(nèi)容就是圍繞它來展開的。以前說過,要學(xué)習(xí)適合自己的資料,而判斷是否適合的一個(gè)方法就是看你是否能夠讀得下去。我對(duì)這本書有一種相見恨晚的感覺。推薦有4~6年工作經(jīng)驗(yàn)的朋友可以讀一下。

正題:

作者在介紹Unix設(shè)計(jì)原則時(shí),其中有一條為“表示原則:把知識(shí)疊入數(shù)據(jù)以求邏輯質(zhì)樸而健壯”。結(jié)合之前自己的一些經(jīng)驗(yàn),我對(duì)這個(gè)原則很有共鳴,所以先學(xué)習(xí)了數(shù)據(jù)驅(qū)動(dòng)編程相關(guān)的內(nèi)容,這里和大家分享出來和大家一起討論。

數(shù)據(jù)驅(qū)動(dòng)編程的核心

數(shù)據(jù)驅(qū)動(dòng)編程的核心出發(fā)點(diǎn)是相對(duì)于程序邏輯,人類更擅長于處理數(shù)據(jù)。數(shù)據(jù)比程序邏輯更容易駕馭,所以我們應(yīng)該盡可能的將設(shè)計(jì)的復(fù)雜度從程序代碼轉(zhuǎn)移至數(shù)據(jù)。

真的是這樣嗎?讓我們來看一個(gè)示例。

假設(shè)有一個(gè)程序,需要處理其他程序發(fā)送的消息,消息類型是字符串,每個(gè)消息都需要一個(gè)函數(shù)進(jìn)行處理。***印象,我們可能會(huì)這樣處理:

 
 
 
  1.   void msg_proc(const char *msg_type, const char *msg_buf)  
  2.   {  
  3.   if (0 == strcmp(msg_type, "inivite"))  
  4.   {  
  5.   inivite_fun(msg_buf);  
  6.   }  
  7.   else if (0 == strcmp(msg_type, "tring_100"))  
  8.   {  
  9.   tring_fun(msg_buf);  
  10.   }  
  11.   else if (0 == strcmp(msg_type, "ring_180"))  
  12.   {  
  13.   ring_180_fun(msg_buf);  
  14.   }  
  15.   else if (0 == strcmp(msg_type, "ring_181"))  
  16.   {  
  17.   ring_181_fun(msg_buf);  
  18.   }  
  19.   else if (0 == strcmp(msg_type, "ring_182"))  
  20.   {  
  21.   ring_182_fun(msg_buf);  
  22.   }  
  23.   else if (0 == strcmp(msg_type, "ring_183"))  
  24.   {  
  25.   ring_183_fun(msg_buf);  
  26.   }  
  27.   else if (0 == strcmp(msg_type, "ok_200"))  
  28.   {  
  29.   ok_200_fun(msg_buf);  
  30.   }  
  31. 。。。。。。  
  32.   else if (0 == strcmp(msg_type, "fail_486"))  
  33.   {  
  34.   fail_486_fun(msg_buf);  
  35.   }  
  36.   else 
  37.   {  
  38.  log("未識(shí)別的消息類型%s ", msg_type);  
  39.   }  
  40.   } 

上面的消息類型取自sip協(xié)議(不完全相同,sip協(xié)議借鑒了http協(xié)議),消息類型可能還會(huì)增加??粗35牧鞒炭赡苡悬c(diǎn)累,檢測一下中間某個(gè)消息有沒有處理也比較費(fèi)勁,而且,沒增加一個(gè)消息,就要增加一個(gè)流程分支。

按照數(shù)據(jù)驅(qū)動(dòng)編程的思路,可能會(huì)這樣設(shè)計(jì):

 
 
 
  1.   typedef void (*SIP_MSG_FUN)(const char *);  
  2.   typedef struct __msg_fun_st  
  3.   {  
  4.   const char *msg_type;//消息類型  
  5.   SIP_MSG_FUN fun_ptr;//函數(shù)指針  
  6.   }msg_fun_st;  
  7.   msg_fun_st msg_flow[] =  
  8.   {  
  9.   {"inivite", inivite_fun},  
  10.   {"tring_100", tring_fun},  
  11.   {"ring_180", ring_180_fun},  
  12.  {"ring_181", ring_181_fun},  
  13.   {"ring_182", ring_182_fun},  
  14.   {"ring_183", ring_183_fun},  
  15.   {"ok_200", ok_200_fun},  
  16.  。。。。。。  
  17.   {"fail_486", fail_486_fun}  
  18.   };  
  19.   void msg_proc(const char *msg_type, const char *msg_buf)  
  20.   {  
  21.   int type_num = sizeof(msg_flow) / sizeof(msg_fun_st);  
  22.   int i = 0;  
  23.   for (i = 0; i 
  24.   {  
  25.   if (0 == strcmp(msg_flow[i].msg_type, msg_type))  
  26.   {  
  27.   msg_flow[i].fun_ptr(msg_buf);  
  28.   return ;  
  29.   }  
  30.   }  
  31.   log("未識(shí)別的消息類型%s ", msg_type);  
  32.   } 

下面這種思路的優(yōu)勢:

1、可讀性更強(qiáng),消息處理流程一目了然。

2、更容易修改,要增加新的消息,只要修改數(shù)據(jù)即可,不需要修改流程。

3、重用,***種方案的很多的else if其實(shí)只是消息類型和處理函數(shù)不同,但是邏輯是一樣的。下面的這種方案就是將這種相同的邏輯提取出來,而把容易發(fā)生變化的部分提到外面。

隱含在背后的思想

很多設(shè)計(jì)思路背后的原理其實(shí)都是相通的,隱含在數(shù)據(jù)驅(qū)動(dòng)編程背后的實(shí)現(xiàn)思想包括:

1、控制復(fù)雜度。通過把程序邏輯的復(fù)雜度轉(zhuǎn)移到人類更容易處理的數(shù)據(jù)中來,從而達(dá)到控制復(fù)雜度的目標(biāo)。

2、隔離變化。像上面的例子,每個(gè)消息處理的邏輯是不變的,但是消息可能是變化的,那就把容易變化的消息和不容易變化的邏輯分離。

3、機(jī)制和策略的分離。和第二點(diǎn)很像,本書中很多地方提到了機(jī)制和策略。上例中,我的理解,機(jī)制就是消息的處理邏輯,策略就是不同的消息處理(后面想專門寫一篇文章介紹下機(jī)制和策略)。

數(shù)據(jù)驅(qū)動(dòng)編程可以用來做什么:

如上例所示,它可以應(yīng)用在函數(shù)級(jí)的設(shè)計(jì)中。

同時(shí),它也可以應(yīng)用在程序級(jí)的設(shè)計(jì)中,典型的比如用表驅(qū)動(dòng)法實(shí)現(xiàn)一個(gè)狀態(tài)機(jī)(后面寫篇文章專門介紹)。

也可以用在系統(tǒng)級(jí)的設(shè)計(jì)中,比如DSL(這方面我經(jīng)驗(yàn)有些欠缺,目前不是非常確定)。

它不是什么:

1、 它不是一個(gè)全新的編程模型:它只是一種設(shè)計(jì)思路,而且歷史悠久,在unix/linux社區(qū)應(yīng)用很多;

2、它不同于面向?qū)ο笤O(shè)計(jì)中的數(shù)據(jù):“數(shù)據(jù)驅(qū)動(dòng)編程中,數(shù)據(jù)不但表示了某個(gè)對(duì)象的狀態(tài),實(shí)際上還定義了程序的流程;OO看重的是封裝,而數(shù)據(jù)驅(qū)動(dòng)編程看重的是編寫盡可能少的代碼。”

書中的值得思考的話:

數(shù)據(jù)壓倒一切。如果選擇了正確的數(shù)據(jù)結(jié)構(gòu)并把一切組織的井井有條,正確的算法就不言自明。編程的核心是數(shù)據(jù)結(jié)構(gòu),而不是算法?!猂ob Pike

程序員束手無策。。。。。只有跳脫代碼,直起腰,仔細(xì)思考數(shù)據(jù)才是***的行動(dòng)。表達(dá)式編程的精髓。——Fred Brooks

數(shù)據(jù)比程序邏輯更易駕馭。盡可能把設(shè)計(jì)的復(fù)雜度從代碼轉(zhuǎn)移至數(shù)據(jù)是個(gè)好實(shí)踐?!秛nix編程藝術(shù)》作者。


新聞名稱:詳解什么是數(shù)據(jù)驅(qū)動(dòng)編程
當(dāng)前路徑:http://www.5511xx.com/article/djdiihd.html