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

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

深入數據驅動編程之表驅動法的詳解

2020-10-28 18:49:53
字體:
來源:轉載
供稿:網友
數據驅動編程之表驅動法 本文示例代碼采用的是c語言。
之前介紹過數據驅動編程《淺談:什么是數據驅動編程的詳解》。里面介紹了一個簡單的數據驅動手法。今天更進一步,介紹一個稍微復雜,更加實用的一點手法――表驅動法。
關于表驅動法,在《unix編程藝術》中有提到,更詳細的描述可以看一下《代碼大全》,有一章專門進行描述(大概是第八章)。
簡單的表驅動:
淺談:什么是數據驅動編程的詳解》中有一個代碼示例。它其實也可以看做是一種表驅動手法,只不過這個表相對比較簡單,它在收到消息后,根據消息類型確定使用調用什么函數進行處理。
復雜一點的表驅動:
考慮一個消息(事件)驅動的系統,系統的某一模塊需要和其他的幾個模塊進行通信。它收到消息后,需要根據消息的發送方,消息的類型,自身的狀態,進行不同的處理。比較常見的一個做法是用三個級聯的switch分支實現通過硬編碼來實現:
復制代碼 代碼如下:

switch(sendMode)
{
 case:
}
switch(msgEvent)
{
 case:
}
switch(myStatus)
{
 case:
}

這種方法的缺點:
1、可讀性不高:找一個消息的處理部分代碼需要跳轉多層代碼。
2、過多的switch分支,這其實也是一種重復代碼。他們都有共同的特性,還可以再進一步進行提煉。
3、可擴展性差:如果為程序增加一種新的模塊的狀態,這可能要改變所有的消息處理的函數,非常的不方便,而且過程容易出錯。
4、程序缺少主心骨:缺少一個能夠提綱挈領的主干,程序的主干被淹沒在大量的代碼邏輯之中。
用表驅動法來實現:
根據定義的三個枚舉:模塊類型,消息類型,自身模塊狀態,定義一個函數跳轉表:
復制代碼 代碼如下:

typedef struct  __EVENT_DRIVE
{
 MODE_TYPE mod;//消息的發送模塊
 EVENT_TYPE event;//消息類型
 STATUS_TYPE status;//自身狀態
 EVENT_FUN eventfun;//此狀態下的處理函數指針
}EVENT_DRIVE;
EVENT_DRIVE eventdriver[] = //這就是一張表的定義,不一定是數據庫中的表。也可以使自己定義的一個結構體數組。
{
 {MODE_A, EVENT_a, STATUS_1, fun1}
 {MODE_A, EVENT_a, STATUS_2, fun2}
 {MODE_A, EVENT_a, STATUS_3, fun3}
 {MODE_A, EVENT_b, STATUS_1, fun4}
 {MODE_A, EVENT_b, STATUS_2, fun5}

 {MODE_B, EVENT_a, STATUS_1, fun6}
 {MODE_B, EVENT_a, STATUS_2, fun7}
 {MODE_B, EVENT_a, STATUS_3, fun8}
 {MODE_B, EVENT_b, STATUS_1, fun9}
 {MODE_B, EVENT_b, STATUS_2, fun10}
};
int driversize = sizeof(eventdriver) / sizeof(EVENT_DRIVE)//驅動表的大小
EVENT_FUN GetFunFromDriver(MODE_TYPE mod, EVENT_TYPE event, STATUS_TYPE status)//驅動表查找函數
{
 int i = 0;
 for (i = 0; i < driversize; i ++)
 {
  if ((eventdriver[i].mod == mod) && (eventdriver[i].event == event) && (eventdriver[i].status == status))
  {
   return eventdriver[i].eventfun;
  }
 }
 return NULL;
}

這種方法的好處:
1、提高了程序的可讀性。一個消息如何處理,只要看一下驅動表就知道,非常明顯。
2、減少了重復代碼。這種方法的代碼量肯定比第一種少。為什么?因為它把一些重復的東西:switch分支處理進行了抽象,把其中公共的東西――根據三個元素查找處理方法抽象成了一個函數GetFunFromDriver外加一個驅動表。
3、可擴展性。注意這個函數指針,他的定義其實就是一種契約,類似于java中的接口,c++中的純虛函數,只有滿足這個條件(入參,返回值),才可以作為一個事件的處理函數。這個有一點插件結構的味道,你可以對這些插件進行方便替換,新增,刪除,從而改變程序的行為。而這種改變,對事件處理函數的查找又是隔離的(也可以叫做隔離了變化)。、
4、程序有一個明顯的主干。
5、降低了復雜度。通過把程序邏輯的復雜度轉移到人類更容易處理的數據中來,從而達到控制復雜度的目標。
繼承與組合
考慮一個事件驅動的模塊,這個模塊管理很多個用戶,每個用戶需要處理很多的事件。那么,我們建立的驅動表就不是針對模塊了,而是針對用戶,應該是用戶在某狀態下,收到某模塊的某事件的處理。我們再假設用戶可以分為不同的級別,每個級別對上面的提到的處理又不盡相同。

用面向對象的思路,我們可以考慮設計一個用戶的基類,實現相同事件的處理方法;根據級別不同,定義幾個不同的子類,繼承公共的處理,再分別實現不同的處理。這是最常見的一種思路,可以叫它繼承法。
如果用表驅動法怎么實現?直接設計一個用戶的類,沒有子類,也沒有具體的事件的處理方法。它有一個成員,就是一個驅動表,它收到事件后,全部委托給這個驅動表去進行處理。針對用戶的級別不同,可以定義多個不同的驅動表來裝配不同的對象實例。這個可以叫他組合法。

繼承和組合在《設計模式》也有提到。組合的優勢在于它的可擴展性,彈性,強調封裝性。
至于這種情況下的驅動表,可以繼續使用結構體,也可以使用對象。
上面的方法的一點性能優化建議:
如果對性能要求不高,上面的方法足可以應付。如果性能要求很高,可以進行適當的優化。比如,可以建立一個多維數組,每一維分別表示模塊,狀態,消息。這樣,就可以根據這三者的枚舉直接根據下標定位到處理函數,而不是查表。(其實還是數據驅動的思想:數據結構是靜態的算法。)
數據驅動編程再更高級,更為抽象一點的,應該就是流程腳本或者DSL了。我曾經寫過一個簡單的寄生在xml上的腳本來描述流程。這一塊后面抽時間介紹。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美在线免费| 成人精品在线观看| 一区二区欧美日韩视频| 高潮白浆女日韩av免费看| 欧美精品在线看| 亚洲一区二区中文字幕| 成人h片在线播放免费网站| 欧美日韩xxxxx| 欧美一性一乱一交一视频| 欧美日本高清一区| 欧美最猛性xxxx| 欧美在线激情网| 亚洲成年人影院在线| 色噜噜狠狠色综合网图区| 亚洲欧洲一区二区三区在线观看| 亚洲视屏在线播放| 精品久久香蕉国产线看观看亚洲| 日韩亚洲在线观看| 91精品国产综合久久香蕉922| 国产一区二区美女视频| 国产精品视频大全| 91在线免费视频| xvideos成人免费中文版| 欧美午夜宅男影院在线观看| 亚州精品天堂中文字幕| 九九综合九九综合| 欧美日韩免费在线观看| 国产美女精彩久久| 午夜欧美大片免费观看| 性金发美女69hd大尺寸| 欧美美女18p| 国产精品亚洲片夜色在线| 色噜噜狠狠色综合网图区| 亚洲成人免费网站| 亚洲成年人在线| 国产69精品久久久久99| 欧美日韩不卡合集视频| 色青青草原桃花久久综合| 日韩av手机在线| 日韩大片在线观看视频| 国产精品成人一区二区三区吃奶| 久久久久久97| 日韩视频免费大全中文字幕| 欧美一级大胆视频| 北条麻妃一区二区三区中文字幕| 欧美激情视频免费观看| 日韩精品极品在线观看| 97国产在线观看| 国产精品久久久久久久久久东京| 热久久免费国产视频| 午夜美女久久久久爽久久| 78m国产成人精品视频| 国产精品高潮呻吟久久av野狼| 国产91对白在线播放| 亚洲天堂色网站| 久久99热这里只有精品国产| 少妇激情综合网| 欧美成人一二三| 欧美激情久久久久久| 精品无人区乱码1区2区3区在线| 国产精品夫妻激情| 国内自拍欧美激情| 国产自摸综合网| 亚洲高清久久久久久| 精品久久久国产精品999| 国产精品国产三级国产专播精品人| 日韩视频一区在线| 国产精品久久精品| 欧美一级淫片丝袜脚交| 成人性生交xxxxx网站| 欧美激情第1页| 91精品免费久久久久久久久| 91欧美精品成人综合在线观看| 亚洲精品福利免费在线观看| 日韩av电影在线网| 永久555www成人免费| 奇米成人av国产一区二区三区| 欧美精品精品精品精品免费| 国产日韩精品在线播放| 精品国产一区二区三区久久| 欧美日韩福利在线观看| 国产一区二区三区三区在线观看| 久久免费视频网| 亚洲男人天堂久| 国产色综合天天综合网| 日韩大片在线观看视频| 亚洲情综合五月天| 日韩精品在线播放| 欧美日韩精品在线视频| 狠狠色狠色综合曰曰| 久久久久国色av免费观看性色| 亚洲最新av在线| 成人美女av在线直播| 精品毛片三在线观看| 精品亚洲aⅴ在线观看| 91精品视频在线播放| 亚洲美女福利视频网站| 国产成人福利网站| 欧美黑人巨大xxx极品| 国产亚洲精品久久| 国产精品爱啪在线线免费观看| 精品久久久久久中文字幕| 久久久久久久久久国产| 欧美成人国产va精品日本一级| 国产精品美女免费视频| 色偷偷88888欧美精品久久久| 国产福利成人在线| 国产伦精品一区二区三区精品视频| 国模精品系列视频| 成人国产精品日本在线| 久久久久久久久久久av| 国产精品一区二区久久精品| 日韩精品久久久久| 亚洲成人av在线| 亚洲欧美在线第一页| 精品福利免费观看| 黄色一区二区在线| 国产精品久久久久久一区二区| 欧美专区国产专区| 91理论片午午论夜理片久久| 影音先锋欧美精品| 亚洲第一综合天堂另类专| 精品亚洲男同gayvideo网站| 日韩av最新在线观看| 高清亚洲成在人网站天堂| 日韩精品中文字幕在线播放| 国产91热爆ts人妖在线| 国产精品久久久久9999| 色播久久人人爽人人爽人人片视av| 国产精品久久久久久久av大片| 俺去了亚洲欧美日韩| 久久久久久91| 国产午夜精品视频| 精品久久久一区二区| 在线日韩第一页| 亚洲欧美精品一区二区| 国产精品久久二区| 91久久精品国产91久久性色| 日韩欧美精品免费在线| 国产精品wwww| 日韩在线免费视频| 国产婷婷97碰碰久久人人蜜臀| 久久免费视频这里只有精品| 色婷婷**av毛片一区| 尤物九九久久国产精品的特点| 日韩色av导航| 国产精品久久久久免费a∨| 久久亚洲春色中文字幕| 欧美精品福利视频| 姬川优奈aav一区二区| 成人美女av在线直播| 在线精品国产成人综合| 成人日韩在线电影| 91久久久久久国产精品| 国产欧美 在线欧美| 国产精品精品视频| 色黄久久久久久| 国产精品网红直播| 国产精品美女www爽爽爽视频| 亚洲精品白浆高清久久久久久| 日韩hd视频在线观看| 热re91久久精品国99热蜜臀| 久久97精品久久久久久久不卡| 色综合色综合网色综合|