理論不懂就實(shí)踐,實(shí)踐不會(huì)就學(xué)理論!
昨天在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í)候是這樣的:
可見(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后是這樣的:
可見(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
我認(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)論
恩,說(shuō)的是,那個(gè)邏輯分析我寫(xiě)的是有問(wèn)題的,應(yīng)該從EP解決的問(wèn)題點(diǎn)來(lái)分析 回復(fù) 更多評(píng)論