青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

小明思考

高性能服務(wù)器端計(jì)算
posts - 70, comments - 428, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

從全局變量到IOC模式

Posted on 2006-01-20 17:23 小明 閱讀(4962) 評(píng)論(7)  編輯 收藏 引用 所屬分類: C/C++
很早以前,在我初學(xué)c語言的時(shí)候,我的第一個(gè)象樣的程序是一個(gè)五子棋程序,使用了TC2.0的圖形庫,純面向過程的設(shè)計(jì),由上到下的設(shè)計(jì),而且只有一個(gè)c文件就搞定了,大概幾百行,可惜代碼已經(jīng)失傳,非常可惜。

為什么要全局變量?
List 1
int main()
{
int s1,s2,s3;
fun1(s1);
fun2(s1,s2);
fun3(s1,s2,s3);
return 0;
}
上面的s1,s2,s3如果改成全局變量,則變?yōu)?BR>List 2
int s1,s2,s3;

int main()
{
    fun1();
    fun2();
    fun3();
}
似乎簡(jiǎn)潔了一些,而且沒有了傳遞參數(shù)的開銷。但是缺點(diǎn)也是很明顯的,帶了三個(gè)函數(shù)之間的耦合。

既然我們認(rèn)識(shí)到全局變量的問題,怎么改進(jìn)呢?
代碼1中由于有三個(gè)變量,如果有更多的,就更麻煩,我們可以這樣改進(jìn)
List 3
typedef struct statusTag
{
    
int s1,s2,s3;
}Status;

int main()
{
    Status s;
    fun1(
&s);
    fun2(
&s);
    fun3(
&s);
    
return 0;
}
這種技巧你可以在lua中看到,看lua的使用代碼
List4
#include "lua.h"
#include 
"lauxlib.h"
#include 
"lualib.h"

int main(int argc, char *argv[])
{
    lua_State 
*= lua_open();
    
const char *buf = "var = 100";
    
int var ;
    luaopen_base(L);
    luaopen_io(L);
    lua_dostring(L, buf);
    lua_getglobal(L, 
"var");
    var 
= lua_tonumber(L, -1);
    lua_close(L);
    
    
return 0;
請(qǐng)注意到這里的lua_open方法,這其實(shí)是一種創(chuàng)建自己的工廠方法。不使用全局變量的好處就是,我們保留了可以創(chuàng)建多個(gè)對(duì)象的自由。

時(shí)代在發(fā)展,進(jìn)入C++時(shí)代,但是全局變量仍然有人在用,存在就是合理的。GOF提出一種設(shè)計(jì)模式叫Singleton的模式,其核心思想就是不讓全局變量漂浮在空中,把它放入class中,成為衣冠楚楚的C++公民。著名的Meyer Singleton像這樣
List 5
class Status
{
private:
    Status(){};
public:
    
static Status& getInstance()
    {
           
static Status s;
           
return s;
    }
};

class User
{
    
void fun()
    {
        Status 
&= Status::Instance();
        
//. . .use s
    }
};

一切似乎很完美,使用private來防止client 創(chuàng)建它,保證了對(duì)象的唯一性(注意:Meyer singleton并不具有多線程安全,可能導(dǎo)致多次初始化對(duì)象)

但是隨著 針對(duì)接口編程和單元測(cè)試越來越流行,singleton帶來的對(duì)單元測(cè)試不友好的特點(diǎn)日益體現(xiàn),全局變量不能很好的被mock,所以難于測(cè)試。

這時(shí)候所謂的IOC思想(Inversion of Control,即反轉(zhuǎn)模式)出來了,簡(jiǎn)單的來說,就是通過構(gòu)造函數(shù)或者set方法實(shí)現(xiàn)注入

List6 - 構(gòu)造函數(shù)注入
class Status{};

class User
{
   
public:
      User(Status 
*s):m_ps(s){};
      
void fun()
      {
           Status 
*= m_ps;
      }
   
private:
      Status 
*m_ps;
}

List7 - Set 注入
class Status{};

class User
{
   
public:
      User(){}
      
      
void setStaus(Status *s)
      {
           m_ps 
= s;
      }
      
      
void fun()
      {
           Status 
*= m_ps;
      }
   
private:
      Status 
*m_ps;
}

使用IOC的好處是帶來了更強(qiáng)大的靈活性,但是帶來的問題就是調(diào)用者麻煩了(天下沒有免費(fèi)的午餐阿)

List8
int main()
{
   Status s;
   User u;
   u.setStatus(
&s);
   u.fun();
   
return 0;
}

好像一切又返樸歸真,似乎并沒有帶來什么簡(jiǎn)單。有的時(shí)候簡(jiǎn)單和靈活性就是死對(duì)頭。

為了簡(jiǎn)化用戶進(jìn)行手工注入,IOC容器出現(xiàn),在Java世界里面,最著名的莫過于Spring了.IOC容器就像一個(gè)巨大的創(chuàng)建工廠,她可以使用xml來配置這些,這真的是一場(chǎng)革命。

<beans>
    
<bean id="status" class="Status">
    
</bean>

    
<bean id="user" class="User">
        
<property name="status"><ref bean="status"/></property>
    
</bean>
</beans>
Spring就是這樣把注入的工作移到配置文件中去,提供了強(qiáng)大的靈活性和可配置性


但是由于c/c++ 不具備的java那么多運(yùn)行期的類型識(shí)別和反射的功能,所以我目前還沒有發(fā)現(xiàn)有在C++中使用的IOC容器,如果你知道,請(qǐng)告訴我

那么如果是C++怎么來使注入變得簡(jiǎn)單一點(diǎn)呢,可以使用工廠方法了

List9
User * createUser(Status &s,Status2 &s2)
{
   User 
*user = new User();
   user
->setStatus(s);
   user
->setStatus2(s2);
   
return user;
}


總結(jié):
其實(shí)軟件的設(shè)計(jì)根本就沒有所謂的黃金法則,沒有免費(fèi)的午餐,你在獲得更強(qiáng)大的靈活性,往往都得到復(fù)雜性的附加效果。如果你就是寫一個(gè)自己玩的小游戲,ok,你就是用全局變量。如果你要設(shè)計(jì)龐大的Office,那你就沒有辦法把代碼寫的很簡(jiǎn)單,因?yàn)槟阋紤]的東西多了,可維護(hù)性,可測(cè)試性。

Feedback

# re: 從全局變量到IOC模式  回復(fù)  更多評(píng)論   

2006-02-11 16:24 by 3×7=51
文章寫得不錯(cuò),cppblog首頁上的大部分文章如果都能象這篇文章這樣言之有物就好了。

# re: 從全局變量到IOC模式  回復(fù)  更多評(píng)論   

2006-03-13 22:02 by fiestay
真的很不錯(cuò),希望能看到更多精彩文章:)

# re: 從全局變量到IOC模式  回復(fù)  更多評(píng)論   

2006-05-17 10:12 by Roger
寫得不錯(cuò)
不過spring用xml來配置帶來了一個(gè)不方便的地方,就是沒辦法進(jìn)行重構(gòu),xml hell.

# re: 從全局變量到IOC模式  回復(fù)  更多評(píng)論   

2008-01-11 10:40 by thh
http://code.google.com/p/pococapsule/

c++ 的ioc,我也是剛剛看到

# re: 從全局變量到IOC模式  回復(fù)  更多評(píng)論   

2009-02-13 16:20 by aztack
好文

# re: 從全局變量到IOC模式  回復(fù)  更多評(píng)論   

2009-03-31 11:10 by 1234
看上去有點(diǎn)意思,但實(shí)際上完全沒講到點(diǎn)子上

依賴注入、控制反轉(zhuǎn)~
什么是依賴?誰依賴誰?如何注入?
什么是控制?誰控制誰?為何稱為反轉(zhuǎn)?

請(qǐng)找經(jīng)典文章仔細(xì)研究

# re: 從全局變量到IOC模式  回復(fù)  更多評(píng)論   

2009-09-17 14:37 by tom zhou
PocoCapsule/C++ IoC and DSM Framework
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产有码一区二区| 欧美大片在线看免费观看| 欧美色道久久88综合亚洲精品| 久久久女女女女999久久| 狠狠综合久久| 亚洲成人在线视频播放 | 亚洲精品一区二区三区四区高清 | 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲一区二区在线播放| 国产精品久久久久影院亚瑟| 亚洲综合清纯丝袜自拍| 欧美亚洲在线| 最新国产精品拍自在线播放| 亚洲免费电影在线观看| 国产精品你懂的| 久久综合国产精品| 欧美精品性视频| 久久精品亚洲热| 在线观看久久av| 国产一区二区三区电影在线观看| 亚洲日本成人女熟在线观看| 亚洲国产日韩欧美在线99| 欧美呦呦网站| 日韩一区二区电影网| 亚洲色诱最新| 亚洲国产精品久久久久| 久久久999成人| 免费在线观看精品| 在线欧美视频| 亚洲一区二区三区高清不卡| 欧美日韩成人在线观看| 久久精品人人做人人爽| 亚洲一区二区三区精品在线观看| 欧美激情亚洲视频| 久久久久欧美| 国产精品国产三级欧美二区| 欧美成人午夜激情在线| 美女91精品| 欧美一区二区精品久久911| 一区二区三区视频观看| 91久久精品国产| 亚洲国产你懂的| 国产一区二区三区四区五区美女 | 国产美女精品一区二区三区| 亚洲第一页在线| 国产日韩欧美夫妻视频在线观看| 亚洲欧美日韩一区二区| 99精品视频免费在线观看| 亚洲高清激情| 久久久国产视频91| 久久久久久夜| 国产精品一区二区三区四区五区| 欧美一区二区三区视频免费播放| 亚洲综合精品自拍| 中文成人激情娱乐网| 免费一级欧美片在线观看| 久久综合久久综合久久综合| 老色鬼精品视频在线观看播放| 亚洲人屁股眼子交8| 久久精品亚洲一区二区三区浴池| 亚洲第一久久影院| 久久免费午夜影院| 美脚丝袜一区二区三区在线观看| 美女脱光内衣内裤视频久久影院 | 国内自拍一区| 久久成人精品视频| 久久男女视频| 亚洲二区在线| 欧美成人激情视频| 亚洲人午夜精品免费| 国产伦精品一区二区| 亚洲一区二区三区中文字幕| 亚洲神马久久| 国产精品视频免费观看www| 亚洲在线观看免费| 性xx色xx综合久久久xx| 国产日韩欧美另类| 欧美在线中文字幕| 欧美成人一区二区三区在线观看| 欧美电影免费观看大全| 国产精品久久久久久久久免费樱桃| 亚洲女爱视频在线| 欧美日韩一区在线观看视频| 亚洲婷婷在线| 久久久久九九视频| 美女亚洲精品| 日韩西西人体444www| 欧美午夜视频网站| 亚洲国产高清一区二区三区| 国产九九精品| 久久国产精品99国产精| 欧美黄色片免费观看| 夜夜嗨av色一区二区不卡| 久久国产精品72免费观看| 欧美激情按摩| 国产农村妇女毛片精品久久莱园子 | 欧美在线一二三| 亚洲电影免费在线| 99re热这里只有精品视频 | 久久国产一区二区三区| 亚洲国产精品第一区二区三区 | 久久伊人免费视频| 亚洲精品视频一区二区三区| 国产精品久久7| 久久综合久色欧美综合狠狠| 一本色道88久久加勒比精品 | 欧美午夜视频网站| 久久永久免费| 亚洲一二三四区| 亚洲国产视频a| 老司机免费视频一区二区三区 | 欧美日韩国产色视频| 亚洲国产一区二区a毛片| 小嫩嫩精品导航| 一区二区三区久久久| 欧美久久综合| 久久精品国产欧美激情| 亚洲一区二区高清| 久久精品国产清自在天天线| 亚洲美女在线观看| 亚洲福利视频网| 国产亚洲欧美日韩一区二区| 国产精品成人观看视频免费| 欧美国产综合一区二区| 久久婷婷久久| 亚洲电影第三页| 麻豆乱码国产一区二区三区| 欧美一区二区在线免费观看 | 久久成年人视频| 亚洲午夜精品视频| av72成人在线| 99综合视频| 夜久久久久久| 欧美自拍偷拍午夜视频| 亚洲一区在线免费| 国产精品99久久99久久久二8 | 亚洲欧美三级在线| 亚洲精品少妇30p| 亚洲国产精品传媒在线观看| 韩日成人av| 在线日韩欧美视频| 亚洲成色www久久网站| 伊人久久大香线| 亚洲国产成人91精品| 亚洲福利视频一区| 99精品国产一区二区青青牛奶| 欧美三级小说| 国产精品福利av| 国产九九精品视频| 国内精品视频666| 亚洲国产精品t66y| 亚洲精品一区二区在线| 国产精品任我爽爆在线播放 | 亚洲人成毛片在线播放女女| 亚洲国产美女| 一区二区三区视频观看| 午夜亚洲性色视频| 久久久久久久999精品视频| 亚洲精品影院| 亚洲午夜激情| 久久精品色图| 欧美激情偷拍| 久久亚洲一区二区三区四区| 一本色道久久精品| 午夜精品成人在线| 久久久精品免费视频| 亚洲女人天堂成人av在线| 亚洲黄色av一区| 一区二区三区 在线观看视频 | 久久婷婷影院| 欧美激情国产日韩| aaa亚洲精品一二三区| 久久福利影视| 欧美日韩一区在线视频| 韩国成人精品a∨在线观看| 最新日韩在线| 欧美在线视频观看免费网站| 欧美成人精品一区| 亚洲一级免费视频| 另类av导航| 国产欧美三级| 一区二区高清视频在线观看| 久久国产精品99国产精| 亚洲国产高清在线观看视频| 午夜精品久久久久久99热| 亚洲网站视频福利| 美女免费视频一区| 国产精品欧美久久| 国产精品福利网站| 欧美日韩在线播放三区四区| 欧美精品一区二区三| 嫩草伊人久久精品少妇av杨幂| 久久久久久999| 国产精品网站在线| 一区二区激情视频| 欧美激情精品久久久久久大尺度| 欧美不卡视频一区| 香蕉久久夜色| 国产精品一二三视频| 在线视频亚洲一区|