﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Vincent-随笔分类-OOA/OOD</title><link>http://www.blogjava.net/lijiajia418/category/14436.html</link><description>Vicent's blog</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 20:51:19 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 20:51:19 GMT</pubDate><ttl>60</ttl><item><title>对象传递和信息完整性 </title><link>http://www.blogjava.net/lijiajia418/archive/2006/08/24/65535.html</link><dc:creator>Binary</dc:creator><author>Binary</author><pubDate>Thu, 24 Aug 2006 07:44:00 GMT</pubDate><guid>http://www.blogjava.net/lijiajia418/archive/2006/08/24/65535.html</guid><wfw:comment>http://www.blogjava.net/lijiajia418/comments/65535.html</wfw:comment><comments>http://www.blogjava.net/lijiajia418/archive/2006/08/24/65535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lijiajia418/comments/commentRss/65535.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lijiajia418/services/trackbacks/65535.html</trackback:ping><description><![CDATA[    很少有孤立存在的实体对象，它们之间总是会有所关联。对象们因其职责而分离，又因其联系而聚合。而我们在使用对象时，往往不需要把对象及其聚合的所有其他对象一次性全部初始化，部分的对象聚合足以提供足够的信息了。这时候，我们使用的对象的信息是不完整的。<br /><br />    当具有不完整信息的对象被做为参数传递时，很可能导致我们对对象失去控制。部分对象的聚合在不同情景下的切换可能导致编程上的错误，而且对系统的维护带来负面的影响。由于对象职责的分割，对象本身无法理解这个问题，我们无法通过对对象本身进行处理（如增加职责）来消除这种不良影响。如何使用对象的部分信息是由使用者根据情景要求决定的，编码人员往往对使用情景没有深刻的认识。在连续对应不同情景的处理链中，容易导致编码错误。如下：<br /><br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,128,128)"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: rgb(0,0,0)">// Entity objects.<br /></span><span style="COLOR: rgb(0,128,128)"> 2</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />public class Obj {<br /></span><span style="COLOR: rgb(0,128,128)"> 3</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  private ObjRef1 ref1</span><span style="COLOR: rgb(0,128,0)">;<br /></span><span style="COLOR: rgb(0,128,128)"> 4</span><span style="COLOR: rgb(0,128,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: rgb(0,0,0)">  Private ObjRef2 ref2</span><span style="COLOR: rgb(0,128,0)">;<br /></span><span style="COLOR: rgb(0,128,128)"> 5</span><span style="COLOR: rgb(0,128,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 6</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  public Obj() {<br /></span><span style="COLOR: rgb(0,128,128)"> 7</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  }<br /></span><span style="COLOR: rgb(0,128,128)"> 8</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: rgb(0,128,128)"> 9</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  public Obj(ObjRef1 ref1) {<br /></span><span style="COLOR: rgb(0,128,128)">10</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    this.ref1 </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> ref1</span><span style="COLOR: rgb(0,128,0)">;<br /></span><span style="COLOR: rgb(0,128,128)">11</span><span style="COLOR: rgb(0,128,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: rgb(0,0,0)">  }<br /></span><span style="COLOR: rgb(0,128,128)">12</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: rgb(0,128,128)">13</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  public Obj(ObjRef1 ref1</span><span style="COLOR: rgb(0,0,0)">,</span><span style="COLOR: rgb(0,0,0)"> ObjRef2 ref2) {<br /></span><span style="COLOR: rgb(0,128,128)">14</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    this.ref1 </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> ref1</span><span style="COLOR: rgb(0,128,0)">;<br /></span><span style="COLOR: rgb(0,128,128)">15</span><span style="COLOR: rgb(0,128,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: rgb(0,0,0)">    this.ref2 </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> ref2</span><span style="COLOR: rgb(0,128,0)">;<br /></span><span style="COLOR: rgb(0,128,128)">16</span><span style="COLOR: rgb(0,128,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: rgb(0,0,0)">  }<br /></span><span style="COLOR: rgb(0,128,128)">17</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  // Accessors omitted.<br /></span><span style="COLOR: rgb(0,128,128)">18</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />} // ObjRef1</span><span style="COLOR: rgb(0,0,0)">,</span><span style="COLOR: rgb(0,0,0)"> ObjRef2 omitted.<br /></span><span style="COLOR: rgb(0,128,128)">19</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: rgb(0,128,128)">20</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />// Process1<br /></span><span style="COLOR: rgb(0,128,128)">21</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />public class Prs1 {<br /></span><span style="COLOR: rgb(0,128,128)">22</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  public Obj method1() {<br /></span><span style="COLOR: rgb(0,128,128)">23</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    Obj obj </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> new Obj()</span><span style="COLOR: rgb(0,128,0)">;<br /></span><span style="COLOR: rgb(0,128,128)">24</span><span style="COLOR: rgb(0,128,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: rgb(0,0,0)">    obj.setObjRef1(loadObjRef1())</span><span style="COLOR: rgb(0,128,0)">;<br /></span><span style="COLOR: rgb(0,128,128)">25</span><span style="COLOR: rgb(0,128,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: rgb(0,0,0)">    // Do something to obj.<br /></span><span style="COLOR: rgb(0,128,128)">26</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    return obj</span><span style="COLOR: rgb(0,128,0)">;<br /></span><span style="COLOR: rgb(0,128,128)">27</span><span style="COLOR: rgb(0,128,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: rgb(0,0,0)">  }<br />     // Load method omitted.<br />     private ObjRef1 loadObjRef1() {<br />       // ......<br />     }<br /></span><span style="COLOR: rgb(0,128,128)">28</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}<br /></span><span style="COLOR: rgb(0,128,128)">29</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: rgb(0,128,128)">30</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />// Process2<br /></span><span style="COLOR: rgb(0,128,128)">31</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />public class Prs2 {<br /></span><span style="COLOR: rgb(0,128,128)">32</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  public void method2() {<br /></span><span style="COLOR: rgb(0,128,128)">33</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    Obj obj </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> new Clt1().method1()</span><span style="COLOR: rgb(0,128,0)">;<br /></span><span style="COLOR: rgb(0,128,128)">34</span><span style="COLOR: rgb(0,128,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: rgb(0,0,0)">    // Do something to obj.ref2. Coding error may be found until debug phase.<br /></span><span style="COLOR: rgb(0,128,128)">35</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  }<br /></span><span style="COLOR: rgb(0,128,128)">36</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}</span></div><br />    在Process1.method1方法中持久化Obj，在Process2.method2中自行初始化Obj。这个方案面向对象并解决了一致性问题，但增加性能成本。在Process1.method1中loadObjRef2，不够面向对象，增加了维护成本。<br />    <br />    尽可能不使用这种链式的处理，代之以扁平的、可以总控Obj的方式：<br />    
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,128,128)"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: rgb(0,0,0)">public class Process {<br /></span><span style="COLOR: rgb(0,128,128)"> 2</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  public void proceed() {<br /></span><span style="COLOR: rgb(0,128,128)"> 3</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    // Need to change Prs1</span><span style="COLOR: rgb(0,0,0)">,</span><span style="COLOR: rgb(0,0,0)"> Prs2's method signatures.<br /></span><span style="COLOR: rgb(0,128,128)"> 4</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    Obj obj </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> <img src="http://www.blogjava.net/images/dot.gif" /><br /></span><span style="COLOR: rgb(0,128,128)"> 5</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    obj </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> new Prs1().method1(obj)</span><span style="COLOR: rgb(0,128,0)">;<br /></span><span style="COLOR: rgb(0,128,128)"> 6</span><span style="COLOR: rgb(0,128,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: rgb(0,0,0)">    obj.setObjRef2(<img src="http://www.blogjava.net/images/dot.gif" />)</span><span style="COLOR: rgb(0,128,0)">;<br /></span><span style="COLOR: rgb(0,128,128)"> 7</span><span style="COLOR: rgb(0,128,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: rgb(0,0,0)">    obj </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> new Prs2().method2(obj)</span><span style="COLOR: rgb(0,128,0)">;<br /></span><span style="COLOR: rgb(0,128,128)"> 8</span><span style="COLOR: rgb(0,128,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: rgb(0,0,0)">    <img src="http://www.blogjava.net/images/dot.gif" /><br /></span><span style="COLOR: rgb(0,128,128)"> 9</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    // Future processes can be inserted anywhere inside this method.<br /></span><span style="COLOR: rgb(0,128,128)">10</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  }<br /></span><span style="COLOR: rgb(0,128,128)">11</span><span style="COLOR: rgb(0,0,0)"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}</span></div><br /><br />    对于树形结构或整体-部分结构，有一个统一的处理合理的，但内部的复杂性还是很高。<br /><img src ="http://www.blogjava.net/lijiajia418/aggbug/65535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lijiajia418/" target="_blank">Binary</a> 2006-08-24 15:44 <a href="http://www.blogjava.net/lijiajia418/archive/2006/08/24/65535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>