<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

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

     

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

     

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

     

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

     

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

     

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

    方法很簡單
     

    /*---------------定義一個(gè)要實(shí)現(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

     

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

    struct TestStruct

    {

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

             int j;

             void ( * do_before)(struct TestStruct *);

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

    void do_after(struct TestStruct* t)

     

    };

     

    #endif

     

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

    #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 *);   //一個(gè)測試函數(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);

    }

     

     

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

     

    PS:關(guān)于框架這種東西,我覺得框架內(nèi)部結(jié)構(gòu)復(fù)雜是可以接受的關(guān)鍵的是要向使用者隱藏這種復(fù)雜性.

     

     

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

     

    在下一個(gè)版本中,我想做如下的改進(jìn):

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

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

     

     


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


    網(wǎng)站導(dǎo)航:
     

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

    Copyright © 李嵐

    主站蜘蛛池模板: 亚洲av无码不卡久久| 亚洲一区二区三区四区在线观看| 久久精品亚洲男人的天堂| 久久久久久久亚洲精品| 亚洲AV日韩精品久久久久久| 久久亚洲精品成人无码网站| 亚洲乱码无限2021芒果| 亚洲精品国产摄像头| 一边摸一边桶一边脱免费视频| 中文字幕久无码免费久久| 一级毛片免费观看不卡的| 成年人视频在线观看免费| 亚洲AV无码成H人在线观看| 日本亚洲成高清一区二区三区| 亚洲成人福利在线观看| 精品国产亚洲AV麻豆| 97国免费在线视频| 1000部无遮挡拍拍拍免费视频观看| 美女隐私免费视频看| 日本卡1卡2卡三卡免费| 亚洲免费在线视频播放| 久热中文字幕在线精品免费| **一级一级毛片免费观看| 最近免费字幕中文大全视频| 99精品在线免费观看| 亚洲免费人成视频观看| 成人黄18免费视频| 免费播放特黄特色毛片| 亚洲AV中文无码乱人伦在线视色 | 亚洲欧美日韩国产成人| 美女裸体无遮挡免费视频网站| 免费播放在线日本感人片| 1000部夫妻午夜免费| 日韩毛片免费在线观看| 亚洲精品无码久久久久去q| 亚洲欧洲综合在线| 美女视频免费看一区二区| 免费国产成人α片| 日韩免费一级毛片| 日本亚洲欧洲免费天堂午夜看片女人员 | 中文字幕永久免费|