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

小明思考

高性能服務器端計算
posts - 70, comments - 428, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

從全局變量到IOC模式

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

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

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

既然我們認識到全局變量的問題,怎么改進呢?
代碼1中由于有三個變量,如果有更多的,就更麻煩,我們可以這樣改進
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;
請注意到這里的lua_open方法,這其實是一種創建自己的工廠方法。不使用全局變量的好處就是,我們保留了可以創建多個對象的自由。

時代在發展,進入C++時代,但是全局變量仍然有人在用,存在就是合理的。GOF提出一種設計模式叫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 創建它,保證了對象的唯一性(注意:Meyer singleton并不具有多線程安全,可能導致多次初始化對象)

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

這時候所謂的IOC思想(Inversion of Control,即反轉模式)出來了,簡單的來說,就是通過構造函數或者set方法實現注入

List6 - 構造函數注入
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的好處是帶來了更強大的靈活性,但是帶來的問題就是調用者麻煩了(天下沒有免費的午餐阿)

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

好像一切又返樸歸真,似乎并沒有帶來什么簡單。有的時候簡單和靈活性就是死對頭。

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

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

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


但是由于c/c++ 不具備的java那么多運行期的類型識別和反射的功能,所以我目前還沒有發現有在C++中使用的IOC容器,如果你知道,請告訴我

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

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


總結:
其實軟件的設計根本就沒有所謂的黃金法則,沒有免費的午餐,你在獲得更強大的靈活性,往往都得到復雜性的附加效果。如果你就是寫一個自己玩的小游戲,ok,你就是用全局變量。如果你要設計龐大的Office,那你就沒有辦法把代碼寫的很簡單,因為你要考慮的東西多了,可維護性,可測試性。

Feedback

# re: 從全局變量到IOC模式  回復  更多評論   

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

# re: 從全局變量到IOC模式  回復  更多評論   

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

# re: 從全局變量到IOC模式  回復  更多評論   

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

# re: 從全局變量到IOC模式  回復  更多評論   

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

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

# re: 從全局變量到IOC模式  回復  更多評論   

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

# re: 從全局變量到IOC模式  回復  更多評論   

2009-03-31 11:10 by 1234
看上去有點意思,但實際上完全沒講到點子上

依賴注入、控制反轉~
什么是依賴?誰依賴誰?如何注入?
什么是控制?誰控制誰?為何稱為反轉?

請找經典文章仔細研究

# re: 從全局變量到IOC模式  回復  更多評論   

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>
            久久国产精品久久久久久久久久| 欧美一区二区三区免费看 | 国产精品网站一区| 9久草视频在线视频精品| 你懂的视频欧美| 欧美刺激性大交免费视频 | 国产乱码精品一区二区三区五月婷| 亚洲一区二区三区四区中文| 亚洲一级黄色| 在线观看中文字幕不卡| 欧美黄在线观看| 欧美日韩网站| 久久aⅴ国产紧身牛仔裤| 欧美在线看片| 亚洲三级毛片| 在线一区二区日韩| 国产伦精品一区二区三区高清| 欧美专区在线观看一区| 久久久久久高潮国产精品视| 亚洲黄色一区二区三区| 最新日韩在线视频| 欧美午夜精品久久久久久超碰| 欧美在线免费视频| 美脚丝袜一区二区三区在线观看| 一区二区91| 亚洲欧美另类综合偷拍| 伊伊综合在线| 亚洲精品综合| 国内外成人免费激情在线视频网站 | 嫩草国产精品入口| 亚洲视屏一区| 久久综合999| 午夜精品久久久| 欧美波霸影院| 久久嫩草精品久久久久| 蜜桃av一区二区| 久久九九国产精品| 欧美精品日韩综合在线| 久久久久久久波多野高潮日日| 欧美激情一区二区三区蜜桃视频 | 欧美在线不卡视频| 免费日韩成人| 久久久久国产精品一区三寸| 欧美日韩999| 欧美国产综合视频| 国产九九精品视频| 亚洲精品视频啊美女在线直播| 狠狠爱成人网| 亚洲视频免费在线| 亚洲国产高清高潮精品美女| 亚洲欧美另类在线| 中文欧美在线视频| 你懂的网址国产 欧美| 欧美综合国产精品久久丁香| 国产精品夫妻自拍| 亚洲精品在线视频观看| 亚洲国产精品ⅴa在线观看 | 中文成人激情娱乐网| 亚洲韩国青草视频| 欧美亚洲综合另类| 午夜欧美大片免费观看| 欧美视频手机在线| 亚洲国产日韩欧美在线99| 狠狠综合久久av一区二区老牛| 亚洲欧美国产精品桃花 | 精品av久久久久电影| 亚洲少妇最新在线视频| 一区二区日韩精品| 欧美日韩成人免费| 亚洲日本va午夜在线影院| 亚洲国产专区| 欧美国产日本在线| 欧美激情精品久久久久久| 影音先锋日韩资源| 久久精品最新地址| 男女激情久久| 亚洲乱码精品一二三四区日韩在线 | 久久久噜噜噜久久中文字幕色伊伊| 国产精品一区视频网站| 亚洲欧美在线一区| 老妇喷水一区二区三区| 亚洲国产你懂的| 欧美激情视频在线播放| av成人免费观看| 性色一区二区| 精品福利免费观看| 麻豆精品网站| 亚洲精选国产| 欧美在线free| 亚洲高清色综合| 欧美色综合网| 久久精品视频免费| 亚洲成色最大综合在线| 一本色道久久综合亚洲精品不卡| 欧美性事在线| 久久久www成人免费精品| 欧美激情bt| 性做久久久久久久久| 一色屋精品视频在线看| 欧美日韩国产在线观看| 亚洲永久网站| 欧美激情在线有限公司| 亚洲欧美日韩在线不卡| 在线日韩欧美| 国产精品毛片| 蜜桃伊人久久| 欧美在线观看你懂的| 亚洲卡通欧美制服中文| 久久国产色av| 亚洲一区二区三区乱码aⅴ| 国产资源精品在线观看| 欧美日韩一区二区三区视频| 久久夜色精品国产欧美乱极品 | 蜜桃av久久久亚洲精品| 一区二区三区四区国产| 国产伊人精品| 国产精品男人爽免费视频1| 久久久五月天| 欧美一区二区日韩| 日韩视频三区| 亚洲国产成人精品女人久久久| 久久av在线| 亚洲欧美日韩视频一区| 亚洲精品永久免费精品| 激情久久综艺| 狠狠色狠狠色综合日日tαg| 国产精品视频免费一区| 欧美精品黄色| 男人的天堂亚洲| 久久天天狠狠| 欧美在线日韩| 性久久久久久久久久久久| 一区二区三区三区在线| 亚洲精品国产品国语在线app| 欧美电影在线观看完整版| 久久久国产亚洲精品| 欧美在线地址| 久久国产免费看| 美女视频黄 久久| 亚洲美女91| 亚洲国产精品高清久久久| 国色天香一区二区| 国产欧美一区二区三区国产幕精品 | 亚洲黄色大片| 亚洲国产精品久久人人爱蜜臀| 欧美成人免费在线| 鲁大师成人一区二区三区| 久久精品一区二区三区中文字幕 | 久热国产精品| 久久躁日日躁aaaaxxxx| 久久综合精品国产一区二区三区| 久久在线观看视频| 欧美mv日韩mv国产网站| 蜜桃av一区二区三区| 欧美高清hd18日本| 欧美激情中文字幕乱码免费| 亚洲电影免费观看高清| 亚洲人成在线观看网站高清| 日韩手机在线导航| 一本到12不卡视频在线dvd| 亚洲小视频在线观看| 亚洲一区二区久久| 欧美在线观看网站| 噜噜噜噜噜久久久久久91| 美女视频黄a大片欧美| 欧美日韩精品在线视频| 国产精品色午夜在线观看| 国产欧美一区二区白浆黑人| 在线观看国产精品网站| 亚洲精品视频免费在线观看| 亚洲一区在线播放| 久久久www成人免费无遮挡大片| 另类图片综合电影| 亚洲欧洲午夜| 欧美亚洲视频在线看网址| 欧美成人乱码一区二区三区| 欧美日韩亚洲一区二区| 国产日韩欧美自拍| 亚洲国产综合在线看不卡| 亚洲影院免费观看| 久久免费精品日本久久中文字幕| 欧美黄在线观看| 亚洲在线一区| 欧美成人精品1314www| 国产精品亚洲一区二区三区在线| 在线免费观看日本一区| 亚洲欧美成人精品| 蜜臀99久久精品久久久久久软件| 日韩小视频在线观看专区| 西瓜成人精品人成网站| 欧美成人午夜免费视在线看片| 国产欧美一区二区色老头| 日韩亚洲欧美成人| 久久久久久夜| 亚洲视频一区| 欧美黄色片免费观看| 国内精品久久久久久影视8| 亚洲桃色在线一区| 欧美sm重口味系列视频在线观看| 亚洲自拍另类|