C語言函數(shù)調用框架

          Posted on 2005-05-27 11:44 李嵐 閱讀(1534) 評論(0)  編輯  收藏 所屬分類: C

          大家在工作中也許會碰到這樣的情況,一個C語言程序,可能有十幾萬行代碼,讀取上百張的數(shù)據(jù)表,還要處理N多的業(yè)務邏輯

           

          當你和你的小組實現(xiàn)了這樣一個系統(tǒng)之后,它工作的很好,這時,大家都長舒了一口氣.可是,哪知道惡夢才剛剛開始.

           

          突然有一天,客戶會提出新的需求,通知要你新加一個功能,你不得不在程序里的初始化函數(shù)里,處理業(yè)務邏輯的函數(shù)里,還有掃尾的函數(shù)里都加上你要新添加的功能代碼,當然添加這三處地方也許只是最少的情況,更多的情況下,需要你做更多的工作.

           

          所以,這就需要我們把這些工作的共性抽象出來,形成一個類似框架的東西.提高程序的可維護性和可擴展性.現(xiàn)在我就想完成這樣一個東西.雖然可能會很難,自己水平也不是很高,可能會失敗,但就當是投石問路吧

           

          設計的思想是把每項的一個功能都看成是一個component,每一個component都有自己獨立的初始化函數(shù),業(yè)務處理函數(shù),和掃尾的函數(shù)等.還可以根據(jù)配置文件來配置管理組件和一些基礎設施,可能會提供一種機制來管理這些組件和基礎設施.然后會有一些函數(shù)來實現(xiàn)IOC,把復雜性委托給"框架"."框架"來管理這些組件的具體實現(xiàn).這有點像C語言版的Spring,呵呵

           

          下面的函數(shù)是我實現(xiàn)這個框架的第一步:

          方法很簡單
           

          /*---------------定義一個要實現(xiàn)的功能的頭文件imp.h-------------*/

          #ifndef _IMP_H

          #define _IMP_H

           

          /*參數(shù)是傳入自身的引用”*/

          void do_before(struct TestStruct* t);  

           

          void  prcess (struct TestStruct* t,int i);

           

          void do_after(struct TestStruct* t)

          #endif

           

           

           

          /*-------------組件的聲明struct.c------------*/

          #ifndef _STRUCT_H

          #define _STRUCT_H

           

          /*這個就代表了一個組件,注意函數(shù)指針名字和剛才定義的名字一致*/

          struct TestStruct

          {

                   int i;  //業(yè)務邏輯需要的一些變量

                   int j;

                   void ( * do_before)(struct TestStruct *);

                   void  ( * prcess)(struct TestStruct *,int);

          void do_after(struct TestStruct* t)

           

          };

           

          #endif

           

          /*-----------------main函數(shù)調用:--------------*/

          #include "struct.h"

          #include "imp.h"

           

          struct TestStruct ts1={

               . do_before = do_before,   //imp.h里函數(shù)傳入

               .process  = process,

          . do_after = do_after,

          };

           

          void main_init(struct TestStruct *);   //一個測試函數(shù)

           

          int main(void)

          {

                   /* 聲明*/

                   struct TestStruct * test;  

                   void (*_main_ before)(struct TestStruct *);

                   void (*_main_ process)(struct TestStruct *);

          void (*_main_ after)(struct TestStruct *);

           

          /*初始化*/

                   ts1.i = 10;

                   ts1.j = 20;           

                   test = &ts1;        

                   _main_before = main_init

                   _main_process = main_process

          _main_after = main_after

           

          /*使用*/

                   _main_ before (test…..);

          _main_ process(test…..);

          _main_ after (test….);

           

          }

           

          void mian_init (struct TestStruct * test)

          {

                   printf("before add\n");

                   test->do_before(&ts1);

          }

           

           

          總結:這是程序的第一個版本, 它并沒有給程序帶來什么實質性的改變,函數(shù)指針的使用使程序變的難以理解,甚至還沒有直接實現(xiàn)來的直觀,方便.而且, _main_ before (test…..);這個函數(shù),到模塊多了以后,參數(shù)列表會很長.這個版本僅僅是規(guī)定了一個函數(shù)調用的契約,而且是要程序員自己必須要自己去注意這個契約,契約要求每實現(xiàn)一個功能都需要定義一個結構體,結構體里面會有它要使用的變量和操作.所以,這個實現(xiàn)和剛開始提出的目標還有很大的差距.

           

          PS:關于框架這種東西,我覺得框架內部結構復雜是可以接受的關鍵的是要向使用者隱藏這種復雜性.

           

           

          C語言沒有提供面向對象語言那種數(shù)據(jù)的封裝,但是我們可以自己實現(xiàn)一種方式來達到同樣的效果.也許有人會覺得用結構化語言去模仿面向對象語言的特性完全沒有必要,但是事實是:現(xiàn)在仍然有很多關鍵的應用需要用到C語言.所以,我們可以通過解決問題一次,就重復運用解決這類問題辦法來解決再次出現(xiàn)的類似的問題.

           

          在下一個版本中,我想做如下的改進:

          1)      想辦法讓C語言也能在運行時動態(tài)確定調用函數(shù).這樣話.就不用我們手動去指定調用哪個函數(shù)了而是通過一個配置文件但是好像C語言要這樣搞會很難,可惜不是java

          2)      而參數(shù)列表會很長的問題應該能很好解決

           

           


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           

          posts - 7, comments - 23, trackbacks - 0, articles - 0

          Copyright © 李嵐

          主站蜘蛛池模板: 霍林郭勒市| 界首市| 理塘县| 博兴县| 乌拉特中旗| 丹东市| 永安市| 开阳县| 宁陕县| 陵水| 吉林省| 平阳县| 黄山市| 乾安县| 义马市| 上饶县| 绥化市| 开封县| 永嘉县| 紫云| 昭觉县| 即墨市| 襄汾县| 勐海县| 龙南县| 澜沧| 安仁县| 阿城市| 泸水县| 托克托县| 西盟| 界首市| 四会市| 甘谷县| 龙门县| 营山县| 巩留县| 兰溪市| 梁山县| 安乡县| 原阳县|