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

小明思考

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

從全局變量到IOC模式

Posted on 2006-01-20 17:23 小明 閱讀(4971) 評論(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>
            在线视频精品一| 国产日韩精品视频一区二区三区 | 亚洲高清自拍| 国产欧美大片| 欧美激情1区2区3区| 亚洲高清av| 狂野欧美一区| 欧美自拍偷拍午夜视频| 久久成人羞羞网站| 国产精品国产三级国产| 亚洲小说欧美另类社区| 欧美制服丝袜| 亚洲国产精品久久久久婷婷884| 尤物精品国产第一福利三区| 欧美一区二区在线观看| 欧美激情一区二区三区在线视频观看| 亚洲人成77777在线观看网| 国产日韩欧美视频| 国产精品入口尤物| 国产伦精品一区二区三区高清版 | 欧美一区二区三区视频免费| 亚洲人成亚洲人成在线观看| 欧美国产丝袜视频| 亚洲欧洲一区二区在线播放 | 国产精品亚洲美女av网站| 欧美激情一区二区三区全黄| 欧美成人日韩| 欧美网站大全在线观看| 国产欧美日韩三级| 红桃视频一区| 亚洲片国产一区一级在线观看| 亚洲人屁股眼子交8| 一区二区激情| 99热精品在线| 亚洲一区二区在线免费观看| 欧美一级久久久| 玖玖玖免费嫩草在线影院一区| 欧美成va人片在线观看| 99精品欧美一区二区蜜桃免费| 在线一区二区日韩| 久久久亚洲国产美女国产盗摄| 欧美高清影院| 国产色综合网| 一区二区三区|亚洲午夜| 亚洲免费一区二区| 能在线观看的日韩av| 99国产精品自拍| 久久视频在线视频| 亚洲国产婷婷| 久久成人18免费网站| 欧美日韩国产亚洲一区| 好吊日精品视频| 亚洲午夜久久久久久尤物| 欧美午夜不卡在线观看免费| 亚洲黄色性网站| 亚洲午夜精品国产| 免播放器亚洲| 狠狠入ady亚洲精品| 一区二区日韩精品| 麻豆国产精品一区二区三区| 一区二区三区视频在线| 美国成人毛片| 狠狠入ady亚洲精品经典电影| 国产精品99久久久久久人| 亚洲五月婷婷| 欧美成人免费播放| 欧美伊人久久久久久久久影院| 你懂的成人av| 狠狠久久五月精品中文字幕| 亚洲影院免费| 亚洲一区二区欧美日韩| 亚洲国产清纯| 免费在线观看精品| 1024精品一区二区三区| 久久精品国产第一区二区三区| 亚洲最新视频在线| 欧美精品在线观看| 91久久久国产精品| 欧美粗暴jizz性欧美20| 宅男精品导航| 国产日韩精品综合网站| 亚洲欧美www| 一本久道久久久| 欧美三级乱码| 亚洲一区亚洲二区| 亚洲一区二区三区777| 国产精品成人免费| 小黄鸭精品密入口导航| 亚洲夜晚福利在线观看| 国产精品久久久久婷婷| 亚洲一级影院| 亚洲在线成人| 国产香蕉97碰碰久久人人| 久久精品国产久精国产一老狼| 亚洲欧美日韩在线高清直播| 国产精品午夜国产小视频| 亚洲精品国产精品久久清纯直播 | 欧美一级二区| 亚洲欧美成人在线| 国产精品一区在线观看| 欧美一进一出视频| 午夜亚洲一区| 在线观看中文字幕不卡| 亚洲午夜在线观看| 亚洲国产日韩在线一区模特| 欧美视频日韩| 久久躁日日躁aaaaxxxx| 欧美/亚洲一区| 亚洲欧美电影院| 亚洲欧洲精品一区二区三区波多野1战4| 久久久一二三| 国产亚洲综合精品| 亚洲午夜在线观看| 亚洲日韩欧美视频| 欧美成人午夜视频| 美国成人直播| 亚洲精品色婷婷福利天堂| av成人天堂| 日韩视频在线观看免费| 亚洲三级性片| 欧美成人dvd在线视频| 亚洲日本一区二区三区| 亚洲精品免费网站| 国产有码在线一区二区视频| 亚洲国产99| 国产精品综合不卡av| 欧美国产欧美综合| 欧美私人啪啪vps| 久久久久www| 欧美日韩国产一级| 久久久www免费人成黑人精品 | 亚洲午夜女主播在线直播| 亚洲性视频h| 亚洲精品乱码久久久久久黑人| 中文精品视频| 亚洲免费黄色| 久久九九全国免费精品观看| 亚洲天天影视| 欧美高清在线| 欧美激情一区二区| 欧美精品久久99| 亚洲视频导航| 性欧美18~19sex高清播放| 最近中文字幕日韩精品 | 在线精品在线| 欧美一区二区三区视频| 精品91视频| 亚洲男女自偷自拍| 亚洲制服欧美中文字幕中文字幕| 欧美成人综合在线| 欧美不卡高清| 韩日在线一区| 久久久噜噜噜久久人人看| 欧美中文字幕不卡| 亚洲另类春色国产| 亚洲一区二区三区激情| 欧美日韩成人一区二区三区| 欧美激情第3页| 亚洲国产一区二区三区青草影视 | 久久国产一区二区三区| 久久爱另类一区二区小说| 亚洲欧美日韩在线综合| 亚洲欧美成人在线| 亚洲欧美日韩视频二区| 久久看片网站| 欧美成人久久| 欧美理论电影在线播放| 亚洲视频免费在线| 欧美久久久久久久| 欧美激情精品久久久六区热门 | 一区二区三区四区蜜桃| 欧美精品三级在线观看| 亚洲国产精品尤物yw在线观看| 亚洲国产欧美日韩另类综合| 久热精品视频在线观看一区| 欧美成人精品三级在线观看| 红桃视频一区| 免费日韩视频| 日韩视频免费观看高清完整版| 99re66热这里只有精品4| 久久久不卡网国产精品一区| 欧美不卡高清| 亚洲午夜在线| 国产欧美日韩综合一区在线播放| 欧美在线不卡| 久久精品国产一区二区电影| 国产精品国产三级国产专播精品人| 99视频精品免费观看| 欧美一区二区啪啪| 国产精品yjizz| 西西人体一区二区| 欧美成人精品高清在线播放| 一区二区三区日韩在线观看| 国产精品入口尤物| 蜜桃伊人久久| 亚洲一区二区少妇| 亚洲国产免费| 国产美女扒开尿口久久久| 夜夜狂射影院欧美极品| 久久综合激情|