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

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

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

    kapok

    垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      455 隨筆 :: 0 文章 :: 76 評(píng)論 :: 0 Trackbacks
    http://forum.javaeye.com/viewtopic.php?t=11418&postdays=0&postorder=asc&highlight=%CF%B5%CD%B3%BC%DC%B9%B9&start=75

    其實(shí)frankensteinlin說的一句話很對(duì):
    引用:
    這不是推卸責(zé)任嗎?

    太對(duì)了!ioc,推而廣之,OO,就是一個(gè)推卸責(zé)任的藝術(shù)。 Smile

    我曾經(jīng)說OO是一種政治掛帥的設(shè)計(jì)方法,就是指這種責(zé)任分配。

    不能越俎代庖,能推卸責(zé)任就推卸責(zé)任,這是每個(gè)參與到這個(gè)政治游戲中的模塊都應(yīng)該遵守的。

    do one thing and do one thing well.

    就是說,你要做最好只作一件事,不是兩件,也不是半件。

    當(dāng)你寫A的時(shí)候,你先要明確A的責(zé)任是什么。如果A唯一負(fù)責(zé)的就是創(chuàng)建B,好吧,你那么作沒錯(cuò)。

    但是,我的假設(shè)是,A的職責(zé)是做另外一件事(比如出差),而買票只不過是要達(dá)到這個(gè)目標(biāo)的一種實(shí)現(xiàn)方法所需要的一個(gè)前提條件。你要是自己也負(fù)責(zé)買票,你就是做了兩件事。
    當(dāng)然,什么是“一件”事的定義并不明確。如果你的買票這個(gè)動(dòng)作可以被完全封裝進(jìn)A,外界看不到,也不想看到,并且你也可以預(yù)知永遠(yuǎn)不會(huì)有其它的搞到票的方法(比如,搶票,彎腰在地上揀票,不要發(fā)票打折,中關(guān)村買假車票,買電腦附贈(zèng)車票等等),你可以選擇自己買票。(我好像曾經(jīng)就什么時(shí)候正向控制,什么時(shí)候反向給了一個(gè)大致的標(biāo)準(zhǔn)吧?)






    試著從frankensteinlin的角度理解一下。

    假設(shè)X是A的使用者,本來如果A這么設(shè)計(jì):

    java代碼: 

    A:
      A(){
        b = new B();
      }



    那么,我的X的代碼就是:

    java代碼: 

    X:
      A a = new A();
      ......




    這樣,只有A依賴B,X依賴A。


    但是如果你要ioc,A變成這樣:

    java代碼: 


    A:
      A(B b){
        this.b = b;
      }



    此時(shí),我的X豈不是要變成:

    java代碼: 

    A a = new A(new B());



    如果這樣,不是說明A要用到B這樣一個(gè)實(shí)現(xiàn)細(xì)節(jié)暴露給X了?
    而且X要使用的接口也復(fù)雜了。

    如果X是老板,那么
    引用:
    老板不應(yīng)該事事躬親!我交給你辦至于你怎么辦我就不管了

    為什么·還要我老板來給你小兵買票?到底誰(shuí)是老板啊?

    而且現(xiàn)在是X依賴A, X依賴B,A依賴B但不依賴B的創(chuàng)建。依賴也沒有減少啊!



    好。對(duì)frankensteinlin的理解敘述完畢。

    下面·我來回答,


    1。首先,還是要根據(jù)我前面給的標(biāo)準(zhǔn)分析。B是否是一個(gè)對(duì)它要實(shí)現(xiàn)的功能的一個(gè)100%標(biāo)準(zhǔn)的實(shí)現(xiàn)?它是否可能有B1, B2, ..., Bn等等不同的實(shí)現(xiàn)競(jìng)爭(zhēng)對(duì)手?

    2。如果1是true,那么A能否自己對(duì)選擇那一個(gè)B做決定?A選擇B1和B2是否都能夠給出合法的語(yǔ)義,這兩個(gè)合法的語(yǔ)義是否可能不同?
    A的設(shè)計(jì)者如何在不知道使用者意圖的時(shí)候決定采用哪個(gè)語(yǔ)義?
    比如說出差買票。中關(guān)村買假票便宜,但是風(fēng)險(xiǎn)高;去代理點(diǎn)預(yù)定價(jià)格適中,但是要提前定購(gòu),有點(diǎn)麻煩和不靈活;想走了拍拍屁股現(xiàn)場(chǎng)買票最瀟灑,但是可能價(jià)格非常高,bill gates無(wú)所謂,小業(yè)務(wù)員就別想這么奢侈了。
    其它還有買臥鋪?買軟臥?買頭等艙飛機(jī)票? 等等等等。
    這些,你A同志能否都自己決定?假如你買頭等艙,結(jié)果X窮,不買單怎么辦?
    還是說你A只給bill gates專職服務(wù),換個(gè)老板你就辭職?


    3。說到ioc把A的實(shí)現(xiàn)細(xì)節(jié)暴露給X,這也不好說。
    假設(shè)B就是一個(gè)買票的策略或者是一張票。
    首先,X是否有可能本身就想控制這個(gè)買票的策略呢?它真是A的實(shí)現(xiàn)細(xì)節(jié)嗎?
    比如bill gates同志,他老人家對(duì)下屬關(guān)懷備至,一人為本,一定要買最爽的頭等艙,那么這樣:
    java代碼: 


    BillGates:
      A = new A(new BuyMostComfortableFirstClassWithStrippers());


    不是很自然?


    其次,是有可能X不想控制這個(gè)買票策略。象你說的“老板”的情況。這個(gè)老板不在乎買票怎么買,花多少錢,就是不想過問實(shí)現(xiàn)細(xì)節(jié)的。它就是希望你把事情做好。

    但是,請(qǐng)注意,在你說new A()的時(shí)候,你等于讓老板自己尋找一個(gè)能夠出差的人再下命令。老板必須認(rèn)識(shí)A,必須自己構(gòu)造A。這,這難道就爽了?
    為什么老板自己不能直接說:“給我一個(gè)能出差的家伙”。這不是更爽?

    看看你的X的代碼,它難道不能繼續(xù)ioc?不能繼續(xù)推諉責(zé)任?它為什么要new A()?

    java代碼: 

    X:
      A a;
      X(A a){
        this.a = a;
      }



    如此,不就沒有什么實(shí)現(xiàn)細(xì)節(jié)暴露?接口不是比new A()還要簡(jiǎn)單?
    這個(gè)老板做的不是更徹底?


    至于用xml編程,我是不太喜歡的。xml配置的好處在于可以隨時(shí)修改,不用重編譯系統(tǒng)。這是operation上的好處,從軟件結(jié)構(gòu)上,依賴關(guān)系上,它和把依賴寫在java里沒什么不同。而且往往比java還要繁瑣,易錯(cuò),難維護(hù)。

    只不過,ioc并不必然意味著xml配置。把組裝代碼寫在java里也一樣是ioc。

    比如,在main()函數(shù)里,我可以自己手工組裝如下:


    java代碼: 


    A a1 = new A(new B1(new C1(), new D1()));
    A a2 = new A(new B2(new C2(), new D2()));
    ...






    這樣,程序其它地方都避免了不必要的依賴。

    確實(shí),依賴必須存在,就象你再program against interface,最終也必須new一個(gè)class一樣。ioc也不是魔術(shù),不可能把依賴變沒。
    但是依賴放在什么地方就是學(xué)問了。

    通過讓main()或者是任何一個(gè)其它的組裝模塊來單獨(dú)處理程序所有的依賴,我們實(shí)現(xiàn)了職責(zé)單一化。

    另外,如果要改動(dòng)系統(tǒng)的行為(比如從B1變成B2,或者D2改用D1),直接改動(dòng)組裝者就可。
    更重要的是,我們可以通過注射不同的零件來讓同一個(gè)組件展現(xiàn)不同的行為。
    比如,上面的main()代碼構(gòu)造了兩個(gè)A對(duì)象,這兩個(gè)A對(duì)象行為不同。但是都同時(shí)存在于程序之中。

    請(qǐng)問,你如果完全把new B()這種東西固定到A中去,怎么達(dá)到這個(gè)效果?


    至于說配置著出錯(cuò),就全完蛋了之類的話,就有點(diǎn)不知所云了。

    一個(gè)軟件系統(tǒng),如果一個(gè)模塊有bug,那么整個(gè)系統(tǒng)就是有bug。
    如果你的main()函數(shù)不工作了,那么整個(gè)程序就不工作了。

    你這里難道要轉(zhuǎn)移話題談fail over之類的事情了嗎?
    posted on 2005-06-05 22:13 笨笨 閱讀(412) 評(píng)論(1)  編輯  收藏 所屬分類: J2EEHibernateAndSpring 、ALL

    評(píng)論

    # re: Ioc吵架 2007-09-30 15:08 gembin
    Yes  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 国产一区二区免费在线| 国产精品亚洲二区在线| 五月天婷亚洲天综合网精品偷| 亚洲天堂电影在线观看| 免费专区丝袜脚调教视频| 美女又黄又免费的视频| 亚洲国产精品国自产电影| 国产在线19禁免费观看| 免费黄色福利视频| jizz免费观看| 亚洲熟妇无码一区二区三区 | 一区二区免费视频| 在线精品自拍亚洲第一区| 亚洲综合自拍成人| 亚洲综合色区在线观看| 成年女人午夜毛片免费视频| 免费一级特黄特色大片| 亚洲午夜国产精品| 亚洲成a人片在线观看无码专区 | 免费大黄网站在线观| 色噜噜狠狠色综合免费视频| 亚洲精品你懂的在线观看| 蜜臀91精品国产免费观看| 精品无码AV无码免费专区| 在线人成免费视频69国产| 一区二区免费电影| 一级成人生活片免费看| 无遮挡呻吟娇喘视频免费播放| 亚洲成av人在线观看网站| 中文字幕 亚洲 有码 在线| 亚洲天堂一区二区三区四区| 911精品国产亚洲日本美国韩国| 亚洲AV无码乱码国产麻豆| 亚洲精品国偷自产在线| 亚洲成色WWW久久网站| 无码乱人伦一区二区亚洲| 图图资源网亚洲综合网站| 亚洲AV综合色区无码另类小说| 国产亚洲精品a在线观看app| 亚洲国产精品无码久久久秋霞2| 亚洲AV无码专区国产乱码4SE|