前言:
最近在學習《unix程式設計藝術》。以前粗略的翻過,以為是介紹unix工具的。現在認真的看了下,原來是介紹設計原則的。它的核心就是第一章介紹的unix的哲學以及17個設計原則,而後面的內容就是圍繞它來展開的。以前說過,要學習適合自己的資料,而判斷是否適合的乙個方法就是看你是否能夠讀得下去。我對這本書有一種相見恨晚的感覺。推薦有4~6年工作經驗的朋友可以讀一下。
正題:
作者在介紹unix設計原則時,其中有一條為「表示原則:把知識疊入資料以求邏輯質樸而健壯」。結合之前自己的一些經驗,我對這個原則很有共鳴,所以先學習了資料驅動程式設計相關的內容,這裡和大家分享出來和大家一起討論。
資料驅動程式設計的核心
資料驅動程式設計的核心出發點是相對於程式邏輯,人類更擅長於處理資料。資料比程式邏輯更容易駕馭,所以我們應該盡可能的將設計的複雜度從程式**轉移至資料。
真的是這樣嗎?讓我們來看乙個示例。
假設有乙個程式,需要處理其他程式傳送的訊息,訊息型別是字串,每個訊息都需要乙個函式進行處理。第一印象,我們可能會這樣處理:
void msg_proc(const char *msg_type, const char *msg_buf)
else if (0 == strcmp(msg_type, "tring_100"))
else if (0 == strcmp(msg_type, "ring_180"))
else if (0 == strcmp(msg_type, "ring_181"))
else if (0 == strcmp(msg_type, "ring_182"))
else if (0 == strcmp(msg_type, "ring_183"))
else if (0 == strcmp(msg_type, "ok_200"))
。。。。。。下面這種思路的優勢:else if (0 == strcmp(msg_type, "fail_486"))
else }
上面的訊息型別取自sip協議(不完全相同,sip協議借鑑了http協議),訊息型別可能還會增加。看著常常的流程可能有點累,檢測一下中間某個訊息有沒有處理也比較費勁,而且,沒增加乙個訊息,就要增加乙個流程分支。
按照資料驅動程式設計的思路,可能會這樣設計:
typedef void (*sip_msg_fun)(const char *);
typedef struct __msg_fun_st
msg_fun_st;
msg_fun_st msg_flow =
, ,
, ,
, ,
,。。。。。。 };
void msg_proc(const char *msg_type, const char *msg_buf) }
log("未識別的訊息型別%s\n", msg_type);
}
1、可讀性更強,訊息處理流程一目了然。
2、更容易修改,要增加新的訊息,只要修改資料即可,不需要修改流程。
3、重用,第一種方案的很多的else if其實只是訊息型別和處理函式不同,但是邏輯是一樣的。下面的這種方案就是將這種相同的邏輯提取出來,而把容易發生變化的部分提到外面。
隱含在背後的思想:
很多設計思路背後的原理其實都是相通的,隱含在資料驅動程式設計背後的實現思想包括:
1、控制複雜度。通過把程式邏輯的複雜度轉移到人類更容易處理的資料中來,從而達到控制複雜度的目標。
2、隔離變化。像上面的例子,每個訊息處理的邏輯是不變的,但是訊息可能是變化的,那就把容易變化的訊息和不容易變化的邏輯分離。
3、機制和策略的分離。和第二點很像,本書中很多地方提到了機制和策略。上例中,我的理解,機制就是訊息的處理邏輯,策略就是不同的訊息處理(後面想專門寫一篇文章介紹下機制和策略)。
資料驅動程式設計可以用來做什麼:
如上例所示,它可以應用在函式級的設計中。
同時,它也可以應用在程式級的設計中,典型的比如用表驅動法實現乙個狀態機(後面寫篇文章專門介紹)。
也可以用在系統級的設計中,比如dsl(這方面我經驗有些欠缺,目前不是非常確定)。
它不是什麼:
1、 它不是乙個全新的程式設計模型:它只是一種設計思路,而且歷史悠久,在unix/linux社群應用很多;
2、它不同於物件導向設計中的資料:「資料驅動程式設計中,資料不但表示了某個物件的狀態,實際上還定義了程式的流程;oo看重的是封裝,而資料驅動程式設計看重的是編寫盡可能少的**。」
書中的值得思考的話:
資料壓倒一切。如果選擇了正確的資料結構並把一切組織的井井有條,正確的演算法就不言自明。程式設計的核心是資料結構,而不是演算法。——rob pike
程式設計師束手無策。。。。。只有跳脫**,直起腰,仔細思考資料才是最好的行動。表示式程式設計的精髓。——fred brooks
資料比程式邏輯更易駕馭。盡可能把設計的複雜度從**轉移至資料是個好實踐。——《unix程式設計藝術》作者。
什麼是資料驅動程式設計
前言 最近在學習 unix程式設計藝術 以前粗略的翻過,以為是介紹unix工具的。現在認真的看了下,原來是介紹設計原則的。它的核心就是第一章介紹的unix的哲學以及17個設計原則,而後面的內容就是圍繞它來展開的。以前說過,要學習適合自己的資料,而判斷是否適合的乙個方法就是看你是否能夠讀得下去。我對這...
什麼是資料驅動程式設計
前言 最近在學習 unix程式設計藝術 以前粗略的翻過,以為是介紹unix工具的。現在認真的看了下,原來是介紹設計原則的。它的核心就是第一章介紹的unix的哲學以及17個設計原則,而後面的內容就是圍繞它來展開的。以前說過,要學習適合自己的資料,而判斷是否適合的乙個方法就是看你是否能夠讀得下去。我對這...
什麼是電腦驅動?
驅動程式扮演溝通的角色,把硬體的功能告訴電腦系統,並且也將系統的指令傳達給硬體,讓它開始工作。驅動程式即新增到作業系統中的一小塊 其中包含有關硬體裝置的資訊。有了此資訊,計算機就可以與裝置進行通訊。驅動程式是硬體廠商根據作業系統編寫的配置檔案,可以說沒有驅動程式,計算機中的硬體就無法工作。作業系統不...