表驅(qū)動(dòng)編程總結(jié)

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

上面的消息類型取自sip協(xié)議(不完全相同羊苟,sip協(xié)議借鑒了http協(xié)議)塑陵,消息類型可能還會(huì)增加〖眨看著常常的流程可能有點(diǎn)累猿妈,檢測(cè)一下中間某個(gè)消息有沒有處理也比較費(fèi)勁吹菱,而且巍虫,沒增加一個(gè)消息,就要增加一個(gè)流程分支鳍刷。

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

復(fù)雜一點(diǎn)的表驅(qū)動(dòng) :考慮一個(gè)消息(事件)驅(qū)動(dòng)的系統(tǒng),系統(tǒng)的某一模塊需要和其他的幾個(gè)模塊進(jìn)行通信输瓜。它收到消息后瓦胎,需要根據(jù)消息的發(fā)送方,消息的類型尤揣,自身的狀態(tài)搔啊,進(jìn)行不同的處理。比較常見的一個(gè)做法是用三個(gè)級(jí)聯(lián)的switch分支實(shí)現(xiàn)通過硬編碼來實(shí)現(xiàn):

這種方法的缺點(diǎn):

1北戏、可讀性不高:找一個(gè)消息的處理部分代碼需要跳轉(zhuǎn)多層代碼负芋。

2、過多的switch分支嗜愈,這其實(shí)也是一種重復(fù)代碼旧蛾。他們都有共同的特性,還可以再進(jìn)一步進(jìn)行提煉蠕嫁。

3锨天、可擴(kuò)展性差:如果為程序增加一種新的模塊的狀態(tài),這可能要改變所有的消息處理的函數(shù)剃毒,非常的不方便病袄,而且過程容易出錯(cuò)。

4赘阀、程序缺少主心骨:缺少一個(gè)能夠提綱挈領(lǐng)的主干益缠,程序的主干被淹沒在大量的代碼邏輯之中。

用表驅(qū)動(dòng)法來實(shí)現(xiàn):

根據(jù)定義的三個(gè)枚舉:模塊類型纤壁,消息類型左刽,自身模塊狀態(tài),定義一個(gè)函數(shù)跳轉(zhuǎn)表:

這種方法的好處:

1酌媒、提高了程序的可讀性欠痴。一個(gè)消息如何處理迄靠,只要看一下驅(qū)動(dòng)表就知道,非常明顯喇辽。

2掌挚、減少了重復(fù)代碼。這種方法的代碼量肯定比第一種少菩咨。為什么吠式?因?yàn)樗岩恍┲貜?fù)的東西:switch分支處理進(jìn)行了抽象,把其中公共的東西——根據(jù)三個(gè)元素查找處理方法抽象成了一個(gè)函數(shù)GetFunFromDriver外加一個(gè)驅(qū)動(dòng)表抽米。

3特占、可擴(kuò)展性。注意這個(gè)函數(shù)指針云茸,他的定義其實(shí)就是一種契約是目,類似于java中的接口,c++中的純虛函數(shù)标捺,只有滿足這個(gè)條件(入?yún)ⅲ?a target="_blank" rel="nofollow">返回值)懊纳,才可以作為一個(gè)事件的處理函數(shù)。這個(gè)有一點(diǎn)插件結(jié)構(gòu)的味道亡容,你可以對(duì)這些插件進(jìn)行方便替換嗤疯,新增,刪除闺兢,從而改變程序的行為茂缚。而這種改變,對(duì)事件處理函數(shù)的查找又是隔離的(也可以叫做隔離了變化)列敲。阱佛、

4、程序有一個(gè)明顯的主干戴而。

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

二、假設(shè)你在寫一個(gè)計(jì)算醫(yī)療保險(xiǎn)費(fèi)率的程序扶踊,這些費(fèi)率隨著年齡泄鹏、性別、婚姻狀況秧耗、以及吸煙與否的不同情況而變化的备籽。你寫出的代碼會(huì)不會(huì)是這樣?

很簡(jiǎn)單是不是??? 很繁瑣有木有车猬?你能想象霉猛,把這個(gè)題目做完需要多大的代碼量。

好珠闰,現(xiàn)在看看表驅(qū)動(dòng)法的解決這類邏輯控制結(jié)構(gòu)惜浅。

首先,我們需要做的是把這些費(fèi)率存入所有元素索引的數(shù)組里面伏嗜,用簡(jiǎn)單形象的描述就是坛悉,你需要定義一個(gè)類型,像這樣:

對(duì)承绸,它僅僅是一個(gè)枚舉類型裸影,上述只定義了兩個(gè)類型, 我們還需要定義一個(gè)性別類型八酒,在此就不再重復(fù)空民。

現(xiàn)在數(shù)據(jù)類型已經(jīng)定義好了刃唐,現(xiàn)在差的就是數(shù)據(jù)了羞迷,數(shù)據(jù)可以從數(shù)據(jù)庫(kù)查出,也可從文件讀出画饥,那就要看你怎么選擇了衔瓮,

下面定義一個(gè)方法:

我們現(xiàn)在需要做的,假如保險(xiǎn)人的信息是這樣的:18歲抖甘,單身热鞍,吸煙,女衔彻。

就像這樣薇宠,優(yōu)雅的代碼展示:

接下來可以根據(jù)是否吸煙,婚姻狀態(tài)艰额,性別澄港,年齡構(gòu)建一個(gè)數(shù)組,進(jìn)行查表柄沮。


1.1.3 分段查找

?通過確定數(shù)據(jù)所處的范圍確定分類(下標(biāo))回梧。有的數(shù)據(jù)可分成若干區(qū)間,即具有階梯性祖搓,如分?jǐn)?shù)等級(jí)狱意。此時(shí)可將每個(gè)區(qū)間的上限(或下限)存到一個(gè)表中,將對(duì)應(yīng)的值存到另一表中拯欧,通過第一個(gè)表確定所處的區(qū)段详囤,再由區(qū)段下標(biāo)在第二個(gè)表里讀取相應(yīng)數(shù)值。注意要留意端點(diǎn)镐作,可用二分法查找藏姐,另外可考慮通過索引方法來代替蚓再。

? ? ?如根據(jù)分?jǐn)?shù)查績(jī)效等級(jí):

上述兩張表(數(shù)組)也可合并為一張表(結(jié)構(gòu)體數(shù)組),如下所示:

該表結(jié)構(gòu)已具備的數(shù)據(jù)庫(kù)的雛形包各,并可擴(kuò)展支持更為復(fù)雜的數(shù)據(jù)摘仅。其查表方式通常為索引查找,偶爾也為分段查找问畅;當(dāng)索引具有規(guī)律性(如連續(xù)整數(shù))時(shí)娃属,退化為直接查找。

? ? ?使用分段查找法時(shí)應(yīng)注意邊界护姆,將每一分段范圍的上界值都考慮在內(nèi)矾端。找出所有不在最高一級(jí)范圍內(nèi)的值,然后把剩下的值全部歸入最高一級(jí)中卵皂。有時(shí)需要人為地為最高一級(jí)范圍添加一個(gè)上界秩铆。

? ? ?同時(shí)應(yīng)小心不要錯(cuò)誤地用“<”來代替“<=”。要保證循環(huán)在找出屬于最高一級(jí)范圍內(nèi)的值后恰當(dāng)?shù)亟Y(jié)束灯变,同時(shí)也要保證恰當(dāng)處理范圍邊界殴玛。

1.2.1 字符統(tǒng)計(jì)

? ? ?問題:統(tǒng)計(jì)用戶輸入的一串?dāng)?shù)字中每個(gè)數(shù)字出現(xiàn)的次數(shù)。

? ? ?普通解法主體代碼如下:

這種解法的缺點(diǎn)顯而易見添祸,既不美觀也不靈活滚粟。其問題關(guān)鍵在于未將數(shù)字字符與數(shù)組aDigitCharNum下標(biāo)直接關(guān)聯(lián)起來。

? ? ?以下示出更簡(jiǎn)潔的實(shí)現(xiàn)方式:?

上述實(shí)現(xiàn)考慮到0也為數(shù)字字符刃泌。該解法也可擴(kuò)展至統(tǒng)計(jì)所有ASCII可見字符凡壤。

1.2.7 消息處理

? ? ?問題:終端輸入不同的打印命令,調(diào)用相應(yīng)的打印函數(shù)耙替,以控制不同級(jí)別的打印亚侠。

? ? ?這是一段消息(事件)驅(qū)動(dòng)程序。本模塊接收其他模塊(如串口驅(qū)動(dòng))發(fā)送的消息俗扇,根據(jù)消息中的打印級(jí)別字符串和開關(guān)模式硝烂,調(diào)用不同函數(shù)進(jìn)行處理。常見的實(shí)現(xiàn)方法如下:


搬運(yùn)自:C語(yǔ)言表驅(qū)動(dòng)法編程實(shí)踐 - clover_toeic - 博客園

數(shù)據(jù)驅(qū)動(dòng)編程與表驅(qū)動(dòng)法(多if-else結(jié)構(gòu)精簡(jiǎn)) - CSDN博客

表驅(qū)動(dòng)法編程模式 - 肅 - 博客園

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狐援,一起剝皮案震驚了整個(gè)濱河市钢坦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啥酱,老刑警劉巖爹凹,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異镶殷,居然都是意外死亡禾酱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颤陶,“玉大人颗管,你說我怎么就攤上這事∽易撸” “怎么了垦江?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)搅方。 經(jīng)常有香客問我比吭,道長(zhǎng),這世上最難降的妖魔是什么姨涡? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任衩藤,我火速辦了婚禮,結(jié)果婚禮上涛漂,老公的妹妹穿的比我還像新娘赏表。我一直安慰自己,他們只是感情好匈仗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布瓢剿。 她就那樣靜靜地躺著,像睡著了一般锚沸。 火紅的嫁衣襯著肌膚如雪跋选。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天哗蜈,我揣著相機(jī)與錄音,去河邊找鬼坠韩。 笑死距潘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的只搁。 我是一名探鬼主播音比,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼氢惋!你這毒婦竟也來了洞翩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤焰望,失蹤者是張志新(化名)和其女友劉穎骚亿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熊赖,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡来屠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俱笛。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捆姜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迎膜,到底是詐尸還是另有隱情泥技,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布磕仅,位于F島的核電站零抬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宽涌。R本人自食惡果不足惜平夜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卸亮。 院中可真熱鬧忽妒,春花似錦、人聲如沸兼贸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)溶诞。三九已至鸯檬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間螺垢,已是汗流浹背喧务。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留枉圃,地道東北人功茴。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像孽亲,于是被迫代替她去往敵國(guó)和親坎穿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理返劲,服務(wù)發(fā)現(xiàn)玲昧,斷路器,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 今年已過了三分之一篮绿,前兩個(gè)月計(jì)劃的執(zhí)行還可以孵延,三月四月就懶惰了,周計(jì)劃也沒有堅(jiān)持住搔耕,自我反省和總結(jié)做的不好隙袁。接下來...
    陶陶爸比閱讀 440評(píng)論 0 50
  • 1.創(chuàng)建選擇聯(lián)系人的界面 ABPeoplePickerNavigationController*ppad = [[...
    archyly閱讀 494評(píng)論 0 0
  • 他們笑著 沉默的你 唱著悲傷的歌 換來的 卻是喜劇的效果 他們還笑著 滑稽的人啊 只剩下一把吉他 還要唱歌 你蹲在...
    倦憑秋樹閱讀 194評(píng)論 0 1
  • 犀皮漆傳統(tǒng)漆器工藝是我國(guó)珍貴的非物質(zhì)文化遺產(chǎn)菩收,漆器的分類很多梨睁,有雕漆、堆漆娜饵、推光漆器等等坡贺,而最令人矚目的當(dāng)屬犀皮漆...
    宿方閱讀 847評(píng)論 0 1