潛魚在淵

          Concentrating on Architectures.

          posts - 77, comments - 309, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          對象傳遞和信息完整性

          Posted on 2005-12-05 17:56 非魚 閱讀(1098) 評論(3)  編輯  收藏 所屬分類: 面向?qū)ο笤O(shè)計(jì)
              很少有孤立存在的實(shí)體對象,它們之間總是會有所關(guān)聯(lián)。對象們因其職責(zé)而分離,又因其聯(lián)系而聚合。而我們在使用對象時(shí),往往不需要把對象及其聚合的所有其他 對象一次性全部初始化,部分的對象聚合足以提供足夠的信息了。這時(shí)候,我們使用的對象的信息是不完整的。

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


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

          評論

          # re: 對象的部分聚合問題  回復(fù)  更多評論   

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

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

          # re: 對象的部分聚合問題  回復(fù)  更多評論   

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

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

          2005-12-07 00:13 by 非魚
          前面描述的不好,給大家造成了理解上的麻煩。希望這次改過后表達(dá)足夠清楚。不行就再改吧。
          主站蜘蛛池模板: 赤水市| 通江县| 新竹县| 凉山| 北流市| 商城县| 石门县| 江陵县| 南皮县| 甘孜县| 鸡东县| 青冈县| 谢通门县| 平谷区| 镇巴县| 达拉特旗| 徐闻县| 洪泽县| 泗水县| 广元市| 贺州市| 渭源县| 法库县| 六安市| 林州市| 涿州市| 大兴区| 阿勒泰市| 沙雅县| 合阳县| 改则县| 曲松县| 仙桃市| 德化县| 南陵县| 略阳县| 万宁市| 桃园县| 德安县| 惠东县| 独山县|