潜鱼在渊

Concentrating on Architectures.

posts - 77, comments - 309, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

对象传递和信息完整性

Posted on 2005-12-05 17:56 非鱼 阅读(960) 评论(3)  编辑  收藏 所属分类: 面向对象设计
    很少有孤立存在的实体对象,它们之间总是会有所关联。对象们因其职责而分离,又因其联系而聚合。而我们在使用对象时,往往不需要把对象及其聚合的所有其他 对象一次性全部初始化,部分的对象聚合足以提供足够的信息了。这时候,我们使用的对象的信息是不完整的。

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

 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}


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

评论

# re: 对象的部分聚合问题  回复  更多评论   

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

Spring IOC能很好帮助你解决这个问题阿

# re: 对象的部分聚合问题  回复  更多评论   

2005-12-06 11:43 by 无言独上西楼
本质上说,IOC并没有什么新鲜玩意,就是强化对接口编程。SPRING是提供了一个这样的框架-装配对象的框架,这样,任何相同接口的对象就可以装配在一起工作,类似于汽车装配线。
但显然没有明白LZ的意思。坦率地说,我也没有明白LZ的意思。

# re: 对象传递和信息完整性  回复  更多评论   

2005-12-07 00:13 by 非鱼
前面描述的不好,给大家造成了理解上的麻烦。希望这次改过后表达足够清楚。不行就再改吧。

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


网站导航: