Vincent

          Vicent's blog
          隨筆 - 74, 文章 - 0, 評論 - 5, 引用 - 0
          數(shù)據(jù)加載中……

          對象傳遞和信息完整性

          ??? 很少有孤立存在的實體對象,它們之間總是會有所關(guān)聯(lián)。對象們因其職責(zé)而分離,又因其聯(lián)系而聚合。而我們在使用對象時,往往不需要把對象及其聚合的所有其他對象一次性全部初始化,部分的對象聚合足以提供足夠的信息了。這時候,我們使用的對象的信息是不完整的。

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

          ?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。這個方案面向?qū)ο蟛⒔鉀Q了一致性問題,但增加性能成本。在Process1.method1中l(wèi)oadObjRef2,不夠面向?qū)ο螅黾恿司S護成本。
          ???
          ??? 盡可能不使用這種鏈式的處理,代之以扁平的、可以總控Obj的方式:
          ???
          ?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),有一個統(tǒng)一的處理合理的,但內(nèi)部的復(fù)雜性還是很高。

          posted on 2006-08-24 15:44 Binary 閱讀(282) 評論(0)  編輯  收藏 所屬分類: OOA/OOD


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 长寿区| 天祝| 吐鲁番市| 房山区| 犍为县| 青河县| 海伦市| 旌德县| 成武县| 湘潭县| 自治县| 白河县| 花垣县| 讷河市| 繁昌县| 汾阳市| 屏山县| 平和县| 高陵县| 慈溪市| 靖远县| 济宁市| 视频| 长丰县| 南华县| 邮箱| 东阳市| 遂溪县| 自治县| 永登县| 双鸭山市| 苍山县| 新乡市| 郸城县| 广宁县| 安乡县| 富裕县| 满洲里市| 泗阳县| 调兵山市| 盖州市|