﻿<?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-狂人思维·成都-随笔分类-JAVA技术</title><link>http://www.blogjava.net/langds/category/274.html</link><description>&lt;!-- Search Google --&gt;
&lt;center&gt;
&lt;form method="get" action="http://www.google.cn/custom" target="_top"&gt;
&lt;table bgcolor="#ffffff"&gt;
&lt;tr&gt;&lt;td nowrap="nowrap" valign="top" align="left" height="32"&gt;
&lt;a href="http://www.google.com/"&gt;
&lt;img src="http://www.google.com/logos/Logo_25wht.gif" border="0" alt="Google" align="middle"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;input type="text" name="q" size="40" maxlength="255" value=""&gt;&lt;/input&gt;
&lt;input type="submit" name="sa" value="搜索"&gt;&lt;/input&gt;
&lt;input type="hidden" name="client" value="pub-5053530400857948"&gt;&lt;/input&gt;
&lt;input type="hidden" name="forid" value="1"&gt;&lt;/input&gt;
&lt;input type="hidden" name="ie" value="GB2312"&gt;&lt;/input&gt;
&lt;input type="hidden" name="oe" value="GB2312"&gt;&lt;/input&gt;
&lt;input type="hidden" name="cof" value="GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1"&gt;&lt;/input&gt;
&lt;input type="hidden" name="hl" value="zh-CN"&gt;&lt;/input&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/form&gt;
&lt;/center&gt;
&lt;!-- Search Google --&gt;

软件架构,开则持续,合则稳健;亦开亦合,刚柔并济;讲究平衡如同生活之中庸和谐.
&lt;BR&gt;
    我的EMAIL:guojian.zhang@gmail.com
&lt;!--google 分析--&gt;
&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
_uacct = "UA-838812-1";
urchinTracker();
&lt;/script&gt;</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 07:55:56 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 07:55:56 GMT</pubDate><ttl>60</ttl><item><title>深入JVM内部解析类和对象的初始化过程</title><link>http://www.blogjava.net/langds/archive/2006/09/08/68446.html</link><dc:creator>狂人思维·成都</dc:creator><author>狂人思维·成都</author><pubDate>Fri, 08 Sep 2006 02:15:00 GMT</pubDate><guid>http://www.blogjava.net/langds/archive/2006/09/08/68446.html</guid><wfw:comment>http://www.blogjava.net/langds/comments/68446.html</wfw:comment><comments>http://www.blogjava.net/langds/archive/2006/09/08/68446.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/langds/comments/commentRss/68446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/langds/services/trackbacks/68446.html</trackback:ping><description><![CDATA[
		<blockquote>
				<p>
						<strong>[摘要]<br /></strong>
						<br />类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节，Google 了一遍网络，有关类装载机制的文章倒是不少，然而类初始化和对象初始化的文章并不多，特别是从字节码和 JVM 层次来分析的文章更是鲜有所见。</p>
				<p>本文主要对类和对象初始化全过程进行分析，通过一个实际问题引入，将源代码转换成 JVM 字节码后，对 JVM 执行过程的关键点进行全面解析，并在文中穿插入了相关 JVM 规范和 JVM 的部分内部理论知识，以理论与实际结合的方式介绍对象初始化和类初始化之间的协作以及可能存在的冲突问题。<br /><br /><br />本文发表于IBM DW,详细正文请见 <a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-clobj-init/index.html">解析JAVA类和对象的初始化过程</a><br />网址:<a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-clobj-init/index.html">http://www-128.ibm.com/developerworks/cn/java/j-lo-clobj-init/index.html</a></p>
		</blockquote>
<img src ="http://www.blogjava.net/langds/aggbug/68446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/langds/" target="_blank">狂人思维·成都</a> 2006-09-08 10:15 <a href="http://www.blogjava.net/langds/archive/2006/09/08/68446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最新消息:JRuby终于跨进了标准之门---JRuby Steps Into the Sun</title><link>http://www.blogjava.net/langds/archive/2006/09/08/68443.html</link><dc:creator>狂人思维·成都</dc:creator><author>狂人思维·成都</author><pubDate>Fri, 08 Sep 2006 02:02:00 GMT</pubDate><guid>http://www.blogjava.net/langds/archive/2006/09/08/68443.html</guid><wfw:comment>http://www.blogjava.net/langds/comments/68443.html</wfw:comment><comments>http://www.blogjava.net/langds/archive/2006/09/08/68443.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/langds/comments/commentRss/68443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/langds/services/trackbacks/68443.html</trackback:ping><description><![CDATA[以下信息来源于Blog:<!--StartFragment --><h1><a href="http://headius.blogspot.com/">Headius</a></h1><a href="http://headius.blogspot.com/2006/09/jruby-steps-into-sun.html">http://headius.blogspot.com/2006/09/jruby-steps-into-sun.html</a><br /><br /><!--StartFragment --> It's going to be a big news day for JRuby :)<br /><br />The two core JRuby developers, myself and Thomas Enebo, will become employees at Sun Microsystems this month. Our charge? You guessed it...we're being hired to work on JRuby full-time.<br /><br />Perhaps some of you may have seen this one coming. For others, it may be a pleasant surprise.<br /><br />The primary goal is to give JRuby the attention it really needs. The potential for Ruby on the JVM has not escaped notice at Sun, and so we'll be focusing on making JRuby as complete, performant, and solid as possible. We'll then proceed on to help build out broader tool support for Ruby, answering calls by many in the industry for a "better" or "smarter" Ruby development experience. I'm also making it a personal priority to continue growing the JRuby community, foster greater cooperation between the Java and Ruby worlds, and work toward a "whole-platform" Ruby-on-JVM strategy for Sun.<br /><br />And yes, JRuby will remain as open source as it is today. It just might start moving a bit faster (as if it weren't moving fast already!)<br /><br />You can imagine how excited I am about this opportunity, and how pleased I am to know that Sun takes Ruby so seriously. Not only will I get to work on the project I've poured my heart into this past year, but I'll be able to do it while helping one of my favorite companies turn a technological corner. Naturally I've been talking with a myriad of folks at Sun over the past several weeks, so believe me when I say these guys really get it. The tide has turned and dynamic languages are on everyone's agenda. It's going to be quite a ride.<br /><br />Thanks very much to Tim Bray, who has proven a fearless advocate for Ruby and dynamic languages at Sun. Thanks also to Gilad Bracha, Neal Gafter, James Gosling, Peter von der Ahé, and others fighting to improve Java and make the Java platform a dynlang-friendly place. Thanks also to my Sun interviewers for their excellent, thoughtful questions and ideas about the future of JRuby and dynlangs on the JVM. I'm looking forward to working with you all.<br /><br />And finally, thanks to all you who use, contribute to, and blog about JRuby. You're a huge part of this, and I want you all to join us on this great Ruby adventure. Community involvement has gotten JRuby where it is today, and community involvement is vital to making Ruby on the JVM a reality.<br /><br /><img src ="http://www.blogjava.net/langds/aggbug/68443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/langds/" target="_blank">狂人思维·成都</a> 2006-09-08 10:02 <a href="http://www.blogjava.net/langds/archive/2006/09/08/68443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最近很忙,很郁闷,也很有收获</title><link>http://www.blogjava.net/langds/archive/2006/03/27/37666.html</link><dc:creator>狂人思维·成都</dc:creator><author>狂人思维·成都</author><pubDate>Mon, 27 Mar 2006 11:02:00 GMT</pubDate><guid>http://www.blogjava.net/langds/archive/2006/03/27/37666.html</guid><wfw:comment>http://www.blogjava.net/langds/comments/37666.html</wfw:comment><comments>http://www.blogjava.net/langds/archive/2006/03/27/37666.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/langds/comments/commentRss/37666.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/langds/services/trackbacks/37666.html</trackback:ping><description><![CDATA[
		<p>进入项目就一直忙忙碌碌,朦胧中已经有近一年没写Blog了,放下手中的笔，体息一下，觉得是乎应该对自己最近的工作总结一下，拿起键盘，却又不知道具体要说些什么，似乎有很多要写的，很散，思维还有点乱......，还是就由着思绪来吧 ～～<br /><br />我所在的项目由于一期使用的是一个公司的开发平台，因为其平台自身的功能限制无法扩展、难以维护且系统可控制度极低，因此，客户方决定在二期重新设计架构并在新的架构上完全重新开发，而我正是在为新的架构做技术预研，其中形形色色的问题乱如麻。<br /><br />首先是JSF，我们采用的是MyFaces的实现，服务器WAS5.1,JDK1.4.1.2，在发布JSF应用时的第一个问题就是JSF容器无法正常初始化。这个问题很容易定位，就是由于Servlet 2.3规范对Lisener和Servlet的初始化顺序要求不严格，从而使不同厂商有着不同的实现导致的。但因为有朋友也在使用JSF，且服务器版本也一致，他们没有问题，偏偏我整死也跑不通，所以，开始觉得自己的判断可能不对，但郁闷的是用google搜索半天没搜到解决方案，最后没折了，只好自己去打开JAR包看看源代码，结果发现里面有个MyFacesServlet，打开一看内容，简直想一头撞死，原来该类解决了2.3规范问题，从而他可以替换Linsener类的初始化职责。他在被加载时首先会检查StartupServletContextListener有没有正常初始化，如果未初始化则调用StartupServletContextListener进行初始化。看来有时候还真是不能偷半点懒，要相信自己的判断。<br /><br />其次是JSTL，我最初用的是apache的参考实现1.1版本，结果整死都无法使用，总是报taglib无法解析，到网上查了半天，没有一个人说具体的解决方案，没办法，从来没用过JSTL啊，新手总是会碰上一脸灰的，后来打开看Tablib的版本，天啦，人家要求的是JSP 2.0，而我的还是基于2.3规范的1.2，当然无法解析了，然后从新从网上DOWN个jstl 1.0下来，一跑就通！！唉，真是没办法，在网络上，有些问题一搜就到，而有些看似简单的问题却能把人折腾个半死，结果发现你还是要自己定下心来去查，千万不要全指望别人。又受教了。<br /><br />再次SpringWebflow，到目前为此，webflow还处于1.0早期版本，现在还不能确定1.0正式版何时推出，做为我们来说，也算是一次大胆偿试，说实话，当前的webflow版本功能还不能足以应用到项目中来，但我相信他的正式版应该会很快推出，所以就抢先偿试了，偿试中的问题就不说了，就说说它现在的缺陷吧，<br />  1.支持流程级变量创建，却无法给变量赋值，郁闷，这么重要的功能居然还没提供<br />  2.调用POJO方法时，必需要有参数，且参数必需是在flowScope上下文里，连静态常量参数都不支持，又狂郁闷了一把。在流程里，这是再常用不过的功能了，居然没提供，希望正式版快快出来，并补上这些缺陷。要不然，他是不可能进入实际项目应用的。偶现在真是想修改他的代码，把这些功能通通加进去。。，但最终还是得先抑制住冲动---再等等看吧。。。<br />  3.与JSF集成的JSP里的非受管Bean的普通JSP参数无法在flowScope里获得，这一点不能肯定，有可能是转发方式的问题，希望能修改该问题。<br />  4.流程里的表达式灵活性太差，尽管是采用OGNL做的解析，但还是只能写一些极其简单的逻辑表达式，稍微复杂一点的----别想。这一点，也有可能是我还没用好的缘故，需进一步证实<br /><br />最后就是自定义Data Table UI组件了，我们要同时支持列表分页，定制式的组合查询，动态排序等；这几功能点乍一听觉得应该不难，可一做起来，也并非易事，我现在没有基于JSF的UI实现，而是通过JSP TAG +XML+XSLT+AJAX的方式来实现的，其中最复杂的就是组件的参数绑定和状态绑定的问题，服务端是无状态模型，所有状态及参数都保存在客户端，解决如何能让自己的组件里的状态参数不与其它组件或页面上的其它参数发生冲突是个非常重要一环，另外就是SQL的解析，结果模型的抽象，转换器的抽象，对UI前端的命令解析及执行，参数模型的封装，对不同的数据来源用不周的解析器等等，都是要考虑的问题，这一块要说起来就太多了，等先把这个组件完全测通了后，再拿现来专门讨论讨论。<br /><br />感想，开发一个好的框架是一个非常考水平的事情，他不是我们平时所想像中的那样简单地将一些现成的开源框架拼凑起来就了事的，他涉及到了项目群的协模式，系统架构，各层所选用的技术框架特性，业务集成等方方面面，即使使用Spring这种几乎现成的框架来做为系统的主干骨架，做为框架设计者，你要做的事还很多，你要从系统总体角度去考虑系统的逻辑模式，与外部系统的协作模式，系统的可扩展性和低侵入性；你要让开发人员尽可能的少做重复劳动；你还要保证你所选的技术方案能在开发过程中无障碍；你要做好解决开发过程中的所有技术难题的准备；除了这些，更关键的是你还要能做好业务模型的抽象和设计，你要能及时或预先发现潜在风险和问题并解决它。。。。等等，太多太多。。。，而我，现在要行的路还长得很.....</p>
<img src ="http://www.blogjava.net/langds/aggbug/37666.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/langds/" target="_blank">狂人思维·成都</a> 2006-03-27 19:02 <a href="http://www.blogjava.net/langds/archive/2006/03/27/37666.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架构、框架、基础件之反思</title><link>http://www.blogjava.net/langds/archive/2005/05/20/4999.html</link><dc:creator>狂人思维·成都</dc:creator><author>狂人思维·成都</author><pubDate>Fri, 20 May 2005 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/langds/archive/2005/05/20/4999.html</guid><wfw:comment>http://www.blogjava.net/langds/comments/4999.html</wfw:comment><comments>http://www.blogjava.net/langds/archive/2005/05/20/4999.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/langds/comments/commentRss/4999.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/langds/services/trackbacks/4999.html</trackback:ping><description><![CDATA[<P>看过<A accessKey=1 href="http://www.matrix.org.cn/blog/X-Brave/">微雨心晴（X-Brave）</A>的对架构、框架、基础件三者关系的论述后，我陷入了一阵不安和恐慌之中。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 发现我原来对软件框架的理解还是那样的浅溥，并由此想起，应该不只我一个是这样，我想大多数的开发人员在从普通的程序员向架构设计转型时都会遇到的这样的问题，在阐述的这个问题之前有必要将这三都的关系描述一下(这里就直接引用<A accessKey=1 href="http://www.matrix.org.cn/blog/X-Brave/">微雨心晴（X-Brave）</A>的描述)：<BR><FONT color=#006400>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从层次结构来看，软件架构是从整体上来看软件设计开发的，框架通常是从较高的层次来实现或者被选择来实现软件的架构，基础件/类是更小的软件元素，只是更加的强调通用。</FONT><FONT color=#008000> 三者之间存在微妙的关系，以至于确实容易引起人们的混淆。实际上，试图完全的割裂它们即使不是错误的做法，也常常不是良好的设计：三者之间存在紧密的依赖关系.</FONT><BR><BR>我很赞同这种说法，现在我来描述我以前设计系统框架时的问题所在：<BR>最初在第一次担任框架设计时，总是从功能类出发。<BR>&nbsp;即：先考虑系统有哪些复杂而又频繁使用的类，对这此类进行分包，归类，并命名为UTILS。</P>
<P>然后再是对系统分层，分包，几乎没有多少中间接口，相临层之间总是紧耦合的调用，造成了层与层的改动牵连边过大。<BR>&nbsp;<BR>写出来的框架就像工具包一样，由一大堆看起来没有联系的类堆积而成。</P>
<P>后来，经历过一次大项目后，开始关注一些建模理论以及开源框架，对先前的框架设计思想产生极大的冲击，开始关注系统的整体搭配，接口解耦，代码重用，自动化控制程度有所提高。<BR>但感觉问题还是依然很严峻，主要表现在：对系统的把握层次仍然偏低(从代码角度出发)，缺乏对系统整体的抽象能力和建模能力。对零散的业务规则难以抽象出很好的业务模型并以与系统架构结合起来。</P>
<P><BR>总的来说我经历了两个阶段：1。以公用基础件为核心的积木式开发 2。以局部框架结构(实现)为起点，分层整合的泛射式开发(最明显的问题就是层层之间不成一体，项目越大越到后期就越松散变得越来越难以控制)</P>
<P>目前，开始将目光从系统业务层面出发，以架构为主，逐步向框架结构设计过渡的方向发展，但这时常令我感到力不从心，毕境理论归理论，现实中还需要丰富的实践经验去累积。</P>
<P><BR>&nbsp;</P><img src ="http://www.blogjava.net/langds/aggbug/4999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/langds/" target="_blank">狂人思维·成都</a> 2005-05-20 16:44 <a href="http://www.blogjava.net/langds/archive/2005/05/20/4999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 对BLOB大字段之存与取 的疑惑</title><link>http://www.blogjava.net/langds/archive/2005/05/20/4996.html</link><dc:creator>狂人思维·成都</dc:creator><author>狂人思维·成都</author><pubDate>Fri, 20 May 2005 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/langds/archive/2005/05/20/4996.html</guid><wfw:comment>http://www.blogjava.net/langds/comments/4996.html</wfw:comment><comments>http://www.blogjava.net/langds/archive/2005/05/20/4996.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/langds/comments/commentRss/4996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/langds/services/trackbacks/4996.html</trackback:ping><description><![CDATA[一晃就过了三个月了，已经很久没有写代码了，感觉思维都快要停止跳动了。刚才突然想起在以前单位开发的一套ERP系统的一个问题，这个系统的持久层采用的ORM框架是HIBERNATE，问题是这样的：<BR>客户的所有文档及图片等大数据均存放在BLOB字段中，在PO中有我们映射的对应字段，在新增一条文档记录时，当然是要经过两部操作(即：先INSERT基本信息，并对BLOB字段置空初始化，然后再UPDATE BLOG字段，将文档内容存入数据库)。但在读取该字段时，却只能读前4K内容，不知道HIBERNATE为什么要这样限制？是顾及效率么？<BR>如果是效率因素，我们完全可以将BLOB字段与基本信息分离，生成两个PO，这样我们可以通过延迟加载特性以提高效率，我想这么简单的一点HIBERNATE开发组织并不可能想不到吧？那倒底会是什么原因呢？<BR>望各位大侠指点指点!!<img src ="http://www.blogjava.net/langds/aggbug/4996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/langds/" target="_blank">狂人思维·成都</a> 2005-05-20 15:35 <a href="http://www.blogjava.net/langds/archive/2005/05/20/4996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Domain Driving Model Design之总结与我的选择</title><link>http://www.blogjava.net/langds/archive/2005/04/07/2892.html</link><dc:creator>狂人思维·成都</dc:creator><author>狂人思维·成都</author><pubDate>Thu, 07 Apr 2005 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/langds/archive/2005/04/07/2892.html</guid><wfw:comment>http://www.blogjava.net/langds/comments/2892.html</wfw:comment><comments>http://www.blogjava.net/langds/archive/2005/04/07/2892.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/langds/comments/commentRss/2892.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/langds/services/trackbacks/2892.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最近在</SPAN><SPAN lang=EN-US><A href="http://www.javaeye.com/">javaEye</A></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上看到有关</SPAN><SPAN lang=EN-US>Domain Driving Model Design</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的激烈讨论，让我对</SPAN><SPAN lang=EN-US>DOMAIN MODEL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的理解更深刻了不少，趁现在意犹未尽之际，结合我在项目中的实际经验将讨论中的一些结论摘录并总结出来：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先引用说明一下</SPAN><SPAN lang=EN-US>Domain Model </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的定义：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-outline-level: 1"><SPAN class=postbody1><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">Domain Model </SPAN></B></SPAN><SPAN class=postbody1><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">：</SPAN></B></SPAN><SPAN class=postbody1><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"> </SPAN></B></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">An object model of the domain that incorporates <B>both behavior and data.</B> <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">Domain Model </SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">分两种：</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"> <SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-outline-level: 1"><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">1<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Simple Domain Model (Active Record) <o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">它的特点是</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">POJO</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">和</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">TABLE STRUCTURE</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">一一对应，建模基于数据库设计。</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">Hibernate</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">走的就是这个路子，说它贫血，意思就是指它只有</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">data</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，没有</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">behavior</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">(</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">但我们实际可以通过</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">HBM</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">文件的定义和映射，在</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">PO</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">中适当的加入一些基本的业务逻辑的。</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">)</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">在这种模式下，</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">POJO</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">自己的</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">CRUD</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">操作都应该放在自己的类里面。其他复杂的业务逻辑会放到外面的</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">Service layer</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"> <SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%; mso-outline-level: 1"><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">2 <SPAN style="mso-spacerun: yes">&nbsp;</SPAN>Rich Domain Model (Data Mapper) <o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">它的特点是</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">POJO</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">和</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">TABLE STRUCTURE</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">并不一一对应，建模天马行空，完全取决于业务逻辑。</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">domain object</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">和</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">table</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">之间的</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">mapping</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，由</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">Data Mapper</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">完成，</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">domain object</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">不用管数据表是何等结构，甚至不用管</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">Data Mapper</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">怎么操作。</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><SPAN lang=EN-US>1.</SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">识别某种业务行为的一个很确定的原则：</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>domain logic</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">只应该和这一个</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">domain object</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的<B style="mso-bidi-font-weight: normal">实例状态</B></SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">(</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">并非“持久”状态</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">)</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">有关，而不应该和一批</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">domain object</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的状态有关</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">.<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">进一步的说：主要看</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">logic</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">是否只和这个</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">object</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">(</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">注：指自身</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">)</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的状态有关，如果只和这个</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">object</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">(</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">注：指自身</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">)</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">有关，就是</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">domain logic</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">；如果</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">logic</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">是和一批</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">domain object</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">(</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">注：指同类型的实体</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #339966; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">)</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的状态有关，就不是</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">domain logic</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，而是</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">business logic</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p>&nbsp;</o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><SPAN lang=EN-US>2.Domain Model </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">与</SPAN><SPAN lang=EN-US> Hibernate PO </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的区别：</SPAN><SPAN class=MsoHyperlink><SPAN lang=EN-US style="FONT-FAMILY: Verdana"><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">领域模型的代码实现需要用一组互相协作的类来完成，每一个或者一组类承担这个领域模型的某个特征。而</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">Hibernate</SPAN></SPAN><SPAN class=postbody1><SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的实体类只不过是其中的一组类，它承担的职责就是保持领域模型的状态的。</SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><SPAN class=postbody1><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p>&nbsp;</o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><SPAN lang=EN-US>3.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基于</SPAN><SPAN lang=EN-US>Domain Model </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分析与设计的方法规则：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><SPAN class=postbody1><SPAN style="COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt; mso-ansi-font-size: 10.5pt">应该由<B style="mso-bidi-font-weight: normal">领域模型</B>来驱动你的软件<B style="mso-bidi-font-weight: normal">内在规则</B>，由<B style="mso-bidi-font-weight: normal">需求</B>驱动你的软件<B style="mso-bidi-font-weight: normal">外在交互</B></SPAN></SPAN><SPAN class=postbody1><SPAN lang=EN-US style="COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt; mso-ansi-font-size: 10.5pt">.<BR><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最后，我想补充的是：根据目前的</SPAN><SPAN lang=EN-US>O/R Mapping</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术，我们在实际项目开发中，能真正做到</SPAN> <B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">富领域模型</SPAN></B> <SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还不现实</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因为我们还要考虑诸如性能、目前</SPAN><SPAN lang=EN-US>O/R</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">持久化特性等等问题</SPAN><SPAN lang=EN-US>)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，更何况，我们的</SPAN><SPAN lang=EN-US>MODEL DATA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最终需要被持久化，因此，我比较反对在</SPAN><SPAN lang=EN-US>DOMAIN MODEL </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中直接通过任何方式做任何持久化操作，因为这会让你所设计的</SPAN><SPAN lang=EN-US>MODEL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">无法独立化，难以单元测试，并且与加入了一些外界无关的东西，这不符合对象的本质</SPAN><SPAN lang=EN-US>(对象</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本身是不能持久化的</SPAN><SPAN lang=EN-US>)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。虽然我们做不到完整意义上的</SPAN><SPAN lang=EN-US>Domain Driving Model Development</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，但我们可以在项目实际开发中因为性能、结构简化等等上面得到补偿，这已经值得欣慰了。<BR></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 宋体-方正超大字符集; mso-hansi-font-family: 宋体-方正超大字符集; mso-bidi-font-family: 宋体-方正超大字符集"><o:p></o:p></SPAN></P><img src ="http://www.blogjava.net/langds/aggbug/2892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/langds/" target="_blank">狂人思维·成都</a> 2005-04-07 09:44 <a href="http://www.blogjava.net/langds/archive/2005/04/07/2892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>