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

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

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

    C語言函數調用框架

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

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

     

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

     

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

     

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

     

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

     

    下面的函數是我實現這個框架的第一步:

    方法很簡單
     

    /*---------------定義一個要實現的功能的頭文件imp.h-------------*/

    #ifndef _IMP_H

    #define _IMP_H

     

    /*參數是傳入自身的引用”*/

    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

     

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

    struct TestStruct

    {

             int i;  //業務邏輯需要的一些變量

             int j;

             void ( * do_before)(struct TestStruct *);

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

    void do_after(struct TestStruct* t)

     

    };

     

    #endif

     

    /*-----------------main函數調用:--------------*/

    #include "struct.h"

    #include "imp.h"

     

    struct TestStruct ts1={

         . do_before = do_before,   //imp.h里函數傳入

         .process  = process,

    . do_after = do_after,

    };

     

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

     

    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);

    }

     

     

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

     

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

     

     

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

     

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

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

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

     

     


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


    網站導航:
     

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

    Copyright © 李嵐

    主站蜘蛛池模板: 最近国语视频在线观看免费播放 | 成人免费视频小说| 亚洲AV无码一区二区乱子仑| 亚洲午夜福利精品无码| 最近2019免费中文字幕视频三| 亚洲欧洲av综合色无码| 亚洲无线码一区二区三区| 青青草免费在线视频| 一级做a爱片特黄在线观看免费看 一级做a爱过程免费视 | a毛片视频免费观看影院| 亚洲天堂2016| 亚洲啪啪综合AV一区| 四虎影院免费视频| 99久热只有精品视频免费看 | 亚洲综合久久夜AV | 免费毛片a在线观看67194| 九九综合VA免费看| 亚洲愉拍一区二区三区| 亚洲乱码日产一区三区| 青青青国产免费一夜七次郎| 免费人成毛片动漫在线播放| 国产AV无码专区亚洲AV蜜芽| 亚洲自偷自偷精品| 亚洲色精品88色婷婷七月丁香| 欧洲精品免费一区二区三区| 中文字幕天天躁日日躁狠狠躁免费| 一区二区三区精品高清视频免费在线播放 | 一区二区三区在线免费观看视频| 亚洲精品国产手机| 九月丁香婷婷亚洲综合色| 免费v片在线观看无遮挡| 91免费资源网站入口| 日本免费一区二区三区| 久久免费观看视频| 色网站在线免费观看| 亚洲精品中文字幕无码A片老| 91亚洲va在线天线va天堂va国产| 亚洲精品自在在线观看| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 四虎影视在线看免费观看| 亚洲狠狠婷婷综合久久蜜芽|