﻿<?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-☆蓝色梦想☆</title><link>http://www.blogjava.net/zlsunnan/</link><description>世界总是反反覆覆错错落落地飘去 来不及叹息 生活不是平平淡淡从从容容的东西 不能放弃</description><language>zh-cn</language><lastBuildDate>Tue, 12 May 2026 21:39:03 GMT</lastBuildDate><pubDate>Tue, 12 May 2026 21:39:03 GMT</pubDate><ttl>60</ttl><item><title>《企业应用架构模式》（POEAA）读书笔记</title><link>http://www.blogjava.net/zlsunnan/archive/2007/08/02/133948.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Thu, 02 Aug 2007 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2007/08/02/133948.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/133948.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2007/08/02/133948.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/133948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/133948.html</trackback:ping><description><![CDATA[什么是架构
<ul>
    <li>Rolph Johnson认为：架构是一种主观上的东西，是专家级的项目开发人员对系统设计的一些可共享的理解
    <li>架构中包括一些决定，开发者希望这些决定能尽早作出，因为在开发者看来它们是难以改变的。
    <li>&nbsp;如果你发现某些决定不像你想象中的那么难以改变，那么它就不再与架构相关
    <li>理解： B/S (SmartClient、C/S) 架构， DotNet 架构， J2EE架构<br></li>
</ul>
<p>企业应用的特点 </p>
<ol>
    <li>涉及到持久化数据
    <li>很多人同时访问数据
    <li>含有大量操作数据的用户界面
    <li>与散布在企业内部或周围的其他的应用集成
    <li>各种异构系统的概念含有不一致性
    <li>业务逻辑通常是最没有逻辑的东西
    <li>企业应用并非都是大型的，但可能都为企业提供巨大的价值 </li>
</ol>
<p>&nbsp;&nbsp;&#183;&nbsp;<span>性能：<span>很</span>多时候，增加更多的服务器比增加更多的程序员便宜；如果增加服务器对性能的提升较大，则说明应用的伸缩性好</span>&nbsp; </p>
<p><span><span>&#183;&nbsp;</span></span><span>分层：上层是用下层定义的各种服务，而下层对上层一无所知；分层的缺陷是不能封装所有的东西，因此可能带来级联更改，过多的曾影响性能；</span>Layer<span>和</span>Tier<span>的区别是</span>Tier<span>可能更多的意味物理上的分离</span>&nbsp;<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<span>
<p><strong>Brown<span>分层模型</span></strong></p>
<p><em><span>表现层</span>&gt;&gt;<span>控制层</span>&gt;&gt;<span>领域层</span>&gt;&gt;<span>数据映射层</span>&gt;&gt;<span>数据源层</span></em>&nbsp;&nbsp;</p>
<p><strong>Core J2EE<span>分层模型</span></strong></p>
<p><em><span>客户层</span>&gt;&gt;<span>表现层</span>&gt;&gt;<span>业务层</span>&gt;&gt;<span>集成层</span>&gt;&gt;<span>资源层</span></em>&nbsp;</p>
<p><strong>MS DNA<span>分层模型</span></strong></p>
<p><em><span>表现层</span>&gt;&gt;<span>业务逻辑层</span>&gt;&gt;<span>数据访问层</span></em>&nbsp;</p>
<p><strong>Marinescu<span>分层模型</span></strong></p>
<p><em><span>表现层</span>&gt;&gt;<span>应用层</span>&gt;&gt;<span>服务层</span>&gt;&gt;<span>领域层</span>&gt;&gt;<span>持久层</span></em></span><br><br><br>&#183;&nbsp;</span></span><span>领域模型：使用不同职责的对象来联合解决业务问题，而不是通过事务脚本来处理数据</span>&nbsp;</p>
<p><span><span>&#183;&nbsp;</span></span><span>阻抗不匹配：对象模型和关系型数据库之间的不匹配，通常通过对象</span>-<span>关系映射</span>(ORM)<span>解决</span>&nbsp;</p>
<p><span><span>&#183;&nbsp;</span></span><span>软件事务的四个特性</span>&nbsp;</p>
<p><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>原子性：要么全部成功，要么全部会滚</span></p>
<p><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>一致性：事务开始和完成时，资源都不应该被破坏</span></p>
<p><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>隔离性：事务成功完成之前，其影响不应该被看到</span></p>
<p><span><span>4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>持久性：事务不会因为任何崩溃而丢失更改</span>&nbsp;</p>
<p><span><span>&#183;&nbsp;</span></span><span>事务的隔离级别（由高而低）</span></p>
<p><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>可串行化：完全隔离，并发执行的结果与以某种顺序依次执行的结果相同</span></p>
<p><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>可重复读：允许幻读，更新者向集合中插入了一些元素而读的人只能看到其中一部分</span></p>
<p><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>读已提交：允许不可重复读，所有已经提交的数据都可以读</span></p>
<p><span><span>4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>读未提交：允许脏读，允许读未提交的数据</span>&nbsp;</p>
<p><span><span>&#183;&nbsp;</span></span><span>会话状态：无状态对象是一种不良设计；用无状态的服务器可以实现有状态的会话；如果有很多会话空闲，可以考虑用数据库存储会话；如果需要频繁访问会话，则应该使用服务器会话</span>&nbsp;</p>
<p><span><span>&#183;&nbsp;</span></span><span>分布策略：分布对象的第一定律：不要使用分布对象；分布对象的第二定律：节约使用分布对象</span></p>
领域逻辑模式分为 事物脚本、领域模型、表模块和服务层四种模式
<p>　　很多设计者喜欢把业务逻辑分成两类：领域逻辑和应用逻辑，前者只与问题领域有关、而后者有时被称为工作流逻辑</p>
<p>1.&nbsp;事物脚本</p>
<p>　　通过使用SQL语句或者存储过程返回记录集，记录集在系统的各层之间传递，在必要的时候可以通过更新记录集、使用SQL语句或者存储过程的方式更新数据库<br>　　事物脚本胜在简单，通常应用在小型的项目和系统中，但业务逻辑越来越复杂，使用这一模式就越来越难以保持良好设计，因为在程序里面充斥了大量的SQL语句和命令，一旦数据结构发生更改或者需要对系统进行修改，可能会出现许多难以发现的问题</p>
<p>2.&nbsp;领域模型</p>
<p>　　领域模型是合并了行为和数据的领域的对象模型，领域模型创建了一张由互联对象组成的网，其中的每个对象都代表着某个有意义的个体，可能大到一个公司或者小到订单的一行</p>
<p>　　简单领域可以使用活动记录，即简单的单条数据记录和单个对象对应的模式，一个对象对应数据库中的一个表</p>
<p>　　复杂领域模型需要使用数据映射器，它可能使用继承、策略或者其他的设计模式，是一张由互联的细粒度对象组成的复杂网络，我们经常会看到：多个类通过交互来完成很简单的任务</p>
<p>　　在面向对象技术中，通过从一个对象到另一个对象的连续传递可以把行为传递给最有资格处理的对象，它同时消除了很多条件判断行为</p>
<p>领域模型的要点在于隐藏数据库的存在</p>
<p>3.&nbsp;表模块</p>
<p>　　表模块是处理某一数据库表或视图中所有行的业务逻辑的一个实例</p>
<p>　　表模块通过强类型或弱类型的数据集与对象结合使用，使用主键查询数据，是.Net中使用的很多的一种模式，主要使用主键、半对象化的操作数据---之所以说是半结构化，是因为所用的对象基本上只具有行为，通过传入参数执行特定的操作或者查询记录集，而几乎不承载任何数据</p>
<p>　　在.net中，这种模式因为其容易和UI进行绑定和交互，所以倍受欢迎</p>
<p><br>4.&nbsp;服务层</p>
<p>　　通过一个服务层来定义应用程序边界，在服务层中建立一组可用的操作的集合，并在每个操作内部协调应用程序的响应</p>
<p>　　服务层是一种组织业务逻辑的模式，有点类似于业务外观；WEB SERVICE通常担任着服务层的角色</p>
<p>　　服务层可以通过领域外观方法和操作脚本方法实现，领域外观方法中，服务层以领域模型之上的瘦外观集合方式出现，负责实现外观的类中不不包含业务逻辑；而在操作脚本方法中 ，服务层由一组相对复杂的类组成，这些类直接实现应用逻辑，但将领域逻辑委托给封装好的领域对象类</p>
<p>&nbsp;　　服务层的类的接口是粗粒度的，适合于远程调用。但是，在开始时，我们应该仅设计一个本地调用的服务层，在需要远程调用时，再在服务层上增加一个远程外观。</p>
<br>并发管理的正确目标是尽量增加对数据的正确访问，同时减少冲突<br>　　离线并发模式有两种：使用乐观离线锁、使用悲观离线锁
<p>　　离线锁可以理解为一种非服务器管理的锁，或者说是自管理的锁，应用在适当的地方注册锁，获取数据，然后离线，并对数据进行离线的操作；其他的应用通过检测已经注册的锁来决定是否进行并发操作</p>
<p>1.&nbsp;悲观离线锁</p>
<p><br>&nbsp;　　悲观离线锁假设会话冲突的可能性很大，从而对系统的并发进性进行限制<br>&nbsp;　　在对不一致读的要求不高时，第一选择是使用独占写锁（不可以再添加任何读锁，当然写锁也不能）；如必须读出最新数据，而不在乎是否要修改，则应使用独占读锁（不可以再添加任何写锁，但读锁是允许的）。结合以上两种，提供互斥读锁的限制，又有互斥写锁的并发性的锁称为 读/写锁---读/写锁互斥不能同时加，但并发的读锁是允许的<br>&nbsp;　　构建悲观离线锁的步骤：决定使用哪种锁&gt;&gt;构建一个锁管理对象&gt;&gt;定义业务事务使用锁的过程<br>&nbsp;　　让锁管理对象在锁不可用时抛出异常而不是等待锁释放，可以免除死锁<br>&nbsp;　　悲观离线锁作为乐观离线锁的补充，只在真正需要的时候才应该使用&nbsp;</p>
<p><br>2.&nbsp;乐观离线锁</p>
<p>&nbsp;　　乐观离线锁假设会话冲突的可能性很小，从而使得多用户对一份数据进行处理成为可能<br>　　通过冲突检测和事务会滚来防止并发事务中的冲突<br>　　本质就是通过将会话中的版本号与当前记录数据的版本号相比较，事务成功提交以后版本号增加；或者在更新的SQL语句中包含对所有字段的检查，可以不需要为数据库增加版本字段，但可能导致性能损失<br>　　乐观离线锁必须自定检查以防止不一致读<br>　　一个高效的合并策略能使乐观离线锁变得非常强大，当冲突发生时，合并策略可以合并更改并重新提交</p>
<img src ="http://www.blogjava.net/zlsunnan/aggbug/133948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2007-08-02 10:46 <a href="http://www.blogjava.net/zlsunnan/archive/2007/08/02/133948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>经典台词</title><link>http://www.blogjava.net/zlsunnan/archive/2007/06/07/122566.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Thu, 07 Jun 2007 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2007/06/07/122566.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/122566.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2007/06/07/122566.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/122566.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/122566.html</trackback:ping><description><![CDATA[<p class=paragraph style="FONT-SIZE: 10.5pt">&nbsp;&nbsp; 　1． Life was like a box of chocolates, you never know what you&#8217;re gonna get. (生命就像一盒巧克力，结果往往出人意料)<br><br>　　2． Stupid is as stupid does. (蠢人做蠢事，也可理解为傻人有傻福)<br><br>　　3． Miracles happen every day. (奇迹每天都在发生)<br><br>　　4． Jenny and I was like peas and carrots.(我和珍妮形影不离)<br><br>　　5． Have you given any thought to your future?(你有没有为将来打算过呢)<br><br>　　6． You just stay away from me please.(求你离开我)<br><br>　　7． If you are ever in trouble, don&#8217;t try to be brave, just run, just run away.(你若遇上麻烦，不要逞强，你就跑，远远跑开)<br><br>　　8． It made me look like a duck in water.(它让我如鱼得水)<br><br>　　9． Death is just a part of life, something we&#8217;re all destined to do.(死亡是生命的一部分，是我们注定要做的一件事)<br><br>　　10． I was messed up for a long time.(这些年我一塌糊涂)<br><br>　　11． I don&#8217;t know if we each have a destiny, or if we&#8217;re all just floating around accidental—like on a breeze.(我不懂我们是否有着各自的命运，还是只是到处随风飘荡)<br></p>
<p class=paragraph style="FONT-SIZE: 10.5pt">&nbsp;</p>
<img src ="http://www.blogjava.net/zlsunnan/aggbug/122566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2007-06-07 13:33 <a href="http://www.blogjava.net/zlsunnan/archive/2007/06/07/122566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[struts]常见异常信息和解决方法</title><link>http://www.blogjava.net/zlsunnan/archive/2007/06/04/121776.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Mon, 04 Jun 2007 02:58:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2007/06/04/121776.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/121776.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2007/06/04/121776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/121776.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/121776.html</trackback:ping><description><![CDATA[<div class="postText">
<p>以下所说的struts-config.xml和ApplicationResources.properties等文件名是缺省时使用的，如果你使用了多模块，或指定了不同的资源文件名称，这些名字要做相应的修改。</p>
<p><strong>1、&#8220;No bean found under attribute key XXX&#8221;<br></strong>在struts-config.xml里定义了一个ActionForm，但type属性指定的类不存在，type属性的值应该是Form类的全名。或者是，在Action的定义中，name或attribute属性指定的ActionForm不存在。<br></p>
<p><strong>2、&#8220;Cannot find bean&nbsp;XXX in any scope&#8221;</strong><br>在Action
里一般会request.setAttribute()一些对象，然后在转向的jsp文件里（用tag或request.getAttribute()方
法）得到这些对象并显示出来。这个异常是说jsp要得到一个对象，但前面的Action里并没有将对象设置到request（也可以是session、
servletContext）里。<br>可能是名字错了，请检查jsp里的tag的一般是name属性，或getAttribute()方法的参数值；或者是Action逻辑有问题没有执行setAttribute()方法就先转向了。<br>还
有另外一个可能，纯粹是jsp文件的问题，例如&lt;logic:iterate&gt;会指定一个id值，然后在循环里&lt;bean:
write&gt;使用这个值作为name的值，如果这两个值不同，也会出现此异常。（都是一个道理，request里没有对应的对象。）<br></p>
<p><strong>3、&#8220;Missing message for key "XXX"&#8221;</strong><br>缺少所需的资源，检查ApplicationResources.properties文件里是否有jsp文件里需要的资源，例如：</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;">
<div><img  src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean:message&nbsp;key</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">msg.name.prompt</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span></div>
</div>
<p>这
行代码会找msg.name.prompt资源，如果AppliationResources.properties里没有这个资源就会出现本异常。在使
用多模块时，要注意在模块的struts-config-xxx.xml里指定要使用的资源文件名称，否则当然什么资源也找不到，这也是一个很容易犯的错
误。</p>
<p><strong>4、&#8220;No getter method for property&nbsp;XXX of bean teacher&#8221;</strong><br>这条异常信息说得很明白，jsp里要取一个bean的属性出来，但这个bean并没有这个属性。你应该检查jsp中某个标签的property属性的值。例如下面代码中的cade应该改为code才对：</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;">
<div><img  src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean:write&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">teacher</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;property</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">cade</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;filter</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span></div>
</div>
<br>
<p><strong>5、&#8220;Cannot find ActionMappings or ActionFormBeans collection&#8221;<br></strong>一般是因为struts-config.xml里面的&lt;action写错了。xml用手工写很容易出错&#8230;&#8230; <br><strong>6、&#8220;Cannot retrieve mapping for action XXX&#8221;<br></strong>在.jsp的&lt;form&gt;标签里指定action='/XXX'，但这个Action并未在struts-config.xml里设置过。</p>
<p><strong>7、HTTP Status 404 - /xxx/xxx.jsp<br></strong>Forward的path属性指向的jsp页面不存在，请检查路径和模块，对于同一模块中的Action转向，path中不应包含模块名；模块间转向，记住使用contextRelative="true"。</p>
<p><strong>8、没有任何异常信息，显示空白页面</strong><br>可能是Action里使用的forward与struts-config.xml里定义的forward名称不匹配。<br></p>
<p><strong>9、&#8220;The element type "XXX" must be terminated by the matching end-tag "XXX".&#8221;<br></strong>这个是struts-config.xml文件的格式错误，仔细检查它是否是良构的xml文件，关于xml文件的格式这里就不赘述了。</p>
<p><strong>10、&#8220;Servlet.init() for servlet action threw exception&#8221;</strong><br>一般出现这种异常在后面会显示一个关于ActionServlet的异常堆栈信息，其中指出了异常具体出现在代码的哪一行。我曾经遇到的一次提示如下：</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;">
<div><img  src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">java.lang.NullPointerException<br><img  src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.struts.action.ActionServlet.parseModuleConfigFile(ActionServlet.java:</span><span style="color: #000000;">1003</span><span style="color: #000000;">)<br><img  src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.struts.action.ActionServlet.initModuleConfig(ActionServlet.java:</span><span style="color: #000000;">955</span><span style="color: #000000;">)<br><img  src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><img  src="http://www.cnblogs.com/Images/dot.gif"></span></div>
</div>
<p><br>为解决问题，先下载struts的源码包，然后在ActionServlet.java的第1003行插入断点，并对各变量进行监视。很丢人，我竟然把struts-config.xml文件弄丢了，因此出现了上面的异常，应该是和CVS同步时不小心删除的。</p>
<p><strong>11、&#8220;Resources not defined for Validator&#8221;</strong><br>这个是利用Validator插件做验证时可能出现的异常，这时你要检查validation.xml文件，看里面使用的资源是否确实有定义，form的名称是否正确，等等。</p>
<p>上面这些是我在用Struts做项目时遇到过的问题，其中一些曾困绕我不少时间，其实大部分都是自己不细心造成的。希望这篇文章能对你的开发有所帮助，并欢迎继续补充。</p>
</div><img src ="http://www.blogjava.net/zlsunnan/aggbug/121776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2007-06-04 10:58 <a href="http://www.blogjava.net/zlsunnan/archive/2007/06/04/121776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBPM BLOG</title><link>http://www.blogjava.net/zlsunnan/archive/2007/04/16/110909.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Mon, 16 Apr 2007 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2007/04/16/110909.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/110909.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2007/04/16/110909.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/110909.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/110909.html</trackback:ping><description><![CDATA[<a href="http://www.blogjava.net/chengang">http://www.blogjava.net/chengang</a><br><br><a href="http://blog.csdn.net/dust_bug">http://blog.csdn.net/dust_bug</a>
<img src ="http://www.blogjava.net/zlsunnan/aggbug/110909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2007-04-16 11:07 <a href="http://www.blogjava.net/zlsunnan/archive/2007/04/16/110909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在线印章</title><link>http://www.blogjava.net/zlsunnan/archive/2006/08/30/66623.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Wed, 30 Aug 2006 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2006/08/30/66623.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/66623.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2006/08/30/66623.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/66623.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/66623.html</trackback:ping><description><![CDATA[
		<a href="http://caishu.unihan.com.cn/de-webKZ.asp">http://caishu.unihan.com.cn/de-webKZ.asp</a>
		<br />
		<br />
		<a href="http://www.makepic.com/">http://www.makepic.com/</a>
		<br />
		<img height="120" alt="20064917571421224.gif" src="http://www.blogjava.net/images/blogjava_net/zlsunnan/20064917571421224.gif" width="120" border="0" />
		<br />
		<br />
		<img height="124" alt="printpic.gif" src="http://www.blogjava.net/images/blogjava_net/zlsunnan/printpic.gif" width="124" border="0" /> <br /><br /><a href="http://flashface.ctapt.de/">http://flashface.ctapt.de/</a><br /><br /><a href="http://www.eoool.com/" target="_blank">http://www.eoool.com</a><img src ="http://www.blogjava.net/zlsunnan/aggbug/66623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2006-08-30 11:38 <a href="http://www.blogjava.net/zlsunnan/archive/2006/08/30/66623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>成为一个好的系统分析员</title><link>http://www.blogjava.net/zlsunnan/archive/2006/08/28/66158.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Mon, 28 Aug 2006 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2006/08/28/66158.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/66158.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2006/08/28/66158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/66158.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/66158.html</trackback:ping><description><![CDATA[
		<span class="javascript" id="text87199" style="FONT-SIZE: 12px">
				<font face="Verdana">如何成为一个好的系统分析员<br />truely眼中的设计定义：设计的过程就是将事务处理抽象成计算机模型的过程。 <br />1. 首先要明白设计远比编程重要。 <br />2. 平时注重训练自己的思维严谨性和从全局考虑问题的能力。建立冷静思考问题的处事态度。 <br />3. 设计时（尤其是数据库设计时）不要完全被规矩约束，设计好比作诗，懂得韵律是对的，但完全被韵 律所束缚，就作不出好诗了。 <br />4. 多做设计，经常总结自己的不足之处和成功之处，向他人请教。 <br />5. 专门去找别人设计的漏洞和不足，也是提高自己设计水平的重要手段。 <br />（记住：这个好方法不要顺便外传，自己知道就行了，嘻嘻-:） <br />6. 经验是重要的，但如果观念老化而不善于总结提高，所谓的经验就成为束缚自己进步的枷锁。 <br />7. 学好数学特别是理论数学如数学分析、运筹学、数学模型等。多玩策略性经营游戏也是有益的。推荐 《帝国时代》和《模拟首都3000》以及《大富翁4》。（但不要沉陷在里面） <br />8. 根据项目情况和开发平台工具的特点确定最佳的设计方法。模块化设计方法和面向对象设计。两种设 计方法的结合使用。 <br />9. 将复杂无序的过程用模块化的方法进行分解，但要注重事务间的联系，并且用开放的眼光去设计。 <br />10. 设计时对严谨性、灵活性、开发效率、客户要求四个方面做衡量取舍。 <br />11. 设计时还要根据整个工程的进度安排和客户对软件的要求而决定是否设计得足够灵活和严谨。 <br />12. 复杂而无条理是最糟的设计，简单实用并不一定是最好的，但一定不是最坏的。（不要说我偷懒哟） <br />13. 训练自己良好的表达能力，能用清晰明确而且简单的描述表达出自己的基本思路。 <br />14. 在一个项目中建立统一的系统分析模式和文档模板，同时，一个项目中必须至少有一个人对整个系统 设计进行检查和进行全局的考虑。 <br />再谈如何成为一个好的系统分析员？ <br /><br />bylsfboy <br /><br />系统分析员基本功： <br /><br />好的系统分析员都是从优秀的程序员中产生的，坚实的编程功底、丰富的经验是今后做系统分析的基础。 <br />没有对系统本身进行过透彻剖析过，很难领会到其中一些难以言述的精华。但并不等于好的程序员就能够 成为好的系统分析员。 <br /><br />合理的知识结构。语言能力、文字表达能力、技术的全面性等是对系统分析员的基本要求。比如说c/s和3 层开发，如果仅仅对netscape公司的产品熟悉还不够，还需要了解比如微软等产品，并且要了解他们中产 生历史,发展思路，技术优劣，以应付各种穷追猛打的提问。但更重要的是，这是你为应用定制技术要求 的前提。 <br /><br />系统分析员思想： <br /><br />全局观念是系统分析员必须具备的观念。如果系统分析员设计时太注重细节，往往会陷入在某个问题上纠 缠不清的泥潭。（93年，我论文指导老师的一席话影响了我随后几年对软件开发的理解----今后计算机会 越来越快，多写几行代码少写代码无关紧要，最重要的是整体；一开始就错了，某个部份编得再好，也是 没有用的） <br /><br />任务难度的预测能力 <br /><br />系统分析员要具备快速的任务难度预测能力以及具备快速确定开发小组人员构成和任务划分的能力。（我 将这条归为思想，而不是能力）昆虫自然会长出翅膀，而思想却需要长期的浸润。要做到这点，需要大量 的思考、学习。设计远比编程重要。当今软件业的发展，各种开发工具的出现，编程已经不是什么问题， 程序员的工作某种程度上讲是将别人现成的东西拼凑堆砌起来。系统分析员要清楚的认识到，现在大多数 程序员没有学会怎么去整体的了解一个系统，有些甚至不了解编程（这不是说他们不会写代码）。可视化 的开发工具加五花八门的控件，程序员可以偷点懒了。（这可不是夸大，我好几年的管理工作，接触过大 量的程序员）基于技术，跳出框架。基于现有技术结合用户需求思考问题，设计时跳出框架。 <br /><br />系统分析员思想： <br /><br />系统分析员要有面向用户的思想。系统分析员应当有能力将自己扮演成用户，来了解要交付的项目看起来 想什么样式，感觉想什么，从而了解用户的想法并挑选出合理部份去开发。从这个意义上说，系统分析员 才能获得有意义的见解去引导他的开发组成员。系统分析员头脑中要对项目结局有一个清楚的认识，并保 证项目不偏离方向。系统分析员要有根植于技术，高于技术思考问题的思想。纯粹的程序员通常对最终结 果考虑的不是很多，当一种新的技术在市场上出现时，他们对能否按时交付的考虑就比较少，而强烈希望 他们的计划能够建立在新的技术之上。因此，系统分析员的想法和行动要象一个用户，又要能够站在技术 的高度，成为真正的用户、程序员之间的代言人。 <br /><br />系统分析员的关键 <br /><br />获得信任。系统分析员最重要的素质是获得信任，这是成为优秀系统分析员的关键。成熟最为关键。成熟 可以为整个项目组提供正确的支持,能够理解技术怎样才能解决用户的需求。 <br /><br />系统分析员的准备工作 <br /><br />统一的各种文档模式，这其中包括今后软件变量、字段命名规则。我推荐用pb制定的规则做基础，通过改 造成为适合自身实用的标准。统一的文档管理。统一的分析软件。比如说rose（uml太规范，国内的软件 管理水平根本用不上，只不过尽量应用，你自己对系统分析的理解有好处） 方法是思想的放映，在具体方法上就不多说了。我托人从u$a弄到几本书，用于面向对象系统开发的使 用》、《面向对象的分析》、《项目管理》等都是很不错的，推荐大家看看。 <br /><br />我在拙作"在中国没有人懂计算机"里发了点牢骚，听说挨了部份人（习惯性的）骂。其实，bbs本来就是 发泄的地方，在这里从来就罕有有内容的文章。 <br /><br />自从"维纳斯"登陆深圳后，大家更着眼于从宏观看中国的it业了。中国it这棵小树，说实在的，长到今天 实在是不容易。一些人提出了"反对微软霸权"的口号，不少人呼唤中国"硅谷"的出现。微软的成功不是技 术的成功，更多的是商业运作的成功。中国it这棵树能长多高，取决于他所植根于的土壤。而现在的事实是，这片土壤实在是太贫瘠了！如果按我们现在的思路和搞法，是长不成大树，更别指望能结出"微 软"，"硅谷"这样丰硕的果实。如果说，我们的软件技术落后美国十年，我们的硬件制造技术则落后美国 二十年，我们的管理水平落后美国至少三十年。而最终决定发展速率的恰恰是我们的死穴──低劣的管理 水平。低劣的管理水平的形成的原因有着深厚的背景和多方面的原因。 <br /><br />系统分析工作是解决一个问题的工作,目标是将一个对计算机应用系统的需求转化成实际的物理实现,其中 复杂就复杂在实际的面太多.在系统分析过程之中注意问以下的问题,可能会所进行的系统分析设计工作有 帮助. <br /><br />1)您所完成的系统目的是什么?注意不是功能要求,而是目的.也就是为什么要建设、为什么要现代建设。 <br /><br />2）您所完成的系统有哪些方面参与，各方面的初衷是什么？那些人可能在系统建设中起重要作用，他们 会采取什么样的态度？你对他们有多少影响力？ <br /><br />3）您的系统是否有一个明确的评价标准？最好从参与的各方面都进行考虑。 <br /><br />4）你的系统设计思想是什么？是否能够得到各方面的认可。 <br /><br />5）你对参与系统设计开发的人员了解吗？他们的特长在哪里，是否愿意与你合作，为什么？你对他们有 足够的影响力吗？ <br /><br />6）你的系统开发计划是否完善？你的计划表有明确的阶段吗？任何一阶段都应该怎样完成？如何对这一 阶段完成的情况进行评价？ <br /><br />7）你对所采用的系统开发方法以及工具是否熟悉？你的夥伴是否熟悉？ <br /><br />8）你所完成的系统是否有原型？计算机的或者物理的。 <br /><br />以上的几个问题都是在系统分析以及系统规划时涉及到的，供各位参考。 <br /><br />系统分析工作是解决一个问题的工作,目标是将一个对计算机应用系统的需求转化成实际的物理实现,其中 复杂就复杂在实际的面太多.在系统分析过程之中注意问以下的问题,可能会所进行的系统分析设计工作有帮助 <br /><br />1)您所完成的系统目的是什么?注意不是功能要求,而是目的.也就是为什么要建设、为什么要现代建设。在考虑系统目的时，我更多的侧重于系统的最终目标考虑，因为一个系统不可能一下子完美，为系统留些 余地。 <br /><br />2）您所完成的系统有哪些方面参与，各方面的初衷是什么？那些人可能在系统建设中起重要作用，他们 会采取什么样的态度？你对他们有多少影响力？中国it行业的失败之一就是人"太年轻"，一定要有领导的 支持，否则完蛋。不要认为自己对他们会有多少影响力，即便有，也要尽可能的认为是决策者再影响他 们。在中国，一个技术员，你算老几？说到这里我很悲哀。哪些人在系统中起重要作用并弄清楚他们的态 度，这点十分关键。 <br /><br />3）您的系统是否有一个明确的评价标准？最好从参与的各方面都进行考虑。不知道这样说对不对，在系 统建设之前，对你的程序员、对你的领导要有至少不同的两种评价。 <br /><br />4）你的系统设计思想是什么？是否能够得到各方面的认可。如果高明，对领导、对程序员都采用引导， 得到认可的最好办法，就是让他们认可他们自己的想法。（我力图这样做，但做得不好，系统分析员有一 点要学会韬光养晦，忍） <br /><br />5）你对参与系统设计开发的人员了解吗？他们的特长在哪里，是否愿意与你合作，为什么？你对他们有 足够的影响力吗？软件发展到一定的程度，不是编程，不是数学，而是管理。 <br /><br />6）你的系统开发计划是否完善？你的计划表有明确的阶段吗？任何一阶段都应该怎样完成？如何对这一 阶段完成的情况进行评价？ <br /><br />7）你对所采用的系统开发方法以及工具是否熟悉？你的夥伴是否熟悉？事实上，不是每种好的工具都要 使用，也并不一定都要他们熟练掌握。提醒诸位一句，当你将方案做得可以不依赖某个程序员，你在程序 员面前就无信任可言，因为从此程序员将受到更大的生存压力。我坚决不在公司使用rose。 <br /><br />8）你所完成的系统是否有原型？计算机的或者物理的。 <br /><br />以上的几个问题都是在系统分析以及系统规划时涉及到的，供各位参考。 <br /><br />这文章很好，我的话是："需求分析实际应该是问题分析"。含义是系统要解决的是问题。而不是用户提出 的需求。经常发现系统完成后，客户说"我的问题还没有解决"。可是，需求分析稿上的目标都搞定了。 <br /><br />既然是问题分析，所以，熟悉目标系统的知识就是必要的。甚至，可以说，一个好的系统分析员也应该是 好的业务专家。 <br /><br />我很高兴在这里遇到许多分析高手，可以交流分析中的问题。我赞同从来的观点。在中国作分析重要的是 人气，因为中国的企业级信息系统的建设在很大程度上可以说并非确有需求，而是迫于某种压力。用户在 很多时候考虑的不是系统的长远发展，而只是短期的成果，要求开发单位在很短的时间内完成一个很大的 系统的开发，没有时间对系统进行周密的分析，在这种情况下，很多开发商就会粗分析，粗设计，尽快进 入编码阶段，这样的系统的生命周期肯定不会很长。说了这么多，只是想说，系统分析员确实应是业务和 管理专家，并且需要有很好的语言组织能力，他需要根据问题域中存在的问题去尽力说服用户，引导用户 需求，毕竟，我们是专家，如果让用户牵着鼻子走，系统不会是成功的系统。（当然了，这要建立在用户 是可引导的前提下）本人拙见。 <br /><br />在理解和分析用户的需求时，应说服用户明白：建立计算机应用系统并不是简单地用计算机代替手工劳 <br />作，它更应该是管理思想的一次革命，是现用户模式的一次升华和提高。如果系统不能高于现实，开发的系统将长期陷入需求的反复修改，其软件的生命周期也短了。 <br /><br />针对我对您的问题的理解,试着作如下一般性/理论性的回复: <br /><br />需求分析(您可以采用usecasedriven的方法进行需求分析)在明确需求分析的基础上,确定需要采用的系统分析方法(结构化/面向对象/构件式)应用您的开发团队所确定采用的分析/设计方法,进行系统分析.根据您所采用的分析方法,依次或反复进行系统设计/建模. </font>
				<br />
		</span>
<img src ="http://www.blogjava.net/zlsunnan/aggbug/66158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2006-08-28 13:41 <a href="http://www.blogjava.net/zlsunnan/archive/2006/08/28/66158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Tag 参考手册</title><link>http://www.blogjava.net/zlsunnan/archive/2006/08/18/64392.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Fri, 18 Aug 2006 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2006/08/18/64392.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/64392.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2006/08/18/64392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/64392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/64392.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: hibernate Tag										参考																																												用来声明				Hibernate				描述文件的				Tags				：																														...&nbsp;&nbsp;<a href='http://www.blogjava.net/zlsunnan/archive/2006/08/18/64392.html'>阅读全文</a><img src ="http://www.blogjava.net/zlsunnan/aggbug/64392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2006-08-18 16:40 <a href="http://www.blogjava.net/zlsunnan/archive/2006/08/18/64392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XDoclet(ant)生成Hibernate映射文件 </title><link>http://www.blogjava.net/zlsunnan/archive/2006/08/18/64389.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Fri, 18 Aug 2006 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2006/08/18/64389.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/64389.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2006/08/18/64389.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/64389.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/64389.html</trackback:ping><description><![CDATA[java---&gt;XDoclet(hibernatedoclet)---&gt;Hbm----&gt;SchemaExport(schemaexport,hbm2ddl)----&gt;数据表<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img id="Codehighlighter1_0_35_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_35_Open_Text.style.display='none'; Codehighlighter1_0_35_Closed_Image.style.display='inline'; Codehighlighter1_0_35_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_0_35_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_35_Closed_Text.style.display='none'; Codehighlighter1_0_35_Open_Image.style.display='inline'; Codehighlighter1_0_35_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span id="Codehighlighter1_0_35_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_0_35_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000">/ /* <br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * Created on 2006-4-7<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />  </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> <br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000">  com.entity;<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img id="Codehighlighter1_64_69_Open_Image" onclick="this.style.display='none'; Codehighlighter1_64_69_Open_Text.style.display='none'; Codehighlighter1_64_69_Closed_Image.style.display='inline'; Codehighlighter1_64_69_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_64_69_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_64_69_Closed_Text.style.display='none'; Codehighlighter1_64_69_Open_Image.style.display='inline'; Codehighlighter1_64_69_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span><span id="Codehighlighter1_64_69_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_64_69_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"> </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_71_188_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_71_188_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"> <br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> *  </span><span style="COLOR: #808080">@author</span><span style="COLOR: #008000">  jkallen<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * @hibernate.class lazy="true" table="syn_dept"<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * @hibernate.cache usage="read-write"<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />  </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id="Codehighlighter1_225_808_Open_Image" onclick="this.style.display='none'; Codehighlighter1_225_808_Open_Text.style.display='none'; Codehighlighter1_225_808_Closed_Image.style.display='inline'; Codehighlighter1_225_808_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_225_808_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_225_808_Closed_Text.style.display='none'; Codehighlighter1_225_808_Open_Image.style.display='inline'; Codehighlighter1_225_808_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">   </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">  SynDepartment   </span><span id="Codehighlighter1_225_808_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_225_808_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> <br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img id="Codehighlighter1_231_236_Open_Image" onclick="this.style.display='none'; Codehighlighter1_231_236_Open_Text.style.display='none'; Codehighlighter1_231_236_Closed_Image.style.display='inline'; Codehighlighter1_231_236_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_231_236_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_231_236_Closed_Text.style.display='none'; Codehighlighter1_231_236_Open_Image.style.display='inline'; Codehighlighter1_231_236_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span id="Codehighlighter1_231_236_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_231_236_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"> </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_238_250_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_238_250_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000">  主键 id </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">  Long id;<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img id="Codehighlighter1_275_280_Open_Image" onclick="this.style.display='none'; Codehighlighter1_275_280_Open_Text.style.display='none'; Codehighlighter1_275_280_Closed_Image.style.display='inline'; Codehighlighter1_275_280_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_275_280_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_275_280_Closed_Text.style.display='none'; Codehighlighter1_275_280_Open_Image.style.display='inline'; Codehighlighter1_275_280_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span id="Codehighlighter1_275_280_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_275_280_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"> </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_282_293_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_282_293_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000">  部门名称 </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">  String code_name;<br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> <br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img id="Codehighlighter1_329_334_Open_Image" onclick="this.style.display='none'; Codehighlighter1_329_334_Open_Text.style.display='none'; Codehighlighter1_329_334_Closed_Image.style.display='inline'; Codehighlighter1_329_334_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_329_334_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_329_334_Closed_Text.style.display='none'; Codehighlighter1_329_334_Open_Image.style.display='inline'; Codehighlighter1_329_334_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span id="Codehighlighter1_329_334_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_329_334_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"> </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_336_430_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_336_430_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"> <br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  *  </span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000">  Returns the id.<br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  * @hibernate.id generator-class="native" column="id"<br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img id="Codehighlighter1_462_480_Open_Image" onclick="this.style.display='none'; Codehighlighter1_462_480_Open_Text.style.display='none'; Codehighlighter1_462_480_Closed_Image.style.display='inline'; Codehighlighter1_462_480_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_462_480_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_462_480_Closed_Text.style.display='none'; Codehighlighter1_462_480_Open_Image.style.display='inline'; Codehighlighter1_462_480_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">  Long getId()   </span><span id="Codehighlighter1_462_480_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_462_480_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">  id;<br /></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span></span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img id="Codehighlighter1_518_541_Open_Image" onclick="this.style.display='none'; Codehighlighter1_518_541_Open_Text.style.display='none'; Codehighlighter1_518_541_Closed_Image.style.display='inline'; Codehighlighter1_518_541_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_518_541_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_518_541_Closed_Text.style.display='none'; Codehighlighter1_518_541_Open_Image.style.display='inline'; Codehighlighter1_518_541_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">   </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">  setId(Long id)   </span><span id="Codehighlighter1_518_541_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_518_541_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000"> .id  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  id;<br /></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span></span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img id="Codehighlighter1_547_552_Open_Image" onclick="this.style.display='none'; Codehighlighter1_547_552_Open_Text.style.display='none'; Codehighlighter1_547_552_Closed_Image.style.display='inline'; Codehighlighter1_547_552_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_547_552_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_547_552_Closed_Text.style.display='none'; Codehighlighter1_547_552_Open_Image.style.display='inline'; Codehighlighter1_547_552_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span><span id="Codehighlighter1_547_552_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_547_552_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"> </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_554_651_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_554_651_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"> <br /></span><span style="COLOR: #008080">30</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    *  </span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000">  Returns the code_name.<br /></span><span style="COLOR: #008080">31</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    * @hibernate.property column = "code_name"<br /></span><span style="COLOR: #008080">32</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img id="Codehighlighter1_689_714_Open_Image" onclick="this.style.display='none'; Codehighlighter1_689_714_Open_Text.style.display='none'; Codehighlighter1_689_714_Closed_Image.style.display='inline'; Codehighlighter1_689_714_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_689_714_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_689_714_Closed_Text.style.display='none'; Codehighlighter1_689_714_Open_Image.style.display='inline'; Codehighlighter1_689_714_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">  String getCode_name()   </span><span id="Codehighlighter1_689_714_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_689_714_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">  code_name;<br /></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span></span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img id="Codehighlighter1_768_805_Open_Image" onclick="this.style.display='none'; Codehighlighter1_768_805_Open_Text.style.display='none'; Codehighlighter1_768_805_Closed_Image.style.display='inline'; Codehighlighter1_768_805_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_768_805_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_768_805_Closed_Text.style.display='none'; Codehighlighter1_768_805_Open_Image.style.display='inline'; Codehighlighter1_768_805_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">   </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">  setCode_name(String code_name)   </span><span id="Codehighlighter1_768_805_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_768_805_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000"> .code_name  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  code_name;<br /></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span></span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>这里用到了几种@hibernate标记的用法<br />@hibernate.class标记指定类的映射代码，lazy="true" table="syn_dept"则如<br />hibernate的映射文件class元素的属性值具有相同的意义<br />@hibernate.id标记指定类的OID映射代码<br />@hibernate.property标记指定类的属性映射代码<br />另外还可能用到@hibernate.set(如一对多的情况下)
<p><strong>2:XDoclet---&gt;Hbm(写在build.xml文件中，ANT运行)<br /></strong></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">target </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="toHbm"</span><span style="COLOR: #ff0000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  depends</span><span style="COLOR: #0000ff">="compileEntity"</span><span style="COLOR: #ff0000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  description</span><span style="COLOR: #0000ff">="Generate hibernate mapping documents"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">hibernatedoclet </span><span style="COLOR: #ff0000">destdir</span><span style="COLOR: #0000ff">="${generated.dir}"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">fileset </span><span style="COLOR: #ff0000">dir</span><span style="COLOR: #0000ff">="${src.dir}"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="**/entity/*.java"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">fileset</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">hibernate </span><span style="COLOR: #ff0000">version</span><span style="COLOR: #0000ff">="2.0"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">hibernatedoclet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">copy </span><span style="COLOR: #ff0000">todir</span><span style="COLOR: #0000ff">="${classes.dir}"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">fileset </span><span style="COLOR: #ff0000">dir</span><span style="COLOR: #0000ff">="${generated.dir}"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">copy</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">target</span><span style="COLOR: #0000ff">&gt;</span></div><p><br />通过hibernatedoclet就可以生成SynDepartment.hbm.xml映射文件<br />fileset顾名思义就是过滤文件了。<br />注：compileEntity--编译java源文件(自定义)</p><p><strong>3:SchemaExport----&gt;数据表</strong><br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">target </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="toddl"</span><span style="COLOR: #ff0000"> depends</span><span style="COLOR: #0000ff">="init"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">schemaexport </span><span style="COLOR: #ff0000">properties</span><span style="COLOR: #0000ff">="${classes.dir}/hibernate.properties"</span><span style="COLOR: #ff0000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   quiet</span><span style="COLOR: #0000ff">="no"</span><span style="COLOR: #ff0000"> text</span><span style="COLOR: #0000ff">="no"</span><span style="COLOR: #ff0000"> drop</span><span style="COLOR: #0000ff">="no"</span><span style="COLOR: #ff0000">    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   delimiter</span><span style="COLOR: #0000ff">="&amp;#xd;&amp;#xa;go&amp;#xd;&amp;#xa;"</span><span style="COLOR: #ff0000"> output</span><span style="COLOR: #0000ff">="${sql.dir}/${synup.sql.file}"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">fileset </span><span style="COLOR: #ff0000">refid</span><span style="COLOR: #0000ff">="hibernate.synup.mapping.files"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">schemaexport</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">echo </span><span style="COLOR: #ff0000">message</span><span style="COLOR: #0000ff">="Output sql to file: ${sql.dir}/${sql.file}"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">target</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">fileset </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="hibernate.synup.mapping.files"</span><span style="COLOR: #ff0000"> dir</span><span style="COLOR: #0000ff">="${classes.dir}"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="**/entity/*.hbm.xml"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">fileset</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><p><br /> 通过schemaexport就向DB中生成table了。其中可能用到如下的一些属性：<br /> quiet：如果为yes,表示不把子DDL脚本输出到控制台<br /> drop：如果为yes，只执行删除数据库中的操作，但不创建新的表<br /> text：如果为yes，只会生成DDL脚本文件，但不会在数据库中执行DDL脚本<br /> output：指定存放DDL脚本文件的目录<br /> config：设定基于XML格式的配置文件， hbm2ddl(schemaexport)工具从这个文件中读取数据库的配置信息<br /> properties：设定基于java属性文件格式的配置文件，hbm2ddl(schemaexport)工具从这个文件中读取DB的配置信息<br /> format：设定DDL脚本中SQL语句的格式<br /> delimiter：为DDL脚本设置行结束符<br /> <br /> 在ANT中执行：<br /> &lt;target name="initOnlySynup" depends="toHbm,toddl"&gt;<br /> &lt;/target&gt;<br /> <br /> OK,最后生成的映射文件如下：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml version="1.0"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE hibernate-mapping PUBLIC<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    "-//Hibernate/Hibernate Mapping DTD 2.0//EN" <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">hibernate-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">class<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="com.SynDepartment"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        table</span><span style="COLOR: #0000ff">="syn_dept"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        dynamic-update</span><span style="COLOR: #0000ff">="false"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        dynamic-insert</span><span style="COLOR: #0000ff">="false"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">cache </span><span style="COLOR: #ff0000">usage</span><span style="COLOR: #0000ff">="read-write"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">id<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="id"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            column</span><span style="COLOR: #0000ff">="id"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            type</span><span style="COLOR: #0000ff">="java.lang.Long"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">generator </span><span style="COLOR: #ff0000">class</span><span style="COLOR: #0000ff">="native"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">generator</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">id</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="code_name"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            type</span><span style="COLOR: #0000ff">="java.lang.String"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            update</span><span style="COLOR: #0000ff">="true"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            insert</span><span style="COLOR: #0000ff">="true"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            access</span><span style="COLOR: #0000ff">="property"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            column</span><span style="COLOR: #0000ff">="code_name"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            To add non XDoclet property mappings, create a file named<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                hibernate-properties-SynDepartment.xml<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            containing the additional properties and place it in your merge dir.<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">hibernate-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><p><br /> 控制台中部分信息如下：</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">[schemaexport] drop table syn_dept cascade constraints<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />[schemaexport] go<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />[schemaexport] drop sequence hibernate_sequence<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />[schemaexport] go<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />[schemaexport] create table syn_dept (<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />[schemaexport] id number(19,0) not null,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />[schemaexport] code_name varchar2(255),<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />[schemaexport] primary key (id)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />[schemaexport] )</span></div><p>DB中已经生成syn_dept表了,快去看下吧!<br /><br />关于Xdoclet 中的hibernate标签更多信息可以参考：<br /><a href="http://xdoclet.sourceforge.net/xdoclet/tags/hibernate-tags.html#@hibernate_collection-key__0__1"><font color="#000080">http://xdoclet.sourceforge.net/xdoclet/tags/hibernate-tags.html#@hibernate_collection-key__0__1</font></a>_<br />我还在一个网友的博客上看到了他对此的汉化：<br /><a href="http://blog.csdn.net/fasttalk/archive/2005/09/19/484615.aspx"><font color="#000080">http://blog.csdn.net/fasttalk/archive/2005/09/19/484615.aspx</font></a><br /></p><img src ="http://www.blogjava.net/zlsunnan/aggbug/64389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2006-08-18 16:36 <a href="http://www.blogjava.net/zlsunnan/archive/2006/08/18/64389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>写出高质量软件</title><link>http://www.blogjava.net/zlsunnan/archive/2006/08/18/64259.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Fri, 18 Aug 2006 01:27:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2006/08/18/64259.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/64259.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2006/08/18/64259.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/64259.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/64259.html</trackback:ping><description><![CDATA[1. 你们的项目组使用源代码管理工具了么？<br /><br />　　MVM：应该用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的选择是VSS。<br /><br />　　2. 你们的项目组使用缺陷管理系统了么？<br /><br />　　MVM：应该用。ClearQuest太复杂，我的推荐是BugZilla。<br /><br />　　3. 你们的测试组还在用Word写测试用例么？<br /><br />　　MVM：不要用Word写测试用例（Test Case）。应该用一个专门的系统，可以是Test Manager，也可以是自己开发一个ASP.NET的小网站。主要目的是Track和Browse。<br /><br />　　4. 你们的项目组有没有建立一个门户网站？<br /><br />　　MVM：要有一个门户网站，用来放Contact Info、Baselined Schedule、News等等。推荐Sharepoint Portal Server 2003来实现，15分钟就搞定。买不起SPS 2003可以用WSS (Windows Sharepoint Service)。<br /><br />　　5. 你们的项目组用了你能买到最好的工具么？<br /><br />　　MVM：应该用尽量好的工具来工作。比如，应该用VS.NET而不是Notepad来写C#。用Notepad写程序多半只是一种炫耀。但也要考虑到经费，所以说是“你能买到最好的”。<br /><br />　　6. 你们的程序员工作在安静的环境里么？<br /><br />　　MVM：需要安静环境。这点极端重要，而且要保证每个人的空间大于一定面积。<br /><br />　　7. 你们的员工每个人都有一部电话么？<br /><br />　　MVM：需要每人一部电话。而且电话最好是带留言功能的。当然，上这么一套带留言电话系统开销不小。不过至少每人一部电话要有，千万别搞得经常有人站起来喊：“某某某电话”。《人件》里面就强烈谴责这种做法。<br /><br />　　8. 你们每个人都知道出了问题应该找谁么？<br /><br />　　MVM：应该知道。任何一个Feature至少都应该有一个Owner，当然，Owner可以继续Dispatch给其他人。<br /><br />　　9. 你遇到过有人说“我以为…”么？<br /><br />　　MVM：要消灭“我以为”。Never assume anything。<br /><br />　　10. 你们的项目组中所有的人都坐在一起么？<br /><br />　　MVM：需要。我反对Virtual Team，也反对Dev在美国、Test在中国这种开发方式。能坐在一起就最好坐在一起，好处多得不得了。<br /><br />　　11. 你们的进度表是否反映最新开发进展情况？ <br /><br />　　MVM：应该反映。但是，应该用Baseline的方法来管理进度表：维护一份稳定的Schedule，再维护一份最新更改。Baseline的方法也应该用于其它的Spec。Baseline是变更管理里面的一个重要手段。<br /><br />　　12. 你们的工作量是先由每个人自己估算的么？<br /><br />　　MVM：应该让每个人自己估算。要从下而上估算工作量，而不是从上往下分派。除非有其他原因，比如政治任务工期固定等。<br /><br />　　13. 你们的开发人员从项目一开始就加班么？<br /><br />　　MVM：不要这样。不要一开始就搞疲劳战。从项目一开始就加班，只能说明项目进度不合理。当然，一些对日软件外包必须天天加班，那属于剥削的范畴。<br /><br />　　14. 你们的项目计划中Buffer Time是加在每个小任务后面的么？<br /><br />　　MVM：不要。Buffer Time加在每个小任务后面，很容易轻易的就被消耗掉。Buffer Time要整段的加在一个Milestone或者checkpoint前面。<br /><br />　　15. 值得再多花一些时间，从95%做到100%好<br /><br />　　MVM：值得，非常值得。尤其当项目后期人困马乏的时候，要坚持。这会给产品带来质的区别。<br /><br />16. 登记新缺陷时，是否写清了重现步骤？<br /><br />　　MVM：要。这属于Dev和Test之间的沟通手段。面对面沟通需要，详细填写Repro Steps也需要。<br /><br />　　17. 写新代码前会把已知缺陷解决么？<br /><br />　　MVM：要。每个人的缺陷不能超过10个或15个，否则必须先解决老的bug才能继续写新代码。<br /><br />　　18. 你们对缺陷的轻重缓急有事先的约定么？<br /><br />　　MVM：必须有定义。Severity要分1、2、3，约定好：蓝屏和Data Lost算Sev 1，Function Error算Sev 2，界面上的算Sev 3。但这种约定可以根据产品质量现状适当进行调整。<br /><br />　　19. 你们对意见不一的缺陷有三国会议么？<br /><br />　　MVM：必须要有。要有一个明确的决策过程。这类似于CCB (Change Control Board)的概念。<br /><br />　　20. 所有的缺陷都是由登记的人最后关闭的么？<br /><br />　　MVM：Bug应该由Opener关闭。Dev不能私自关闭Bug。<br /><br />　　21. 你们的程序员厌恶修改老的代码么？<br /><br />　　MVM：厌恶是正常的。解决方法是组织Code Review，单独留出时间来。XP也是一个方法。<br /><br />　　22. 你们项目组有Team Morale Activity么？<br /><br />　　MVM：每个月都要搞一次，吃饭、唱歌、Outing、打球、开卡丁车等等，一定要有。不要剩这些钱。<br /><br />　　23. 你们项目组有自己的Logo么？<br /><br />　　MVM：要有自己的Logo。至少应该有自己的Codename。<br /><br />　　24. 你们的员工有印有公司Logo的T-Shirt么？<br /><br />　　MVM：要有。能增强归属感。当然，T-Shirt要做的好看一些，最好用80支的棉来做。别没穿几次就破破烂烂的。<br /><br />　　25. 总经理至少每月参加次项目组会议<br /><br />　　MVM：要的。要让team member觉得高层关注这个项目。<br /><br />　　26. 你们是给每个Dev开一个分支么？<br /><br />　　MVM：反对。Branch的管理以及Merge的工作量太大，而且容易出错。<br /><br />　　27. 有人长期不Check-In代码么？<br /><br />　　MVM：不可以。对大部分项目来说，最多两三天就应该Check-In。<br /><br />　　28. 在Check-In代码时都填写注释了么？<br /><br />　　MVM：要写的，至少一两句话，比如“解决了Bug No.225”。如果往高处拔，这也算做“配置审计”的一部分。<br /><br />　　29. 有没有设定每天Check-In的最后期限？<br /><br />　　MVM：要的，要明确Check-In Deadline。否则会Build Break。<br /><br />　　30. 你们能把所有源码一下子编译成安装文件吗？ <br /><br />　　MVM：要的。这是每日编译（Daily Build）的基础。而且必须要能够做成自动的。<br /><br />31. 你们的项目组做每日编译么？<br /><br />　　MVM：当然要做。有三样东西是软件项目/产品开发必备的：1. bug management; 2. source control; 3. daily build。<br /><br />　　32. 你们公司有没有积累一个项目风险列表？<br /><br />　　MVM：要。Risk Inventory。否则，下个项目开始的时候，又只能拍脑袋分析Risk了。<br /><br />　　33. 设计越简单越好<br /><br />　　MVM：越简单越好。设计时候多一句话，将来可能就带来无穷无尽的烦恼。应该从一开始就勇敢的砍。这叫scope management。<br /><br />　　34. 尽量利用现有的产品、技术、代码<br /><br />　　MVM：千万别什么东西都自己Coding。BizTalk和Sharepoint就是最好的例子，有这两个作为基础，可以把起点提高很多。或者可以尽量多用现成的Control之类的。或者尽量用XML，而不是自己去Parse一个文本文件；尽量用RegExp，而不是自己从头操作字符串，等等等等。这就是“软件复用”的体现。<br /><br />　　35. 你们会隔一段时间就停下来夯实代码么？<br /><br />　　MVM：要。最好一个月左右一次。传言去年年初Windows组在Stevb的命令下停过一个月增强安全。Btw，“夯”这个字念“hang”，第一声。<br /><br />　　36. 你们的项目组每个人都写Daily Report么？<br /><br />　　MVM：要写。五分钟就够了，写10句话左右，告诉自己小组的人今天我干了什么。一则为了沟通，二则鞭策自己（要是游手好闲一天，自己都会不好意思写的）。<br /><br />　　37. 你们的项目经理会发出Weekly Report么？<br /><br />　　MVM：要。也是为了沟通。内容包括目前进度，可能的风险，质量状况，各种工作的进展等。<br /><br />　　38. 你们项目组是否至少每周全体开会一次？<br /><br />　　MVM：要。一定要开会。程序员讨厌开会，但每个礼拜开会时间加起来至少应该有4小时。包括team meeting, spec review meeting, bug triage meeting。千万别大家闷头写code。<br /><br />　　39. 你们项目组的会议、讨论都有记录么？<br /><br />　　MVM：会前发meeting request和agenda，会中有人负责主持和记录，会后有人负责发meeting minutes，这都是effective meeting的要点。而且，每个会议都要形成agreements和action items。<br /><br />　　40. 其他部门知道你们项目组在干什么么？<br /><br />　　MVM：要发一些Newsflash给整个大组织。Show your team’s value。否则，当你坐在电梯里面，其他部门的人问：“你们在干嘛”，你回答“ABC项目”的时候，别人全然不知，那种感觉不太好。<br /><br />　　41. 通过Email进行所有正式沟通<br /><br />　　MVM：Email的好处是免得抵赖。但也要避免矫枉过正，最好的方法是先用电话和当面说，然后Email来确认。<br /><br />　　42. 为项目组建立多个Mailing Group<br /><br />　　MVM：如果在AD+Exchange里面，就建Distribution List。比如，我会建ABC Project Core Team，ABC Project Dev Team，ABC Project All Testers，ABC Project Extended Team等等。这样发起Email来方便，而且能让该收到email的人都收到、不该收到不被骚扰。<br /><br />　　43. 每个人都知道哪里可以找到全部的文档么？<br /><br />　　MVM：应该每个人都知道。这叫做知识管理（Knowledge Management）。最方便的就是把文档放在一个集中的File Share，更好的方法是用Sharepoint。<br /><br />　　44. 你做决定、做变化时，告诉大家原因了么？<br /><br />　　MVM：要告诉大家原因。Empower team member的手段之一是提供足够的information，这是MSF一开篇的几个原则之一。的确如此，tell me why是人之常情，tell me why了才能有understanding。中国人做事喜欢搞限制，限制信息，似乎能够看到某一份文件的人就是有身份的人。大错特错。权威、权力，不在于是不是能access information/data，而在于是不是掌握资源。<br /><br />　　45. Stay agile and expect change<br /><br />　　MVM：要这样。需求一定会变的，已经写好的代码一定会被要求修改的。做好心理准备，对change不要抗拒，而是expect change。<br /><br />　46. 你们有没有专职的软件测试人员？<br /><br />　　MVM：要有专职测试。如果人手不够，可以peer test，交换了测试。千万别自己测试自己的。<br /><br />　　47. 你们的测试有一份总的计划来规定做什么和怎么做么？<br /><br />　　MVM：这就是Test Plan。要不要做性能测试？要不要做Usability测试？什么时候开始测试性能？测试通过的标准是什么？用什么手段，自动的还是手动的？这些问题需要用Test Plan来回答。<br /><br />　　48. 你是先写Test Case然后再测试的么？<br /><br />　　MVM：应该如此。应该先设计再编程、先test case再测试。当然，事情是灵活的。我有时候在做第一遍测试的同时补上test case。至于先test case再开发，我不喜欢，因为不习惯，太麻烦，至于别人推荐，那试试看也无妨。<br /><br />　　49. 你是否会为各种输入组合创建测试用例？<br /><br />　　MVM：不要，不要搞边界条件组合。当心组合爆炸。有很多test case工具能够自动生成各种边界条件的组合??但要想清楚，你是否有时间去运行那么多test case。<br /><br />　　50. 你们的程序员能看到测试用例么？<br /><br />　　MVM：要。让Dev看到Test Case吧。我们都是为了同一个目的走到一起来的：提高质量。<br /><br />　　51. 你们是否随便抓一些人来做易用性测试？<br /><br />　　MVM：要这么做。自己看自己写的程序界面，怎么看都是顺眼的。这叫做审美疲劳??臭的看久了也就不臭了，不方便的永久了也就习惯了。<br /><br />　　52. 你对自动测试的期望正确么？<br /><br />　　MVM：别期望太高。依我看，除了性能测试以外，还是暂时先忘掉“自动测试”吧，忘掉WinRunner和LoadRunner吧。对于国内的软件测试的现状来说，只能“矫枉必须过正”了。<br /><br />　　53. 你们的性能测试是等所有功能都开发完才做的么？<br /><br />　　MVM：不能这样。性能测试不能被归到所谓的“系统测试”阶段。早测早改正，早死早升天。<br /><br />　　54. 你注意到测试中的杀虫剂效应了么？<br /><br />　　MVM：虫子有抗药性，Bug也有。发现的新Bug越来越少是正常的。这时候，最好大家交换一下测试的area，或者用用看其他工具和手法，就又会发现一些新bug了。<br /><br />　　55. 你们项目组中有人能说出产品的当前整体质量情况么？<br /><br />　　MVM：要有。当老板问起这个产品目前质量如何，Test Lead/Manager应该负责回答。<br /><br />　　56. 你们有单元测试么？<br /><br />　　MVM：单元测试要有的。不过没有单元测试也不是不可以，我做过没有单元测试的项目，也做成功了??可能是侥幸，可能是大家都是熟手的关系。还是那句话，软件工程是非常实践、非常工程、非常灵活的一套方法，某些方法在某些情况下会比另一些方法好，反之亦然。<br /><br />　　57. 你们的程序员是写完代码就扔过墙的么？<br /><br />　　MVM：大忌。写好一块程序以后，即便不做单元测试，也应该自己先跑一跑。虽然有了专门的测试人员，做开发的人也不可以一点测试都不做。微软还有Test Release Document的说法，程序太烂的话，测试有权踢回去。<br /><br />　　58. 你们的程序中所有的函数都有输入检查么？<br /><br />　　MVM：不要。虽然说做输入检查是write secure code的要点，但不要做太多的输入检查，有些内部函数之间的参数传递就不必检查输入了，省点功夫。同样的道理，未必要给所有的函数都写注释。写一部分主要的就够了。<br /><br />　　59. 产品有统一的错误处理机制和报错界面么？<br /><br />　　MVM：要有。最好能有统一的error message，然后每个error message都带一个error number。这样，用户可以自己根据error number到user manual里面去看看错误的具体描述和可能原因，就像SQL Server的错误那样。同样，ASP.NET也要有统一的Exception处理。可以参考有关的Application Block。<br /><br />　　60. 你们有统一的代码书写规范么？<br /><br />　　MVM：要有。Code Convention很多，搞一份来发给大家就可以了。当然，要是有FxCop这种工具来检查代码就更好了。<br /><br />61. 你们的每个人都了解项目的商业意义么？<br /><br />　　MVM：要。这是Vision的意思。别把项目只当成工作。有时候要想着自己是在为中国某某行业的信息化作先驱者，或者时不时的告诉team member，这个项目能够为某某某国家部门每年节省多少多少百万的纳税人的钱，这样就有动力了。平凡的事情也是可以有个崇高的目标的。<br /><br />　　62. 产品各部分的界面和操作习惯一致么？<br /><br />　　MVM：要这样。要让用户觉得整个程序好像是一个人写出来的那样。<br /><br />　　63. 有可以作为宣传亮点的Cool Feature么？<br /><br />　　MVM：要。这是增强团队凝聚力、信心的。而且，“一俊遮百丑”，有亮点就可以掩盖一些问题。这样，对于客户来说，会感觉产品从质量角度来说还是acceptable的。或者说，cool feature或者说亮点可以作为质量问题的一个事后弥补措施。<br /><br />　　64. 尽可能缩短产品的启动时间<br /><br />　　MVM：要这样。软件启动时间（Start-Up time）是客户对性能好坏的第一印象。<br /><br />　　65. 不要过于注重内在品质而忽视了第一眼的外在印象<br /><br />　　MVM：程序员容易犯这个错误：太看重性能、稳定性、存储效率，但忽视了外在感受。而高层经理、客户正相反。这两方面要兼顾，协调这些是PM的工作。<br /><br />　　66. 你们根据详细产品功能说明书做开发么？<br /><br />　　MVM：要这样。要有设计才能开发，这是必须的。设计文档，应该说清楚这个产品会怎么运行，应该采取一些讲故事的方法。设计的时候千万别钻细节，别钻到数据库、代码等具体实现里面去，那些是后面的事情，一步步来不能着急。<br /><br />　　67. 开始开发和测试之前每个人都仔细审阅功能设计么？<br /><br />　　MVM：要做。Function Spec review是用来统一思想的。而且，review过以后形成了一致意见，将来再也没有人可以说“你看，当初我就是反对这么设计的，现在吃苦头了吧”<br /><br />　　68. 所有人都始终想着The Whole Image么？<br /><br />　　MVM：要这样。项目里面每个人虽然都只是在制造一片叶子，但每个人都应该知道自己在制造的那片叶子所在的树是怎么样子的。我反对软件蓝领，反对过分的把软件制造看成流水线、车间。参见第61条。<br /><br />　　69. Dev工作的划分是单纯纵向或横向的么？<br /><br />　　MVM：不能单纯的根据功能模块分，或者单纯根据表现层、中间层、数据库层分。我推荐这么做：首先根据功能模块分，然后每个“层”都有一个Owner来Review所有人的设计和代码，保证consistency。 <br /><br />　　70. 你们的程序员写程序设计说明文档么？<br /><br />　　MVM：要。不过我听说微软的程序员1999年以前也不写。所以说，写不写也不是绝对的，偷懒有时候也是可以的。参见第56条。<br /><br />　　71. 你在招人面试时让他写一段程序么？<br /><br />　　MVM：要的。我最喜欢让人做字符串和链表一类的题目。这种题目有很多循环、判断、指针、递归等，既不偏向过于考算法，也不偏向过于考特定的API。<br /><br />　　72. 你们有没有技术交流讲座？<br /><br />　　MVM：要的。每一两个礼拜搞一次内部的Tech Talk或者Chalk Talk吧。让组员之间分享技术心得，这笔花钱送到外面去培训划算。<br /><br />　　73. 你们的程序员都能专注于一件事情么？<br /><br />　　MVM：要让程序员专注一件事。例如说，一个部门有两个项目和10个人，一种方法是让10个人同时参加两个项目，每个项目上每个人都花50%时间；另一种方法是5个人去项目A，5个人去项目B，每个人都100%在某一个项目上。我一定选后面一种。这个道理很多人都懂，但很多领导实践起来就把属下当成可以任意拆分的资源了。<br /><br />　　74. 你们的程序员会夸大完成某项工作所需要的时间么？<br /><br />　　MVM：会的，这是常见的，尤其会在项目后期夸大做某个change所需要的时间，以次来抵制change。解决的方法是坐下来慢慢磨，磨掉程序员的逆反心理，一起分析，并把估算时间的颗粒度变小。<br /><br />　　75. 尽量不要用Virtual Heads<br /><br />　　MVM：最好不要用Virtual Heads。Virtual heads意味着resource is not secure，shared resource会降低resource的工作效率，容易增加出错的机会，会让一心二用的人没有太多时间去review spec、review design。一个dedicated的人，要强过两个只能投入50%时间和精力的人。我是吃过亏的：7个part time的tester，发现的Bug和干的活，加起来还不如两个full-time的。参见第73条。73条是针对程序员的，75条是针对Resource Manager的。<br /><img src ="http://www.blogjava.net/zlsunnan/aggbug/64259.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2006-08-18 09:27 <a href="http://www.blogjava.net/zlsunnan/archive/2006/08/18/64259.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>23种设计模式的代码版</title><link>http://www.blogjava.net/zlsunnan/archive/2006/08/17/64022.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Wed, 16 Aug 2006 16:45:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2006/08/17/64022.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/64022.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2006/08/17/64022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/64022.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/64022.html</trackback:ping><description><![CDATA[package lq.test;<br /><br />import java.io.*;<br />import java.util.*;<br /><br />//*********创建型模式***************<br /><br />//factory method 1<br />//1具体的构造算法，和2构造出的具体产品由子类实现<br />interface Product {<br />}<br /><br />//或者我也提供一个工厂的接口，由这个抽象类来继承它<br /><br />abstract class Factory {<br />abstract public Product fmd();<br /><br />//我认为这个方方法的存在是，是对FactoryMethod方法的补充<br />//例如可以为生成的对象赋值，计算为生成对象应付何值，前后的日值<br />//且这些都是公用的，生成产品的最主要算法还是在FactoryMethod中，<br />//这个方法只是起辅助作用，这也是一种思维方法，将具体的算法实现在一个方法中<br />//而我不直接调用此方法，而使用另外的一个方法封装它，等到了更灵活的效果，而<br />//子类需实现的内容是FactoryMethod<br />//此方法是一个TemplateMethod<br />public Product creat() {<br />Product pd = null;<br /><br />System.out.println("before operation");<br /><br />pd = fmd();<br /><br />System.out.println("end operation");<br /><br />return pd;<br />}<br />}<br /><br />class Product1 implements Product {<br />}<br /><br />class Factory1 extends Factory {<br />public Product fmd() {<br />Product pd = new Product1();<br />return pd;<br />}<br />}<br /><br />//FactroyMethod 2<br />//这种方式简单实用<br />interface Producta {<br />}<br /><br />interface Factorya {<br />Producta create();<br />}<br /><br />class Producta1 implements Producta {}<br /><br />class Factorya1 implements Factorya {<br />public Producta create() {<br />Producta pda = null;<br />pda = new Producta1();<br />return pda;<br />} <br />}<br /><br />//AbstractFactory<br />//AbstractFactory与FactoryMethod的不同在于AbstractFactory创建多个产品<br />//感觉此模式没有什么大用<br /><br />//当然可以还有更多的接口<br />interface Apda {}<br /><br />interface Apdb {}<br /><br />interface Afactory {<br />Apda createA();<br />Apdb createB();<br />}<br /><br />class Apda1 implements Apda {}<br /><br />class Apdb1 implements Apdb {}<br /><br />//有几个接口就有几个对应的方法<br />class Afactory1 implements Afactory {<br />public Apda createA() {<br />Apda apda = null;<br />apda = new Apda1();<br />return apda;<br />}<br /><br />public Apdb createB() {<br />Apdb apdb = null;<br />apdb = new Apdb1();<br />return apdb;<br />}<br />}<br /><br />//Builder<br />//一个产品的生成分为生成部件和组装部件，不同的产品每个部件生成的方式不同<br />//而组装的方式相同，部件的生成抽象成接口方法，而组装的方法使用一个TemplateMethod方法<br /><br />interface Cpda {}<br /><br />class Cpda1 implements Cpda {}<br /><br />interface BuilderI {<br />void buildPart1();<br />void buildPart2();<br /><br />void initPd();<br />Cpda getPd();<br />}<br /><br />abstract class BuilderA implements BuilderI {<br />Cpda cpda;<br /><br />public Cpda getPd() {<br />initPd();<br /><br />//对对象的内容进行设置<br />buildPart1();<br />buildPart2();<br /><br />return cpda;<br />}<br />}<br /><br />class Builder extends BuilderA {<br />public void buildPart1() {<br />System.out.println(cpda);<br />}<br /><br />public void buildPart2() {<br />System.out.println(cpda);<br />}<br /><br />public void initPd() {<br />cpda = new Cpda1();<br />}<br />}<br /><br />//一个简单的生成产品的实现<br />//1<br />abstract class Fy {<br />public abstract void med1(); <br /><br />static class Fy1 extends Fy {<br />public void med1() {<br />}<br />}<br /><br />public static Fy getInstance() {<br />Fy fy = new Fy1();<br />return fy;<br /><br />//Fy fy = new Fy1() {//这种匿名内部类是静态的！！<br />//public void med1() {<br />//}<br />//};<br />//return fy;<br />}<br />}<br /><br />//2<br />interface Pdd {}<br /><br />class Pdd1 implements Pdd {}<br /><br />abstract class Fya {<br />public static Pdd getPd() {<br />Pdd pdd = new Pdd1();<br />return pdd;<br />}<br />}<br /><br />//Prototype 在java中就是clone，又包含深拷贝和浅拷贝<br />class CloneObja {<br />public CloneObja MyClone() {<br />return new CloneObja();<br />}<br />}<br /><br />class CloneObjb {<br />public CloneObjb MyClone() throws Throwable {<br />CloneObjb cobj = null;<br />cobj = (CloneObjb) pcl(this);<br />return cobj;<br />}<br /><br />//深度拷贝算法<br />private Object pcl(Object obj) throws Throwable {<br />ByteArrayOutputStream bao = new ByteArrayOutputStream(1000);<br />ObjectOutputStream objo = new ObjectOutputStream(bao);<br />objo.writeObject(obj);<br /><br />ByteArrayInputStream bai = new ByteArrayInputStream(bao.toByteArray());<br />ObjectInputStream obji = new ObjectInputStream(bai);<br /><br />Object objr = obji.readObject();<br />return objr;<br />} <br />}<br /><br />//Singleton<br />//一个类只有一个对象，例如一个线程池，一个cache<br />class Singleton1 {<br />public static Singleton1 instance = new Singleton1();<br /><br />private Singleton1() {<br />}<br /><br />public static Singleton1 getInstance() {<br />return instance;<br />}<br />}<br /><br />class Singleton2 {<br />public static Singleton2 instance;<br /><br />private Singleton2() {<br />}<br /><br />//public static Singleton2 getInstance() {<br />//if (instance == null) {<br />//instance = new Singleton2();<br />//}<br />//<br />//return instance;<br />//}<br /><br />public static Singleton2 getInstance() {<br />synchronized(Singleton2.class) {<br />if (instance == null) {<br />instance = new Singleton2();<br />}<br />}<br /><br />return instance;<br />}<br />}<br />//**********结构型模式**********<br /><br />//Adapter<br />//基本方法有两种，一种是使用引用一种使用继承<br />//将不符合标准的接口转成符合标准的接口，接口的修改主要是参数的增减，<br />//返回值类型,当然还有方法名<br />//感觉这就是封装的另一种表示形式，封装有用方法封装(在方法中调用功能方法)，<br />//用类封装(先传入功能方法所在的类的对象，通过调用此对象的功能方法)<br /><br />//使用引用的形式<br />class Adapteea {<br />public void kk() {}<br />}<br /><br />interface Targeta {<br />String vv(int i, int k);<br />}<br /><br />class Adaptera implements Targeta{<br />Adapteea ade;<br /><br />public Adaptera(Adapteea ade) {<br />this.ade = ade;<br />}<br /><br />public String vv(int i, int k) {<br />//具体的业务方法实现在Adaptee中，这个方法<br />//只起到了接口转换的作用<br />//调用此方法是通过引用<br />ade.kk();<br />return null;<br />}<br />}<br /><br />//使用继承形式的<br />class Adapteeb {<br />public void kk() {}<br />}<br /><br />interface Targetb {<br />String vv(int i, int k);<br />}<br /><br />class Adapterb extends Adapteeb implements Targetb {<br />public String vv(int i, int k) {<br />//调用此方法是通过继承<br />kk();<br />return null;<br />}<br />}<br /><br />//Proxy<br />interface Subject {<br />void request();<br />} <br /><br />class realSubject implements Subject {<br />public void request() {<br />//do the real business<br />}<br />}<br /><br />class Proxy implements Subject {<br />Subject subject;<br /><br />public Proxy(Subject subject) {<br />this.subject = subject;<br />}<br /><br />public void request() {<br />System.out.println("do something");<br /><br />subject.request();<br /><br />System.out.println("do something");<br />}<br />}<br /><br />//Bridge<br />//感觉就是多态的实现<br /><br />interface Imp {<br />void operation();<br />}<br /><br />class Cimp1 implements Imp {<br />public void operation() {<br />System.out.println("1");<br />}<br />}<br /><br />class Cimp2 implements Imp {<br />public void operation() {<br />System.out.println("2");<br />}<br />}<br /><br />class Invoker {<br />Imp imp = new Cimp1();<br /><br />public void invoke() {<br />imp.operation();<br />}<br />}<br /><br />//Composite<br /><br />interface Component {<br />void operation();<br /><br />void add(Component component);<br /><br />void remove(Component component);<br />}<br /><br />class Leaf implements Component {<br />public void operation() {<br />System.out.println("an operation");<br />}<br /><br />public void add(Component component) {<br />throw new UnsupportedOperationException();<br />}<br /><br />public void remove(Component component) {<br />throw new UnsupportedOperationException();<br />}<br />}<br /><br />class Composite implements Component {<br />List components = new ArrayList();<br /><br />public void operation() {<br />Component component = null;<br /><br />Iterator it = components.iterator();<br />while (it.hasNext()) {<br />//不知道此component对象是leaf还是composite，<br />//如果是leaf则直接实现操作，如果是composite则继续递归调用<br />component = (Component) it.next();<br />component.operation();<br />}<br />}<br /><br />public void add(Component component) {<br />components.add(component);<br />}<br /><br />public void remove(Component component) {<br />components.remove(component);<br />}<br />}<br /><br />//Decorator<br />//对一个类的功能进行扩展时，我可以使用继承，但是不够灵活，所以选用了<br />//另外的一种形式,引用与继承都可活得对对象的一定的使用能力，而使用引用将更灵活<br />//我们要保证是对原功能的追加而不是修改，否则只能重写方法，或使用新的方法<br />//注意concrete的可以直接new出来，<br />//而decorator的则需要用一个另外的decorator对象才能生成对象<br />//使用对象封装，和公用接口<br />//Decorator链上可以有多个元素<br /><br />interface Componenta {<br />void operation();<br />}<br /><br />class ConcreteComponent implements Componenta {<br />public void operation() {<br />System.out.println("do something");<br />}<br />}<br /><br />class Decorator implements Componenta {<br />private Componenta component;<br /><br />public Decorator(Componenta component) {<br />this.component = component;<br />}<br /><br />public void operation() {<br />//do something before<br /><br />component.operation();<br /><br />//do something after<br />}<br />}<br /><br />//Facade<br />//非常实用的一种设计模式，我可以为外部提供感兴趣的接口<br /><br />class Obj1 {<br />public void ope1() {}<br />public void ope2() {}<br />}<br /><br />class Obj2 {<br />public void ope1() {}<br />public void ope2() {}<br />}<br /><br />class Facade {<br />//我得到了一个简洁清晰的接口<br />public void fdMethod() {<br />Obj1 obj1 = new Obj1();<br />Obj2 obj2 = new Obj2();<br /><br />obj1.ope1();<br />obj2.ope2();<br /> }<br />}<br /><br />//Flyweight<br />//空<br />//**********行为型模式*************<br /><br />//Chain of Responsibility<br />//与Decorator的实现形式相类似，<br />//Decorator是在原来的方法之上进行添加功能，而<br />//Chain则是判断信号如果不是当前处理的则转交个下一个节点处理<br />//我可以使用if分支来实现相同的效果，但是不够灵活，链上的每个节点是可以替换增加的，相对<br />//比较灵活，我们可以设计接口实现对节点的增删操作，而实现更方便的效果<br />//这个是一个链状的结构，有没有想过使用环状结构<br /><br />interface Handler {<br />void handRequest(int signal);<br />}<br /><br />class CHandler1 implements Handler {<br />private Handler handler;<br /><br />public CHandler1(Handler handler) {<br />this.handler = handler;<br />}<br /><br />public void handRequest(int signal) {<br />if (signal == 1) {<br />System.out.println("handle signal 1");<br />}<br />else {<br />handler.handRequest(signal);<br />}<br />} <br />}<br /><br />class CHandler2 implements Handler {<br />private Handler handler;<br /><br />public CHandler2(Handler handler) {<br />this.handler = handler;<br />}<br /><br />public void handRequest(int signal) {<br />if (signal == 2) {<br />System.out.println("handle signal 2");<br />}<br />else {<br />handler.handRequest(signal);<br />}<br />} <br />}<br /><br />class CHandler3 implements Handler {<br />public void handRequest(int signal) {<br />if (signal == 3) {<br />System.out.println("handle signal 3");<br />}<br />else {<br />throw new Error("can't handle signal");<br />}<br />} <br />}<br /><br />class ChainClient {<br />public static void main(String[] args) {<br />Handler h3 = new CHandler3();<br />Handler h2 = new CHandler2(h3);<br />Handler h1 = new CHandler1(h2);<br /><br />h1.handRequest(2);<br />}<br />}<br /><br />//Interpreter<br />//感觉跟Composite很类似，只不过他分文终结符和非终结符<br /><br />//Template Method<br /><br />abstract class TemplateMethod {<br />abstract void amd1();<br /><br />abstract void amd2();<br /><br />//此方法为一个Template Method方法<br />public void tmd() {<br />amd1();<br />amd2();<br />}<br />}<br /><br />//State<br /><br />//标准型<br />//状态和操作不应该耦合在一起<br />class Contexta {<br />private State st;<br /><br />public Contexta(int nst) {<br />changeStfromNum(nst);<br />}<br /><br />public void changeStfromNum(int nst) {<br />if (nst == 1) {<br />st = new CStatea1();<br />}<br />else if (nst == 2) {<br />st = new CStatea2();<br />}<br /><br />throw new Error("bad state");<br />}<br /><br />void request() {<br />st.handle(this);<br />}<br />}<br /><br />interface State {<br />void handle(Contexta context);<br />}<br /><br />class CStatea1 implements State {<br />public void handle(Contexta context) {<br />System.out.println("state 1");<br />//也许在一个状态的处理过程中要改变状态，例如打开之后立即关闭这种效果<br />//context.changeStfromNum(2);<br />}<br />}<br /><br />class CStatea2 implements State {<br />public void handle(Contexta context) {<br />System.out.println("state 2");<br />}<br />}<br /><br />//工厂型<br />//根据状态不通生成不同的state<br /><br />//class StateFactory {<br />//public static State getStateInstance(int num) {<br />//State st = null;<br />//<br />//if (num == 1) {<br />//st = new CStatea1();<br />//}<br />//else if (num == 2) {<br />//st = new CStatea2();<br />//}<br />//<br />//return st;<br />//}<br />//}<br /><br />//Strategy<br />//跟Bridge相类似，就是一种多态的表示<br /><br />//Visitor<br />//双向引用，使用另外的一个类调用自己的方法,访问自己的数据结构<br />interface Visitor {<br />void visitElement(Elementd element);<br />}<br /><br />class CVisitor implements Visitor {<br />public void visitElement(Elementd element) {<br />element.operation();<br />}<br />}<br /><br />interface Elementd {<br />void accept(Visitor visitor);<br /><br />void operation();<br />}<br /><br />class CElementd implements Elementd {<br />public void accept(Visitor visitor) {<br />visitor.visitElement(this);<br />}<br /><br />public void operation() {<br />//实际的操作在这里<br />}<br />}<br /><br />class Clientd {<br />public static void main() {<br />Elementd elm = new CElementd();<br />Visitor vis = new CVisitor();<br /><br />vis.visitElement(elm);<br />}<br />}<br /><br />//Iteraotr<br />//使用迭代器对一个类的数据结构进行顺序迭代<br /><br />interface Structure {<br />interface Iteratora {<br />void first();<br /><br />boolean hasElement();<br /><br />Object next();<br /><br />}<br />}<br /><br />class Structure1 implements Structure {<br />Object[] objs = new Object[100];<br /><br />//使用内部类是为了对Struture1的数据结构有完全的访问权<br />class Iteratora1 implements Iteratora {<br />int index = 0;<br /><br />public void first() {<br />index = 0;<br />}<br /><br />public boolean hasElement() {<br />return index &lt; 100;<br />} <br /><br />public Object next() {<br />Object obj = null;<br /><br />if (hasElement()) {<br />obj = objs[index];<br />index++;<br />}<br /><br />return obj;<br />}<br />}<br />}<br /><br />//Meditor<br /><br />class A1 {<br />public void operation1() {}<br />public void operation2() {}<br />}<br /><br />class A2 {<br />public void operation1() {}<br />public void operation2() {}<br />}<br /><br />class Mediator {<br />A1 a1;<br />A2 a2;<br /><br />public Mediator(A1 a1, A2 a2) {<br />this.a1 = a1;<br />this.a2 = a2;<br /><br />}<br /><br />//如果我想实现这个功能我可能会把他放在A1中<br />//但是这样耦合大，我不想在A1中出现A2对象的引用，<br />//所以我使用了Mediator作为中介<br />public void mmed1() {<br />a1.operation1();<br />a2.operation2();<br />}<br /><br />public void mmed2() {<br />a2.operation1();<br />a1.operation2();<br />}<br />}<br /><br />//Command<br />//我认为就是将方法转换成了类<br /><br />class Receiver {<br />public void action1() {}<br /><br />public void action2() {}<br />}<br /><br />interface Command {<br />void Execute();<br />}<br /><br />class CCommand1 implements Command {<br />private Receiver receiver;<br /><br />public CCommand1(Receiver receiver) {<br />this.receiver = receiver;<br />}<br /><br />public void Execute() {<br />receiver.action1();<br />}<br />}<br /><br />class CCommand2 implements Command {<br />private Receiver receiver;<br /><br />public CCommand2(Receiver receiver) {<br />this.receiver = receiver;<br />}<br /><br />public void Execute() {<br />receiver.action2();<br />}<br />}<br /><br />//Observer<br />//在这里看似乎这个模式没有什么用<br />//但是如果我有一个线程监控Subject，如果Subject的状态<br />//发生了变化，则更改Observer的状态，并出发一些操作，这样就有实际的意义了<br />//Observer与Visitor有相似的地方，都存在双向引用<br />//Subject可以注册很多Observer<br /><br />interface Subjectb {<br />void attach(Observer observer);<br /><br />void detach(Observer observer);<br /><br />void mynotify();<br /><br />int getState();<br /><br />void setState(int state);<br />}<br /><br />class Subjectb1 implements Subjectb {<br />List observers = new ArrayList();<br />int state;<br /><br />public void attach(Observer observer) {<br />observers.add(observer);<br />}<br /><br />public void detach(Observer observer) {<br />observers.remove(observer);<br />}<br /><br />public void mynotify() {<br />Observer observer = null;<br />Iterator it = observers.iterator();<br /><br />while (it.hasNext()) {<br />observer = (Observer) it.next();<br />observer.Update();<br />}<br />}<br /><br />public int getState() {<br />return state;<br />}<br /><br />public void setState(int state) {<br />this.state = state;<br />}<br />}<br /><br />interface Observer {<br />void Update();<br />}<br /><br />class Observer1 implements Observer {<br />Subjectb subject;<br />int state;<br /><br />public Observer1(Subjectb subject) {<br />this.subject = subject;<br />}<br /><br />public void Update() {<br />this.state = subject.getState();<br />}<br /><br />public void operation() {<br />//一些基于state的操作<br />}<br />}<br /><br />//Memento<br />//感觉此模式没有什么大用<br /><br />class Memento {<br />int state;<br /><br />public int getState() {<br />return state;<br />}<br /><br />public void setState(int state) {<br />this.state = state;<br />}<br />}<br /><br />class Originator {<br />int state;<br /><br />public void setMemento(Memento memento) {<br />state = memento.getState();<br />}<br /><br />public Memento createMemento() {<br />Memento memento = new Memento();<br />memento.setState(1);<br />return memento;<br />}<br /><br />public int getState() {<br />return state;<br />}<br /><br />public void setState(int state) {<br />this.state = state;<br />}<br />}<br /><br />class careTaker {<br />Memento memento;<br /><br />public void saverMemento(Memento memento) {<br />this.memento = memento;<br />}<br /><br />public Memento retrieveMemento() {<br />return memento;<br />}<br />}<br /><br />//程序最终还是顺序执行的，是由不通部分的操作拼接起来的<br />//将不同类的代码拼接起来是通过引用实现的，有了引用我就<br />//相当于有了一定访问数据结构和方法的能力，这与写在类内部<br />//差不多，例如我想将一个类中的一个方法抽离出去，因为这个方法依赖与此类的数据和其他方法<br />//直接将代码移走是不行的，但如果我们拥有了此类对象的引用，则与写在此类<br />//内部无异，所以我们拥有了引用就可以将此方法移出<br />public class tt1 {<br />public static void main(String[] args) {<br />}<br />}<br /><img src ="http://www.blogjava.net/zlsunnan/aggbug/64022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2006-08-17 00:45 <a href="http://www.blogjava.net/zlsunnan/archive/2006/08/17/64022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>