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

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

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

    IoC & Extension Point

    昨天在fog討論到這個(gè)問(wèn)題,fog認(rèn)為Extension Point是按照IoC的思路實(shí)現(xiàn)出來(lái)的,我來(lái)談?wù)勎业挠^點(diǎn),我卻認(rèn)為Extension Point并不是按照IoC思路來(lái)實(shí)現(xiàn)的,甚至可以說(shuō)兩者沒(méi)有關(guān)系。
    首先來(lái)說(shuō)說(shuō)IoC,IoC,全稱Inversion of Control,Martin Fowler認(rèn)為這個(gè)詞有些不恰當(dāng),建議改為DI,為什么呢?其實(shí)這是因?yàn)镮oC的本質(zhì)決定的,IoC是什么,其主要作用是解耦,分離關(guān)注點(diǎn),通俗點(diǎn)說(shuō)就是使得調(diào)用者和被調(diào)用者之間沒(méi)有直接的耦合,而只是接口的耦合,舉例來(lái)說(shuō):

    在沒(méi)用IoC實(shí)現(xiàn)的時(shí)候是這樣的:

    public class A{
     
     
    public void execute(){
      B b
    =new BImpl();
      b.execute();
     }


    }


    可見(jiàn)在這里造成的一個(gè)問(wèn)題就是調(diào)用者A和被調(diào)用者B的實(shí)現(xiàn)構(gòu)成了一個(gè)直接的依賴,為什么Martin Fowler要建議改名成DI呢,原因就在這了,這里造成的是抽象對(duì)實(shí)現(xiàn)的依賴,這不用說(shuō),是嚴(yán)重違反OO中依賴抽象而不依賴實(shí)現(xiàn)這一原則的,所以稱為DI確實(shí)更符合一些。

    再來(lái)看一下使用了IoC后是這樣的:

    public class A{
     
     
    private B b;

     
    public void setB(B b){
      
    this.b=b;  
     }


     
    public void execute(){
      b.execute();
     }
     

    }


    可見(jiàn)在這里調(diào)用者A和被調(diào)用者B是接口的依賴,而不是實(shí)現(xiàn)的依賴,這就實(shí)現(xiàn)了調(diào)用者對(duì)于被調(diào)用者具體實(shí)現(xiàn)依賴的解耦。
    當(dāng)然,也許諸位看官會(huì)說(shuō)可以用Factory之類的模式來(lái)實(shí)現(xiàn)對(duì)具體依賴的解耦,但那樣同樣造成一個(gè)問(wèn)題就是調(diào)用者和被調(diào)用者的Factory耦合,而在IoC中是不會(huì)有這個(gè)問(wèn)題的,調(diào)用者和被調(diào)用者之間只有清晰的接口依賴。
    根據(jù)上面這些解釋,我們可以看出IoC最大的好處在于解耦調(diào)用者對(duì)于被調(diào)用者具體實(shí)現(xiàn)的依賴。

    現(xiàn)在來(lái)說(shuō)說(shuō)Extension Point,Extension Point是Eclipse為支持Plugin擴(kuò)展而做的一種設(shè)計(jì),舉例來(lái)說(shuō)吧,在工具欄這個(gè)Plugin中,必然需要提供某種方法能使得其他Plugin可加入按鈕至工具欄中,那么該怎么去做呢,在Extension Point中是這么實(shí)現(xiàn)的,工具欄Plugin提供了一個(gè)這樣的Extension Point,其他的Plugin只需要實(shí)現(xiàn)這個(gè)Extension Point即可加入按鈕至工具欄中,工具欄的Plugin在可擴(kuò)展的地方通過(guò)對(duì)于容器中Extension Point注冊(cè)信息的獲取來(lái)取得所有實(shí)現(xiàn)了當(dāng)前Extension Point的類,并相應(yīng)的進(jìn)行調(diào)用。
    這里還是得羅嗦一下Extension Point的實(shí)現(xiàn)思路,在Eclipse中是這么做的,首先它會(huì)根據(jù)各Plugin提供的Extension Point構(gòu)成一個(gè)Extension Point的信息集合,之后根據(jù)各Plugin提供的Extension Point的實(shí)現(xiàn)構(gòu)成Extension Point Registry,而各提供了Extension Point的Plugin必然會(huì)在可擴(kuò)展的地方調(diào)用這個(gè)Registry獲取相應(yīng)實(shí)現(xiàn)了此Extension Point的集合,通過(guò)所提供的Extension Point Interface做相應(yīng)的callback來(lái)實(shí)現(xiàn)擴(kuò)展。
    首先我們來(lái)看,如果Extension Point是采用IoC思想來(lái)實(shí)現(xiàn)的,那么我們可以按照IoC思想來(lái)進(jìn)行分析,那么提供Extension Point的Plugin就是調(diào)用者,提供Extension Point實(shí)現(xiàn)的Plugin就是被調(diào)用者,按照IoC思想是為了解耦調(diào)用者對(duì)于被調(diào)用者實(shí)現(xiàn)的依賴,那么我們可以看出這個(gè)命題是不成立的,這里的關(guān)鍵在于提供Extension Point的Plugin并不依賴于實(shí)現(xiàn)Extension Point的Plugin,它才不關(guān)心哪些Plugin實(shí)現(xiàn)了它的Extension Point,沒(méi)有直接的依賴關(guān)系又何來(lái)IoC一說(shuō)。
    其次我們來(lái)看Extension Point的設(shè)計(jì)目的是為了什么?它設(shè)計(jì)的目的是為了Plugin可被擴(kuò)展,而不是說(shuō)用于解除Plugin之間依賴的問(wèn)題。
    其實(shí)Extension Point的設(shè)計(jì)思路很簡(jiǎn)單,是類似Template的模式,只是它把所有實(shí)現(xiàn)了此Template的信息都集中存儲(chǔ)了,并且由提供了Template的類去獲取了所有的這些信息,鑒于此我還是堅(jiān)持自己的觀點(diǎn)Extension Point并不是按照IoC的思想來(lái)設(shè)計(jì)的,兩者并沒(méi)什么關(guān)系。

    posted on 2005-07-15 10:47 BlueDavy 閱讀(959) 評(píng)論(2)  編輯  收藏 所屬分類: Java

    評(píng)論

    # re: IoC & Extension Point 2005-07-16 00:09 落魄的程序員

    我認(rèn)同fog的觀點(diǎn)
    而且DI和Template模式正是IoC在面向?qū)ο箢I(lǐng)域的表現(xiàn)形式
    DI和模板方法模式的區(qū)別在于
    DI用于解除創(chuàng)建依賴
    模板方法用于解除行為依賴

    你的這幾句似乎有邏輯問(wèn)題:
    “我們可以按照IoC思想來(lái)進(jìn)行分析,那么提供Extension Point的Plugin就是調(diào)用者,提供Extension Point實(shí)現(xiàn)的Plugin就是被調(diào)用者,按照IoC思想是為了解耦調(diào)用者對(duì)于被調(diào)用者實(shí)現(xiàn)的依賴,那么我們可以看出這個(gè)命題是不成立的,這里的關(guān)鍵在于提供Extension Point的Plugin并不依賴于實(shí)現(xiàn)Extension Point的Plugin”

    真是因?yàn)镋P的提供者不依賴于EP的實(shí)現(xiàn)者,所以才符合IoC的思想
    也就是組件IoC
    而不是因?yàn)镋P中沒(méi)有IoC要解耦的那種依賴所以不叫IoC

    因?yàn)樗螴oC,所以不存在IoC要解決的問(wèn)題,這個(gè)是不是有點(diǎn)繞?
    ^_^
    因?yàn)榉螴oC,所以問(wèn)題已經(jīng)被解決掉了,自然不存在了
      回復(fù)  更多評(píng)論   

    # re: IoC & Extension Point 2005-07-16 17:34 Programmer's Life

    恩,說(shuō)的是,那個(gè)邏輯分析我寫(xiě)的是有問(wèn)題的,應(yīng)該從EP解決的問(wèn)題點(diǎn)來(lái)分析  回復(fù)  更多評(píng)論   

    公告

     









    feedsky
    抓蝦
    google reader
    鮮果

    導(dǎo)航

    <2005年7月>
    262728293012
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    統(tǒng)計(jì)

    隨筆分類

    隨筆檔案

    文章檔案

    Blogger's

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 久艹视频在线免费观看| AA免费观看的1000部电影| 久久精品国产亚洲AV无码偷窥| 人与禽交免费网站视频| 亚洲AV无码AV日韩AV网站| 在线亚洲午夜理论AV大片| 天天影视色香欲综合免费| 理论亚洲区美一区二区三区| 精品亚洲综合在线第一区| 无码人妻精品一二三区免费| 国产精品极品美女自在线观看免费 | 亚洲精品视频在线看| 91老湿机福利免费体验| 国产精品亚洲精品日韩电影| 亚洲国产天堂久久综合网站| 国产精品成人无码免费| 国产好大好硬好爽免费不卡 | 日本一卡精品视频免费| 性色av极品无码专区亚洲| 亚洲伦另类中文字幕| 免费真实播放国产乱子伦| 天天影视色香欲综合免费| 一级看片免费视频| 亚洲日韩久久综合中文字幕| 好看的亚洲黄色经典| 国产精品色午夜视频免费看| 24小时在线免费视频| 久久成人永久免费播放| 亚洲av日韩综合一区二区三区| 亚洲国产精久久久久久久| 亚洲视频在线精品| 午夜毛片不卡高清免费| 日日麻批免费40分钟日本的| 99在线视频免费观看| 粉色视频在线观看www免费| 波多野结衣亚洲一级| 4480yy私人影院亚洲| 国产成人精品日本亚洲| 亚洲AV无码成H人在线观看| 成年人免费网站在线观看| 国产在线观看麻豆91精品免费|