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

??? 對于樹形結構或整體-部分結構,有一個統一的處理合理的,但內部的復雜性還是很高。
posted on 2006-08-24 15:44 Binary 閱讀(282) 評論(0) 編輯 收藏 所屬分類: OOA/OOD