寫程序,做產(chǎn)品,過日子

          成功其實很簡單,就是強迫自己堅持下去

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            69 Posts :: 1 Stories :: 92 Comments :: 0 Trackbacks

          Spring和AOP像一個強力的粘合劑,將完全獨立開發(fā)的組件(或說是模塊,下同)粘合成一個有機的,完整的,可擴展的系統(tǒng)。正是有了這個粘合劑的幫助,才實現(xiàn)了比較徹底的獨立組件開發(fā)。

          說它是“比較徹底”,是因為它極大的減少了組件之間的依賴。在你開發(fā)一個組件時,基本上不會因為其它組件沒有開發(fā)完成,或出現(xiàn)Bug而影響到你的進度。

          但是,它并沒有完全消除開發(fā)時組件之間的依賴,你仍然得依賴于其它組件提供的API接口。為此,我們不得不把一個組件拆成兩個jar包:一個component-api.jar,一個component-impl.jar。由于api包內(nèi)全是公用接口和Value Object,所以它相對穩(wěn)定,可以早早的提供出來。這樣,一個組件如果要使用另一個組件的服務,在開發(fā)階段,只須依賴于api包即可。運行時,Spring再根據(jù)服務提供組件的配置信息找到正確的實現(xiàn)類。

           

          昨天,我們在一個討論會上發(fā)現(xiàn)了一個有趣的問題:

          組件UIA是一個UI組件,它要求提供一些數(shù)據(jù),于時它把自己的要求寫時接口ProviderA中。組件C1和C2是兩個不同的業(yè)務組件,它們的UI中都有使用UIA這個組件,而它們都提供了自己的數(shù)據(jù)接口ServiceC1和ServiceC2。

          ProviderA所要求的方法,在ServiceC1和ServiceC2中都有提供。這個時候怎么做才能使各個組件完獨立呢。

          一、讓ServiceC1和ServiceC2繼承于ProviderA。但是這樣將導致業(yè)務組件依賴于UI組件。有誰知道一共有多少個UI組件需要依賴啊?而且UI組件是最易變的。

          二、把ProviderA從uia.jar抽出來,放到單獨的uia-api.jar中。這個就未免小題大做了。一個系統(tǒng)少說也有幾十個UI組件,難道要生成上百個jar包不成?

          三、把所有的UI的要求的API都抽出來,放到一個ui-api.jar中。這樣jar包是少了,可是單個的UI組件就失去獨立性了。

          上面三個方案,不管怎么管理UI組件的接口,都沒有解決業(yè)務組件依賴于不定數(shù)目的UI組件這個問題。

           

          最后,我們采用的方法是:把UI組件視為某個業(yè)務組件的子組件,UI組件自己不定義接口。所有對外的接口和對UI的接口,都放在業(yè)務組件的api包中。

          這樣做,業(yè)務組件和UI組件都依賴于api包,互相之間沒有依賴。當然,這樣做,UI組件就不能游離于大的業(yè)務組件之外。而我們采用這個方案的原因也在于,我們認定為多個組件提供服務的UI組件是很少的。

           

          顯然我們采用的方法只是就事論事的一個折衷方案。并沒有解決服務提供者和消費者之間的交叉依賴。

          要解決這種交叉依賴,我的思路是再提供一個接口之間的粘合機制。消費者定義自己要求的服務接口,提供者定義自己提供的服務接口。最后用一個配置文件,將二者粘合起來。

          目前,Spring還沒有提供這種功能。

          posted on 2007-05-11 10:00 Welkin Hu 閱讀(1209) 評論(9)  編輯  收藏 所屬分類: Java

          Feedback

          # re: Spring斷想:接口粘合[未登錄] 2007-05-11 10:36 小木
          哥們兒說的不錯啊,頂一個  回復  更多評論
            

          # re: Spring斷想:接口粘合 2007-05-11 10:37 dennis
          接口之間的黏合?我覺的這里的場景應該是adapter模式應用的地方  回復  更多評論
            

          # re: Spring斷想:接口粘合 2007-05-11 13:05 Welkin Hu
          @dennis
          Adapter模式仍然是用java類和接口來表達的,它沒法完全消除開發(fā)時的依賴。  回復  更多評論
            

          # re: Spring斷想:接口粘合 2007-05-11 16:37 fullqin
          apache下的hivemind是基于接口粘合,可以去看看  回復  更多評論
            

          # re: Spring斷想:接口粘合 2007-05-11 18:00 dennis
          @Welkin Hu
          依賴轉移到xml文件,轉移到火星,它仍然存在。我一直覺的xp的簡單原則是對這種場景的最好考量。依賴這個東西不可能消除,再深究下去就over-engineering了。我們講松耦合,而不是“無”耦合。  回復  更多評論
            

          # re: Spring斷想:接口粘合 2007-05-11 20:57 Welkin Hu
          @dennis
          你的觀點我是贊同的。即便Spring真的提供了這個功能,我們在使用時也會審慎的考較它:是真的節(jié)省開發(fā)成本了,還是增加開發(fā)成本了?
          如果有限度的,謹慎的使用接口粘合特性,應當是節(jié)省開發(fā)成本的。如果大張旗鼓的用,那十有八九是增加成本。
          我只是覺得對于我在文章中所舉的案例,確是一個需要接口粘合機制的東東。

          @fullqin
          真是只有想不到,沒有做不到。以前零星聽聞過Hivemind的大名。有機會一定研究一把。  回復  更多評論
            

          # re: Spring斷想:接口粘合 2007-05-13 04:41 wolfsquare
          說得不是很清楚,但我直覺這樣的問題不是來自于依賴,而是設計方案導致的。
          【組件C1和C2是兩個不同的業(yè)務組件,它們的UI中都有使用UIA這個組件】
          從這個情形來看,后面的業(yè)務組件C1和C2其實應該是組合出來或是繼承出來,
          而從經(jīng)驗的角度看,可能以組合的方式更靈活一些。  回復  更多評論
            

          # re: Spring斷想:接口粘合 2007-05-14 09:10 Coffee and Tea
          這是語言的問題,動態(tài)語言接口不必靜態(tài)聲明,因此就不需要有獨立的接口jar包。
          但是這也有兩面性,如果缺少編譯時檢測,那么必須要加強其他手段防止接口錯誤,比如持續(xù)集成。  回復  更多評論
            

          # re: Spring斷想:接口粘合 2007-05-14 09:19 Welkin Hu
          @Coffee and Tea
          嘻嘻,我的想法就是想給Java加點兒動態(tài)特性。當然,前提是不影響性能。  回復  更多評論
            

          主站蜘蛛池模板: 景东| 和龙市| 林州市| 乌拉特后旗| 离岛区| 深圳市| 河间市| 潜山县| 囊谦县| 宜城市| 松滋市| 澄江县| 华坪县| 拉萨市| 运城市| 来安县| 金山区| 静乐县| 正宁县| 桂林市| 南昌市| 涡阳县| 汽车| 来宾市| 青田县| 苗栗市| 南木林县| 毕节市| 九台市| 都匀市| 兖州市| 泾川县| 嘉善县| 涟源市| 报价| 冀州市| 鹤岗市| 海阳市| 岳阳县| 特克斯县| 都昌县|