潛魚(yú)在淵

          Concentrating on Architectures.

          posts - 77, comments - 309, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
              很少有孤立存在的實(shí)體對(duì)象,它們之間總是會(huì)有所關(guān)聯(lián)。對(duì)象們因其職責(zé)而分離,又因其聯(lián)系而聚合。而我們?cè)谑褂脤?duì)象時(shí),往往不需要把對(duì)象及其聚合的所有其他 對(duì)象一次性全部初始化,部分的對(duì)象聚合足以提供足夠的信息了。這時(shí)候,我們使用的對(duì)象的信息是不完整的。

              當(dāng)具有不完整信息的對(duì)象被做為參數(shù)傳遞時(shí),很可能導(dǎo)致我們對(duì)對(duì)象失去控制。部分對(duì)象的聚合在不同情景下的切換可能導(dǎo)致編程上的錯(cuò)誤,而且對(duì)系統(tǒng)的維護(hù)帶來(lái) 負(fù)面的影響。由于對(duì)象職責(zé)的分割,對(duì)象本身無(wú)法理解這個(gè)問(wèn)題,我們無(wú)法通過(guò)對(duì)對(duì)象本身進(jìn)行處理(如增加職責(zé))來(lái)消除這種不良影響。如何使用對(duì)象的部分信息 是由使用者根據(jù)情景要求決定的,編碼人員往往對(duì)使用情景沒(méi)有深刻的認(rèn)識(shí)。在連續(xù)對(duì)應(yīng)不同情景的處理鏈中,容易導(dǎo)致編碼錯(cuò)誤。如下:

           1// Entity objects.
           2public class Obj {
           3  private ObjRef1 ref1;
           4  Private ObjRef2 ref2;
           5
           6  public Obj() {
           7  }
           8
           9  public Obj(ObjRef1 ref1) {
          10    this.ref1 = ref1;
          11  }
          12
          13  public Obj(ObjRef1 ref1, ObjRef2 ref2) {
          14    this.ref1 = ref1;
          15    this.ref2 = ref2;
          16  }
          17  // Accessors omitted.
          18} // ObjRef1, ObjRef2 omitted.
          19
          20// Process1
          21public class Prs1 {
          22  public Obj method1() {
          23    Obj obj = new Obj();
          24    obj.setObjRef1(loadObjRef1());
          25    // Do something to obj.
          26    return obj;
          27  }
               // Load method omitted.
               private ObjRef1 loadObjRef1() {
                 // ......
               }
          28}
          29
          30// Process2
          31public class Prs2 {
          32  public void method2() {
          33    Obj obj = new Clt1().method1();
          34    // Do something to obj.ref2. Coding error may be found until debug phase.
          35  }
          36}

              在Process1.method1方法中持久化Obj,在Process2.method2中自行初始化Obj。這個(gè)方案面向?qū)ο蟛⒔鉀Q了一致性問(wèn)題, 但增加性能成本。在Process1.method1中l(wèi)oadObjRef2,不夠面向?qū)ο螅黾恿司S護(hù)成本。
             
              盡可能不使用這種鏈?zhǔn)降奶幚恚员馄降摹⒖梢钥偪豋bj的方式:
             
           1public class Process {
           2  public void proceed() {
           3    // Need to change Prs1, Prs2's method signatures.
           4    Obj obj = 
           5    obj = new Prs1().method1(obj);
           6    obj.setObjRef2();
           7    obj = new Prs2().method2(obj);
           8    
           9    // Future processes can be inserted anywhere inside this method.
          10  }
          11}


              對(duì)于樹(shù)形結(jié)構(gòu)或整體-部分結(jié)構(gòu),有一個(gè)統(tǒng)一的處理合理的,但內(nèi)部的復(fù)雜性還是很高。

          評(píng)論

          # re: 對(duì)象的部分聚合問(wèn)題  回復(fù)  更多評(píng)論   

          2005-12-06 10:06 by 小明
          樓主不會(huì)不知道Spring framework吧?

          Spring IOC能很好幫助你解決這個(gè)問(wèn)題阿

          # re: 對(duì)象的部分聚合問(wèn)題  回復(fù)  更多評(píng)論   

          2005-12-06 11:43 by 無(wú)言獨(dú)上西樓
          本質(zhì)上說(shuō),IOC并沒(méi)有什么新鮮玩意,就是強(qiáng)化對(duì)接口編程。SPRING是提供了一個(gè)這樣的框架-裝配對(duì)象的框架,這樣,任何相同接口的對(duì)象就可以裝配在一起工作,類似于汽車裝配線。
          但顯然沒(méi)有明白LZ的意思。坦率地說(shuō),我也沒(méi)有明白LZ的意思。

          # re: 對(duì)象傳遞和信息完整性  回復(fù)  更多評(píng)論   

          2005-12-07 00:13 by 非魚(yú)
          前面描述的不好,給大家造成了理解上的麻煩。希望這次改過(guò)后表達(dá)足夠清楚。不行就再改吧。
          主站蜘蛛池模板: 南昌市| 离岛区| 齐河县| 新干县| 桐乡市| 日土县| 尤溪县| 湾仔区| 辉南县| 彭山县| 秦安县| 南涧| 兴和县| 孝感市| 玉林市| 拉萨市| 安仁县| 克拉玛依市| 贺州市| 防城港市| 北流市| 沂源县| 阜阳市| 伊金霍洛旗| 卓资县| 宝兴县| 新安县| 芜湖市| 龙陵县| 泰兴市| 隆昌县| 宝坻区| 鹤峰县| 石林| 舒兰市| 日照市| 南涧| 邢台县| 新巴尔虎右旗| 张掖市| 林周县|