潜鱼在渊
Concentrating on Architectures.
posts - 77, comments - 309, trackbacks - 0, articles - 0
BlogJava
::
首页
::
新随笔
::
联系
::
聚合
::
管理
对象传递和信息完整性
Posted on 2005-12-05 17:56
非鱼
阅读(1083)
评论(3)
编辑
收藏
所属分类:
面向对象设计
很少有孤立存在的实体对象,它们之间总是会有所关联。对象们因其职责而分离,又因其联系而聚合。而我们在使用对象时,往往不需要把对象及其聚合的所有其他 对象一次性全部初始化,部分的对象聚合足以提供足够的信息了。这时候,我们使用的对象的信息是不完整的。
当具有不完整信息的对象被做为参数传递时,很可能导致我们对对象失去控制。部分对象的聚合在不同情景下的切换可能导致编程上的错误,而且对系统的维护带来 负面的影响。由于对象职责的分割,对象本身无法理解这个问题,我们无法通过对对象本身进行处理(如增加职责)来消除这种不良影响。如何使用对象的部分信息 是由使用者根据情景要求决定的,编码人员往往对使用情景没有深刻的认识。在连续对应不同情景的处理链中,容易导致编码错误。如下:
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
}
在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
}
对于树形结构或整体-部分结构,有一个统一的处理合理的,但内部的复杂性还是很高。
评论
#
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
非鱼
前面描述的不好,给大家造成了理解上的麻烦。希望这次改过后表达足够清楚。不行就再改吧。
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
代码检查(6)
代码检查(5)
代码检查(4)
代码检查(3)
代码检查(2)
深入解析UUID及其应用
软件架构:控制与改进
软件架构:决策与选择
软件架构:架构与价值
应用软件的合理性
Powered by:
BlogJava
Copyright © 非鱼
日历
<
2005年12月
>
日
一
二
三
四
五
六
27
28
29
30
1
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
28
29
30
31
1
2
3
4
5
6
7
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(9)
给我留言
查看公开留言
查看私人留言
我参与的团队
架构师之家(0/0)
随笔分类
About Love(3)
Java技术(13)
Sybase(6)
其他技术(10)
杂七杂八(26)
笑一笑(1)
管理(5)
面向对象设计(23)
随笔档案
2008年12月 (1)
2008年11月 (1)
2008年10月 (11)
2008年9月 (7)
2006年6月 (1)
2006年4月 (1)
2006年3月 (4)
2006年1月 (1)
2005年12月 (27)
2005年11月 (23)
收藏夹
硬件(1)
BLOGs
Anders小明的小屋
David. turing
Donald
Flyingis
Learning
Petit
wfeng007
微雨心情
无言独上西楼的BLOG
江南白衣的BLOG
笨笨的思想片断
读书、思考、生活
邢红瑞的Blog
郁也风的BLOG
飞云小侠
Web Links
Java自由人
WWISA
积分与排名
积分 - 201892
排名 - 283
最新评论
1. re: 月薪3万的一道面试题------看看你的IQ [未登录]
9月1号
--阿伟
2. re: 架构(Architecture)和框架(Framework)杂谈
架构是一个总体的东西,而框架是一个具体的东西。举个例子:建筑设计师给出的是一个大楼的总体架构,而框架就是这个架构的具体实现。
自己的理解,可能不对。
--momo2003
3. re: 申请加入“架构师之家”
申请加入: 账号:rgqancy
--任国强
4. re: 月薪3万的一道面试题------看看你的IQ
撒旦发生大幅是否
--zzzzz
5. re: Java线程安全精解
文中
“1. 不用做什么,只一个独立的变量,任何时候它都是原子、一致的。”
反省一下是不是有问题。 本人觉得这种情况下也不是线程安全的。
--su30mmkx
阅读排行榜
1. Java线程安全精解(23334)
2. 深入解析UUID及其应用(20505)
3. 应用软件的合理性(16844)
4. 架构(Architecture)和框架(Framework)杂谈(9873)
5. [转载]笔记本故障案例50个(9057)
6. 月薪3万的一道面试题------看看你的IQ (5907)
7. 版本管理(4938)
8. 一首感人的MV,Mr. Children:Kurumi(4424)
9. 为什么MulticastSocket不能正常工作?(4123)
10. 自定义Sybase排序方式(3615)