很少有孤立存在的實體對象,它們之間總是會有所關聯(lián)。對象們因其職責而分離,又因其聯(lián)系而聚合。而我們在使用對象時,往往不需要把對象及其聚合的所有其他
對象一次性全部初始化,部分的對象聚合足以提供足夠的信息了。這時候,我們使用的對象的信息是不完整的。
當具有不完整信息的對象被做為參數(shù)傳遞時,很可能導致我們對對象失去控制。部分對象的聚合在不同情景下的切換可能導致編程上的錯誤,而且對系統(tǒng)的維護帶來 負面的影響。由于對象職責的分割,對象本身無法理解這個問題,我們無法通過對對象本身進行處理(如增加職責)來消除這種不良影響。如何使用對象的部分信息 是由使用者根據(jù)情景要求決定的,編碼人員往往對使用情景沒有深刻的認識。在連續(xù)對應不同情景的處理鏈中,容易導致編碼錯誤。如下:
在Process1.method1方法中持久化Obj,在Process2.method2中自行初始化Obj。這個方案面向對象并解決了一致性問題, 但增加性能成本。在Process1.method1中l(wèi)oadObjRef2,不夠面向對象,增加了維護成本。
盡可能不使用這種鏈式的處理,代之以扁平的、可以總控Obj的方式:
對于樹形結構或整體-部分結構,有一個統(tǒng)一的處理合理的,但內部的復雜性還是很高。
當具有不完整信息的對象被做為參數(shù)傳遞時,很可能導致我們對對象失去控制。部分對象的聚合在不同情景下的切換可能導致編程上的錯誤,而且對系統(tǒng)的維護帶來 負面的影響。由于對象職責的分割,對象本身無法理解這個問題,我們無法通過對對象本身進行處理(如增加職責)來消除這種不良影響。如何使用對象的部分信息 是由使用者根據(jù)情景要求決定的,編碼人員往往對使用情景沒有深刻的認識。在連續(xù)對應不同情景的處理鏈中,容易導致編碼錯誤。如下:
1
// Entity objects.
2
public 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
21
public 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
31
public 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
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

// Load method omitted.
private ObjRef1 loadObjRef1() {
// ......
}
28

29

30

31

32

33

34

35

36

在Process1.method1方法中持久化Obj,在Process2.method2中自行初始化Obj。這個方案面向對象并解決了一致性問題, 但增加性能成本。在Process1.method1中l(wèi)oadObjRef2,不夠面向對象,增加了維護成本。
盡可能不使用這種鏈式的處理,代之以扁平的、可以總控Obj的方式:
1
public 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
}

2

3

4


5

6


7

8


9

10

11

對于樹形結構或整體-部分結構,有一個統(tǒng)一的處理合理的,但內部的復雜性還是很高。