成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解什么是數據驅動編程

開發 開發工具
數據驅動編程的核心出發點是相對于程序邏輯,人類更擅長于處理數據。本文將介紹什么是數據驅動編程。

  前言:

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

  正題:

  作者在介紹Unix設計原則時,其中有一條為“表示原則:把知識疊入數據以求邏輯質樸而健壯”。結合之前自己的一些經驗,我對這個原則很有共鳴,所以先學習了數據驅動編程相關的內容,這里和大家分享出來和大家一起討論。

  數據驅動編程的核心

  數據驅動編程的核心出發點是相對于程序邏輯,人類更擅長于處理數據。數據比程序邏輯更容易駕馭,所以我們應該盡可能的將設計的復雜度從程序代碼轉移至數據。

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

  假設有一個程序,需要處理其他程序發送的消息,消息類型是字符串,每個消息都需要一個函數進行處理。***印象,我們可能會這樣處理:

  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("未識別的消息類型%s ", msg_type);  
  39.   }  
  40.   } 

  上面的消息類型取自sip協議(不完全相同,sip協議借鑒了http協議),消息類型可能還會增加。看著常常的流程可能有點累,檢測一下中間某個消息有沒有處理也比較費勁,而且,沒增加一個消息,就要增加一個流程分支。

  按照數據驅動編程的思路,可能會這樣設計:

  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;//函數指針  
  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 <type_num; 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("未識別的消息類型%s ", msg_type);  
  32.   } 

  下面這種思路的優勢:

  1、可讀性更強,消息處理流程一目了然。

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

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

  隱含在背后的思想

  很多設計思路背后的原理其實都是相通的,隱含在數據驅動編程背后的實現思想包括:

  1、控制復雜度。通過把程序邏輯的復雜度轉移到人類更容易處理的數據中來,從而達到控制復雜度的目標。

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

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

  數據驅動編程可以用來做什么:

  如上例所示,它可以應用在函數級的設計中。

  同時,它也可以應用在程序級的設計中,典型的比如用表驅動法實現一個狀態機(后面寫篇文章專門介紹)。

  也可以用在系統級的設計中,比如DSL(這方面我經驗有些欠缺,目前不是非常確定)。

  它不是什么:

  1、 它不是一個全新的編程模型:它只是一種設計思路,而且歷史悠久,在unix/linux社區應用很多;

  2、它不同于面向對象設計中的數據:“數據驅動編程中,數據不但表示了某個對象的狀態,實際上還定義了程序的流程;OO看重的是封裝,而數據驅動編程看重的是編寫盡可能少的代碼。”

  書中的值得思考的話:

  數據壓倒一切。如果選擇了正確的數據結構并把一切組織的井井有條,正確的算法就不言自明。編程的核心是數據結構,而不是算法。——Rob Pike

  程序員束手無策。。。。。只有跳脫代碼,直起腰,仔細思考數據才是***的行動。表達式編程的精髓。——Fred Brooks

  數據比程序邏輯更易駕馭。盡可能把設計的復雜度從代碼轉移至數據是個好實踐。——《unix編程藝術》作者。

原文鏈接:http://www.cnblogs.com/chgaowei/archive/2011/08/03/2126724.html

【編輯推薦】

  1. 概括VB.NET窗體編程模式
  2. JavaScript編程模式:模塊的力量
  3. 基于事件的C#異步編程模式淺析
  4. 淺談VB.NET DataRowView
  5. 淺談VB6.0實現多窗體交互
責任編輯:彭凡 來源: 博客園
相關推薦

2021-06-18 12:39:12

數據驅動設計設計師收集數據

2021-04-12 19:18:23

NVMe存儲控制器

2018-10-17 08:30:31

Python行為驅動編程語言

2011-07-05 17:19:47

元編程

2011-11-11 15:47:22

JavaScript

2009-09-14 16:17:03

什么是LINQ To

2019-07-30 12:28:51

云計算虛擬化服務器

2020-07-23 17:29:47

接口編程代碼

2021-04-19 14:28:28

NVMe存儲協議

2020-07-28 08:09:02

領域驅動設計

2017-12-19 21:29:58

物聯網區塊鏈大數據

2010-06-09 14:13:12

Opensuse顯卡驅

2009-08-19 16:40:35

C#回調

2009-02-02 09:04:52

MVC框架Java

2022-06-20 05:25:54

裂腦Oracle RAC數據庫

2022-08-10 06:16:49

網絡交換機網絡

2021-12-15 10:54:42

數據增強機器學習數據

2023-12-21 11:44:11

數據湖數據管理數據存儲庫

2025-02-03 00:40:00

線程組Java并發編程

2024-11-08 09:48:38

異步編程I/O密集
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99精品一区 | 中文字幕在线观看第一页 | 日本a视频| 欧美精品乱码99久久影院 | av黄色免费在线观看 | 毛片一区二区三区 | 欧美黑人体内she精在线观看 | 91视频亚洲| 在线观看亚洲 | 激情av免费看 | 国产激情在线观看视频 | 91亚洲国产| 久久99精品久久久久久国产越南 | 亚洲精品永久免费 | 亚洲精选久久 | 色婷婷久久久久swag精品 | 黑人巨大精品欧美一区二区免费 | av免费在线观看网站 | 国产精品自拍av | 成人在线观看中文字幕 | 91国内精精品久久久久久婷婷 | 久久久久久久久91 | 麻豆久久久久久久久久 | 欧美精品久久久久 | 国产免费国产 | cao在线 | 亚州综合一区 | 99亚洲精品 | 在线小视频 | 一本色道精品久久一区二区三区 | 亚洲一区二区在线播放 | 日本精品视频一区二区三区四区 | www成人免费视频 | 日韩成人免费在线视频 | 久久鲁视频 | 久久手机视频 | 久久91精品国产一区二区 | 日韩三级在线观看 | 亚洲久草 | 成人精品一区二区户外勾搭野战 | 免费午夜视频在线观看 |