對(duì)象傳遞和信息完整性
Posted on 2005-12-05 17:56 非魚(yú) 閱讀(1094) 評(píng)論(3) 編輯 收藏 所屬分類: 面向?qū)ο笤O(shè)計(jì)
很少有孤立存在的實(shí)體對(duì)象,它們之間總是會(huì)有所關(guān)聯(lián)。對(duì)象們因其職責(zé)而分離,又因其聯(lián)系而聚合。而我們?cè)谑褂脤?duì)象時(shí),往往不需要把對(duì)象及其聚合的所有其他
對(duì)象一次性全部初始化,部分的對(duì)象聚合足以提供足夠的信息了。這時(shí)候,我們使用的對(duì)象的信息是不完整的。
當(dāng)具有不完整信息的對(duì)象被做為參數(shù)傳遞時(shí),很可能導(dǎo)致我們對(duì)對(duì)象失去控制。部分對(duì)象的聚合在不同情景下的切換可能導(dǎo)致編程上的錯(cuò)誤,而且對(duì)系統(tǒng)的維護(hù)帶來(lái) 負(fù)面的影響。由于對(duì)象職責(zé)的分割,對(duì)象本身無(wú)法理解這個(gè)問(wèn)題,我們無(wú)法通過(guò)對(duì)對(duì)象本身進(jìn)行處理(如增加職責(zé))來(lái)消除這種不良影響。如何使用對(duì)象的部分信息 是由使用者根據(jù)情景要求決定的,編碼人員往往對(duì)使用情景沒(méi)有深刻的認(rèn)識(shí)。在連續(xù)對(duì)應(yīng)不同情景的處理鏈中,容易導(dǎo)致編碼錯(cuò)誤。如下:
在Process1.method1方法中持久化Obj,在Process2.method2中自行初始化Obj。這個(gè)方案面向?qū)ο蟛⒔鉀Q了一致性問(wèn)題, 但增加性能成本。在Process1.method1中l(wèi)oadObjRef2,不夠面向?qū)ο螅黾恿司S護(hù)成本。
盡可能不使用這種鏈?zhǔn)降奶幚恚员馄降摹⒖梢钥偪豋bj的方式:
對(duì)于樹(shù)形結(jié)構(gòu)或整體-部分結(jié)構(gòu),有一個(gè)統(tǒng)一的處理合理的,但內(nèi)部的復(fù)雜性還是很高。
當(dāng)具有不完整信息的對(duì)象被做為參數(shù)傳遞時(shí),很可能導(dǎo)致我們對(duì)對(duì)象失去控制。部分對(duì)象的聚合在不同情景下的切換可能導(dǎo)致編程上的錯(cuò)誤,而且對(duì)系統(tǒng)的維護(hù)帶來(lái) 負(fù)面的影響。由于對(duì)象職責(zé)的分割,對(duì)象本身無(wú)法理解這個(gè)問(wèn)題,我們無(wú)法通過(guò)對(duì)對(duì)象本身進(jìn)行處理(如增加職責(zé))來(lái)消除這種不良影響。如何使用對(duì)象的部分信息 是由使用者根據(jù)情景要求決定的,編碼人員往往對(duì)使用情景沒(méi)有深刻的認(rèn)識(shí)。在連續(xù)對(duì)應(yīng)不同情景的處理鏈中,容易導(dǎo)致編碼錯(cuò)誤。如下:
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。這個(gè)方案面向?qū)ο蟛⒔鉀Q了一致性問(wèn)題, 但增加性能成本。在Process1.method1中l(wèi)oadObjRef2,不夠面向?qū)ο螅黾恿司S護(hù)成本。
盡可能不使用這種鏈?zhǔn)降奶幚恚员馄降摹⒖梢钥偪豋bj的方式:
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

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