Vincent

Vicent's blog
随笔 - 74, 文章 - 0, 评论 - 5, 引用 - 0
数据加载中……

对象传递和信息完整性

    很少有孤立存在的实体对象,它们之间总是会有所关联。对象们因其职责而分离,又因其联系而聚合。而我们在使用对象时,往往不需要把对象及其聚合的所有其他对象一次性全部初始化,部分的对象聚合足以提供足够的信息了。这时候,我们使用的对象的信息是不完整的。

    当具有不完整信息的对象被做为参数传递时,很可能导致我们对对象失去控制。部分对象的聚合在不同情景下的切换可能导致编程上的错误,而且对系统的维护带来负面的影响。由于对象职责的分割,对象本身无法理解这个问题,我们无法通过对对象本身进行处理(如增加职责)来消除这种不良影响。如何使用对象的部分信息是由使用者根据情景要求决定的,编码人员往往对使用情景没有深刻的认识。在连续对应不同情景的处理链中,容易导致编码错误。如下:

 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。这个方案面向对象并解决了一致性问题,但增加性能成本。在Process1.method1中loadObjRef2,不够面向对象,增加了维护成本。
   
    尽可能不使用这种链式的处理,代之以扁平的、可以总控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}


    对于树形结构或整体-部分结构,有一个统一的处理合理的,但内部的复杂性还是很高。

posted on 2006-08-24 15:44 Binary 阅读(272) 评论(0)  编辑  收藏 所属分类: OOA/OOD


只有注册用户登录后才能发表评论。


网站导航: