<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[Goodtiger]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[LilyStudio@NJU&Alipayer]]></description>
<link>http://hi.baidu.com/goodtigerzhao</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[form到bean，反向注入还是主动提取]]></title>
        <link><![CDATA[http://hi.baidu.com/goodtigerzhao/blog/item/9c14950aa3f36b1995ca6b80.html]]></link>
        <description><![CDATA[
		
		一、反向注入<br>
很多Web框架中将form中的fields自动转换成bean或相应类型，然后设置到action的setter方法中。这样就可以很方便的在action中获取fields，webwork是直接注入到action中，Struts则有一个formbean做中转，和实际的bean还不一样，有点类似DTO的概念，其实觉得Struts的formbean有点鸡肋的感觉。我想很多人对这种反向注入觉得很方便吧，但是这个自动注入的操作还会涉及到其他一些东西。<br>
<br>
1、注入的话，那就需要有一个被注入的对象。这句话看起来很像是废话，但是在某些框架或是场景中，想要找到这个对象就比较麻烦。像WebWork是以action为中心的，注入到action中是很自然的事情，所有的interceptor都是围绕着action的。但是如果框架中不存在中心的概念，那么应该把form注入到哪一个对象中去呢。注入进去不复杂，但是框架注入进去了，又没有使用，不是白费力气了。解决这个办法的话，要么就有配置文件，要么使用Annotation。<br>
2、一旦注入，action就是有状态了，action就不能公用了，每个action都必须被一个Request独享。这个就看应用的需求了，如果对创建和销毁对象的数目有要求的话，这也就需要考虑了。<br>
3、form注入的话，对于动态数目的from注入就很麻烦了。一般注入的话，会有确定的数目进行注入，但是不确定数目，就很难注入了。<br>
4、验证form的逻辑也进入到了action中了，至于是不是要把form的验证和action耦合在一起，那也是需要去权衡的。我还是倾向于在action中不需要出现对form的验证。<br>
<br>
<br>
二、主动提取<br>
<br>
主动提取的话，就是在action的外围提供formService，来对form的fields进行类型、校验等处理。<br>
action在需要fields数据的时候，主动去获取，虽然在fields数目比较多的时候，会觉得不如反向注入来得方便，但是action只需要获取它所需要的数据，而在获取之前已经对数据做好了验证和类型的处理。这么做的好处，就是不像Struts那样，对于form，需要有一个formbean来支持，虽然Struts也可以通过配置文件来获取动态的formbean，但是事实上我们也不一定都要把formbean转化成bean。<br>
<br>
<br>
很难直接下定论说反向注入好还是主动提取好，在背后其实都是一种思想，在某个特定框架中，或者在某个具体的应用中，哪种方案更加契合才是选择的依据。毕竟form的fields提取本身也不是一件非常复杂的事情。 <a href="http://hi.baidu.com/goodtigerzhao/blog/item/9c14950aa3f36b1995ca6b80.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/goodtigerzhao/blog/category/%D6%D8%B9%B9%CF%E0%B9%D8">重构相关</a>&nbsp;<a href="http://hi.baidu.com/goodtigerzhao/blog/item/9c14950aa3f36b1995ca6b80.html#comment">查看评论</a>]]></description>
        <pubDate>2008/08/13  14:34</pubDate>
        <category><![CDATA[重构相关]]></category>
        <author><![CDATA[GoodtigerZhao]]></author>
		<guid>http://hi.baidu.com/goodtigerzhao/blog/item/9c14950aa3f36b1995ca6b80.html</guid>
</item>

<item>
        <title><![CDATA[如何评价一个框架]]></title>
        <link><![CDATA[http://hi.baidu.com/goodtigerzhao/blog/item/3404ba995575000e6e068cf8.html]]></link>
        <description><![CDATA[
		
		<p>现在开源的框架和实现相当的多，就单拿Web的MVC框架就很多了，像Struts2、SpringMVC，甚至像Seam、ROR等都被划到 Web开发中来进行比较。我们经常会看到很多文章在比较着这些框架，优缺点列出一堆，得出一个结论哪个哪个比较好。除了这些流行的开源框架之外，很多公司 内部的框架的数目也不在少数，相比那些开源的流行的框架，公司内部的框架的文档会很缺乏，经常会以使用心得或者同事的介绍，再加上自己在使用的过程中慢慢 熟悉的。有很多细节性的问题，你甚至要深入阅读框架的源代码才能理解。很多抱怨也会这么产生。</p>
<p><span style="font-size: small;"><strong>一、如何评价一个框架 </strong> </span></p>
<p> </p>
<p>要评价一个框架，或者说理解一个框架，需要适当地了解一下这个框架发展的历史，这样就能知道框架某种做法的来龙去脉。很多今天我们所认为理所当然的 一些东西，在框架的开发过程中，正在被探索中。在探索中，深入学习了流行的框架，并对其优缺点形成了一套自己的认识。最流行的并不是技术最前卫的。我们要 去理解一个框架，首先要了解它所产生的一个技术背景，然后再来做出评价。</p>
<p><span style="font-size: small;"><strong>二、如何改进框架</strong> </span></p>
<p>业界的发展很快。雨后春笋般冒出来的新框架新思路，最初的框架中有肯定会有很多地方会落后了。那么我们就要来不断的改进框架。一个框架能不能很好的 扩展和改进也是衡量一个框架质量的标准。但是框架也不能说改进就改进，框架必须稳定，不能说变就变。虽然我们知道有很多新技术新理念，但必须一点一点地加 到框架中。对于现有已经稳定工作的框架，还是要保证其正常运行。一般采取两条路线： <strong>一条是渐进路线，一条是变革路线  </strong> 。前者的原则是稳定压倒一切。在稳定的基础上，尽可能解决大家碰到的问题和不爽之处。后者是站在前者肩膀之上，但不拘于现有应用的束缚，大胆变革，以产生更好的框架。</p>
<p><span style="font-size: small;"><strong><span>三、如何看待一个框架</span> </strong> </span></p>
<p>每一种框架都有它自己特定的优点，相对而言，也会有它的缺点。没有一种框架是完美的。框架是为了达成下列目标而设立的：</p>
<ol>
    <li><strong>重用代码 </strong> 。框架聚合了很多公用的代码、模块，以便简化编程的工作，提高编程的质量。</li>
    <li><strong>良好设计 </strong> 。如果没有框架，写程序就可以天马行空。但有了框架，就可以把程序员约束在一种良好的设计里面。</li>
    <li><strong>降低耦合  </strong> 。这一点其实包括在良好设计范围内，不过它非常重要。其实近来IoC、AOP从本质上来说，都是为了降低代码的耦合度。随之带来的好处是易测试、易重用、易读懂、易维护等。</li>
    <li><strong>简化工作 </strong> 。把和业务无关的内容尽量处理掉，使程序员可以专注在业务上。</li>
    <li><strong>保证性能和稳定性 </strong> 。框架中也需要考虑性能问题、稳定性、扩展性、可用性......等很多问题</li>
</ol>
<p> </p>
<p>纵观opensource世界中的很多流行框架，例如Webwork、Struts2等。它们确实在某一方面做得很好，或者说它们在80%的地方都 做得很好。但是如果想要把它们直接拿过来，放在特定的应用场景中使用，可以想象，一定还有很多的事情要做，一定还有很多的问题需要解决。</p> <a href="http://hi.baidu.com/goodtigerzhao/blog/item/3404ba995575000e6e068cf8.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/goodtigerzhao/blog/category/%D6%D8%B9%B9%CF%E0%B9%D8">重构相关</a>&nbsp;<a href="http://hi.baidu.com/goodtigerzhao/blog/item/3404ba995575000e6e068cf8.html#comment">查看评论</a>]]></description>
        <pubDate>2008/08/12  17:21</pubDate>
        <category><![CDATA[重构相关]]></category>
        <author><![CDATA[GoodtigerZhao]]></author>
		<guid>http://hi.baidu.com/goodtigerzhao/blog/item/3404ba995575000e6e068cf8.html</guid>
</item>

<item>
        <title><![CDATA[Pax Runner——OSGi小工具]]></title>
        <link><![CDATA[http://hi.baidu.com/goodtigerzhao/blog/item/6e39e9c45fba03af8326ac43.html]]></link>
        <description><![CDATA[
		
		<p><a href="http://wiki.ops4j.org/confluence/display/ops4j/Pax+Runner">PAX Runner </a></p>
<p>是不错的OSGi的小工具。</p>
<p>1、方便切换OSGi平台，默认是Felix，可以随时切换OSGi的平台</p>
<p>2、即使你不知道OSGi是什么，你也可以很简单那的使用</p>
<p>3、也许你现在还没有很方便快速的把OSGi平台给工作起来，那么快来吧</p>
<p>4、自动维护依赖的Bundle，自动从网上下载。</p>
<p> </p>
<p>还是看视频来学习下吧</p>
<p>百度不行啊，还是去我<a href="http://goodtiger.javaeye.com/blog/225676" target="_blank">JavaEye的博客</a>看</p>
<p> </p> <a href="http://hi.baidu.com/goodtigerzhao/blog/item/6e39e9c45fba03af8326ac43.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/goodtigerzhao/blog/category/Osgi">Osgi</a>&nbsp;<a href="http://hi.baidu.com/goodtigerzhao/blog/item/6e39e9c45fba03af8326ac43.html#comment">查看评论</a>]]></description>
        <pubDate>2008/08/08  09:40</pubDate>
        <category><![CDATA[Osgi]]></category>
        <author><![CDATA[GoodtigerZhao]]></author>
		<guid>http://hi.baidu.com/goodtigerzhao/blog/item/6e39e9c45fba03af8326ac43.html</guid>
</item>

<item>
        <title><![CDATA[OSGi的模块话和热插拔体验]]></title>
        <link><![CDATA[http://hi.baidu.com/goodtigerzhao/blog/item/9a30bb127512f4c8c2fd7871.html]]></link>
        <description><![CDATA[
		
		<div class="blog_content">
<p>例子是BlueDavy的OpenDoc上的内容,是一个简单的用户登陆的例子。</p>
<p> </p>
<p> </p>
<p><img height="306" width="501" src="http://goodtiger.javaeye.com/upload/attachment/33652/b5277004-b602-3ea3-823a-2e57aab8421b.jpg"></p>
<p>启动应用之后</p>
<p><img height="71" width="625" src="http://goodtiger.javaeye.com/upload/attachment/33650/df497a86-d8ed-398f-9dd1-ef93b7483fc3.jpg"></p>
<p> </p>
<p>通过http://127.0.0.1:8080/demo/page/login.htm进行访问</p>
<p>我们可以通过控制台输入ss可以看到LADP、DB和ConfigFile三个提供验证的服务的Bundle都在提供服务，</p>
<p>我们通过页面输入用户名和密码，</p>
<p><img height="148" width="580" src="http://goodtiger.javaeye.com/upload/attachment/33648/1b864d93-ce36-3bd9-b8f6-ce9fc472cc27.jpg"></p>
<p>在后台可以看到打印输出了LDAP验证</p>
<p> </p>
<p>好，那我们来stop LDAP验证的Bundle，不需要重启应用，我们直接再次登陆，发现依然可以，控制台打印出DB验证。</p>
<p>那我们接下来关系的事情是，如果我们把三个提供验证的Bundle都stop了，对用户登陆的Bundle会不会影响呢？</p>
<p> </p>
<p>由于只能上传三个附件，所以就不截图了。</p>
<p>答案是不会影响，只是在登陆时候，会告诉你没有能够提供服务的Bundle。</p>
<p>也就是说Bundle之间的确应依赖影响，由一个Bundle失效而引起连锁反应是不存在的。</p>
<p>但是从业务的角度上来讲，如果某些Bundle无法提供服务，那整体应用对外提供的服务也会收到很大的影响，即使应用的其他Bundle不受到什么影响。</p>
</div> <a href="http://hi.baidu.com/goodtigerzhao/blog/item/9a30bb127512f4c8c2fd7871.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/goodtigerzhao/blog/category/Osgi">Osgi</a>&nbsp;<a href="http://hi.baidu.com/goodtigerzhao/blog/item/9a30bb127512f4c8c2fd7871.html#comment">查看评论</a>]]></description>
        <pubDate>2008/08/05  08:51</pubDate>
        <category><![CDATA[Osgi]]></category>
        <author><![CDATA[GoodtigerZhao]]></author>
		<guid>http://hi.baidu.com/goodtigerzhao/blog/item/9a30bb127512f4c8c2fd7871.html</guid>
</item>

<item>
        <title><![CDATA[Mule初窥]]></title>
        <link><![CDATA[http://hi.baidu.com/goodtigerzhao/blog/item/be0760d0d524a789a0ec9c2a.html]]></link>
        <description><![CDATA[
		
		<font size="3" ><strong >什么是Mule</strong></font><br >
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Mule是一个轻量级的消息框架也是分布式的对象中介，允许你快速、简单的连接各个应用来交换数据。以<br >
<br >
企业级服务总线这个企业集成模式开设计的Mule可以无缝的利用总多的技术像JMS、HTTP、Email、XML-<br >
<br >
RPC来处理应用之间的交互。<br >
&nbsp;&nbsp;&nbsp;&nbsp; 
<div style="padding: 1em 0pt; text-align: center;" ><img src="https://docs.google.com/File?id=df56jsb6_60gk97fscq_b" style="width: 412px; height: 311px;" ></div>
&nbsp;&nbsp;&nbsp;  简单的说，Mule就是可以利用各种技术来对不同的应用之间进行连接，来达到应用之间交互的目的。Mule是很容易扩展的，最初的时候，你可能只有几个应 用通过Mule来进行连接，但是随着规模的不断变大，Mule管理的应用可以不断的增大。Mule对于应用或者组件之间的交互的管理是透明的，不管是否在 同一台机器上，不管通信的协议是否相同。<br >
&nbsp;&nbsp;&nbsp;  Mule是基于企业级服务总线（ESB）架构的思想。Mule是厂商中立的，所以不同厂商的产品都可以连接到Mule系统，你也可以自己进行相应的扩展。<br >
&nbsp;&nbsp;<font size="3" >  <strong >消息通讯</strong><br >
</font>&nbsp;&nbsp;&nbsp;&nbsp; 
<div style="padding: 1em 0pt; text-align: center;" ><img src="https://docs.google.com/File?id=df56jsb6_61fhmr6md7_b" style="width: 316px; height: 98px;" ></div>
&nbsp;&nbsp;&nbsp;  从上图，你可以了解到应用直接需要对于数据进行交换处理，但是应用之间的数据格式肯定是不可能一致的，那么就需要一个通道来进行数据格式的转换，我们把应用内部的数据结构叫做Date，把在通道中传输的数据叫做Message。<br >
&nbsp;&nbsp;&nbsp;  那应用之间的数据格式的转换以及传输这部分的工作都由Mule来完成，而应用只需要关心对业务逻辑的处理，至于数据的转换和传输都由Mule在底层完成。<br >
&nbsp;&nbsp;&nbsp;  当然Mule所能处理的要比上图复杂的多了，包括多通道的传输以及消息的过滤等等，这些还是在看Mule的Examples的时候好好的挖掘吧。<br >
<br >
&nbsp;&nbsp;&nbsp;&nbsp;<font size="3" ><strong >逻辑数据流</strong></font><br >
&nbsp;&nbsp;&nbsp;&nbsp; 
<div style="padding: 1em 0pt; text-align: center;" ><img src="https://docs.google.com/File?id=df56jsb6_62gb33s8fk_b" style="width: 517px; height: 537px;" ><br >
<div style="text-align: left;" >&nbsp;&nbsp;&nbsp;  这幅图就不用详细解释了，按照标号走下流程，最根本的东西是，所有的服务都不处理数据的转换和传输的问题，这些都有Mule来解决。当然Mule都是通过XML配置的方式，那么你就可以很方便的对已有的服务进行重组来满足新的业务上的需要。</div>
</div> <a href="http://hi.baidu.com/goodtigerzhao/blog/item/be0760d0d524a789a0ec9c2a.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/goodtigerzhao/blog/category/Mule">Mule</a>&nbsp;<a href="http://hi.baidu.com/goodtigerzhao/blog/item/be0760d0d524a789a0ec9c2a.html#comment">查看评论</a>]]></description>
        <pubDate>2008/08/04  15:25</pubDate>
        <category><![CDATA[Mule]]></category>
        <author><![CDATA[GoodtigerZhao]]></author>
		<guid>http://hi.baidu.com/goodtigerzhao/blog/item/be0760d0d524a789a0ec9c2a.html</guid>
</item>

<item>
        <title><![CDATA[[Reading Log]  Loose Coupling]]></title>
        <link><![CDATA[http://hi.baidu.com/goodtigerzhao/blog/item/7cab85d60fa2872906088b60.html]]></link>
        <description><![CDATA[
		
		1、Loose coupling is a fundamental concept of SOA(and large distibuted systems in general) aimed to reducing dependencies between different systems.<br>
2、There are different forms of loose coupling,and you will have to find the mixture of tight and loose coupling that's appropriate for your specific context and project.<br>
3、Any form of loose coupling has drawbacks.For this reason, loose coupling should never be an end in itself.<br>
4、The need to map data is usually a <font color="#ff0000">good </font>property of large systems.<br>
<br>
<div forimg="1"><a href="http://img.tongji.cn.yahoo.com/708516/ystat.gif" target="_blank"><img border="0" src="http://img.tongji.cn.yahoo.com/708516/ystat.gif" small="1" class="blogimg"></a></div> <a href="http://hi.baidu.com/goodtigerzhao/blog/item/7cab85d60fa2872906088b60.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/goodtigerzhao/blog/category/%B6%C1%CA%E9%B1%CA%BC%C7">读书笔记</a>&nbsp;<a href="http://hi.baidu.com/goodtigerzhao/blog/item/7cab85d60fa2872906088b60.html#comment">查看评论</a>]]></description>
        <pubDate>2008/07/25  09:00</pubDate>
        <category><![CDATA[读书笔记]]></category>
        <author><![CDATA[GoodtigerZhao]]></author>
		<guid>http://hi.baidu.com/goodtigerzhao/blog/item/7cab85d60fa2872906088b60.html</guid>
</item>

<item>
        <title><![CDATA[[Reading Log]  Services]]></title>
        <link><![CDATA[http://hi.baidu.com/goodtigerzhao/blog/item/8a0c13df94fa9d1563279859.html]]></link>
        <description><![CDATA[
		
		1、A  service is the IT realization of some self-contained bussines functionality.<br>
<br>
2、By focusing on the business aspects, a service hides technical details and allows business people to deal with it.<br>
<br>
3、Technically, a service is an <font color="#ff0000">interface </font>for (multiple) messages that are exchanged between provider(s) and consumer(s).<br>
<br>
4、The complete description of a service form a consumer's point of view (signature and semantics) is called a &quot;well-defined interface&quot; or &quot;<font color="#ff0000">contract</font>&quot;, A contract is agreed individually between a certain provider, and a certain consumer, and usually includes nonfunctional aspecsts such as <font color="#ff0000">SLAs</font>.<br>
<br>
5、There are serveral attributes that services may hava.According to my understanding, they are situation-dependent; services will almost always have different attributes, and should be classified according to those attributes.<br>
<br>
<a href="http://cam.taoke.alimama.com/event.php?pid=mm_11021461_0_0&amp;eventid=100012" target="_blank"><br>
小资男人最爱(图)</a> <a href="http://hi.baidu.com/goodtigerzhao/blog/item/8a0c13df94fa9d1563279859.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/goodtigerzhao/blog/category/%B6%C1%CA%E9%B1%CA%BC%C7">读书笔记</a>&nbsp;<a href="http://hi.baidu.com/goodtigerzhao/blog/item/8a0c13df94fa9d1563279859.html#comment">查看评论</a>]]></description>
        <pubDate>2008/07/24  09:16</pubDate>
        <category><![CDATA[读书笔记]]></category>
        <author><![CDATA[GoodtigerZhao]]></author>
		<guid>http://hi.baidu.com/goodtigerzhao/blog/item/8a0c13df94fa9d1563279859.html</guid>
</item>

<item>
        <title><![CDATA[代码写来是用来读的]]></title>
        <link><![CDATA[http://hi.baidu.com/goodtigerzhao/blog/item/f3fda1ccc620671500e92844.html]]></link>
        <description><![CDATA[
		
		&nbsp;&nbsp;&nbsp;    今天读了一些业务相关的代码，有一个类的方法达到了400多行，里面很多的判断语句，最多的if嵌套深度到达了5层，其实整个方法的业务逻辑并不是很复杂，就是对调用请求进行一些检查，然后在每种情况下进行一些不同的处理，而且这些处理都比较的简单，但是糅合在一起的代码。却很多的问题<br>
<strong>一、很难直白的理解方法的意图</strong><br>
&nbsp;&nbsp;&nbsp;    虽然你可以从if语句的判断条件中读懂整个执行流程，但是这还是很费力的，如果碰到变量名取得不好，或者if判断中间是N个条件的组合判断，你就很难读了。<br>
<strong>二、为方法增加新的逻辑之后就很困难而且容易出错</strong><br>
&nbsp;&nbsp;&nbsp;    在众多的判断逻辑中要增加新的逻辑，最大的成本在于你要先读懂原有逻辑，最好是画出原有方法的顺序图，然后基于这个顺序图再来添加新的逻辑，但是基本上是不会有人这么做的，所以添加新的逻辑处理的时候，就基本上是Bug数量迅速增长的时候。<br>
<strong>三、方法难以测试</strong><br>
&nbsp;&nbsp;&nbsp;    因为判断逻辑很多，导致代码的执行路径很多，在编写测试用例的时候，做到路径覆盖也是很困难的。而且一旦方法的处理逻辑改变了比较大，基本上所有的测试用例都得重写。<br>
问题肯定还是很多的，简单的重构的方向<br>
<strong>一、将判断逻辑封装成方法</strong><br>
&nbsp;&nbsp;&nbsp;    这是最直接的想法，其实就是将复杂的处理逻辑分解成一个个小方法，然后再拼装起来，这样就可以克服上述3个缺点，如果封装的方法名取得得当，那么你就不需要读懂if的复杂判断语句来理解方法所表达的业务处理逻辑，与此代码的增加新的逻辑就简单了，在较小的方法中进行修改就相对容易多了，但并不是绝对的。<br>
<strong>二、利用面向对象进行更深层次的封装</strong><br>
&nbsp;&nbsp;&nbsp;    如果代码中到处都是if的判断语句，那显然是面向过程的痕迹很重，我们可以深入的分析，将设计变得更加面向对象，对对象职责的细分，对象方法处理逻辑的简化，对象之间的交互更简单直接些。其实这未必更加简单，需要付出的设计、重构的代价也很大。理解更多的对象之间的交互也不是一件简单的事情，但是在可扩展性方面就更好。<br>
<br>
&nbsp;&nbsp;&nbsp;    没有拿实例代码来说明，但是道理还是很简单的，如果想要较小的成本在短时间内进行重构，那么就采用第一种方法，将判断逻辑封装成方法。想要在一个大的系统内得到更好的重构效果，就要重新考虑设计，进行设计到代码两层次的重构。 <a href="http://hi.baidu.com/goodtigerzhao/blog/item/f3fda1ccc620671500e92844.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/goodtigerzhao/blog/category/%D6%D8%B9%B9%CF%E0%B9%D8">重构相关</a>&nbsp;<a href="http://hi.baidu.com/goodtigerzhao/blog/item/f3fda1ccc620671500e92844.html#comment">查看评论</a>]]></description>
        <pubDate>2008/07/07  22:42</pubDate>
        <category><![CDATA[重构相关]]></category>
        <author><![CDATA[GoodtigerZhao]]></author>
		<guid>http://hi.baidu.com/goodtigerzhao/blog/item/f3fda1ccc620671500e92844.html</guid>
</item>

<item>
        <title><![CDATA[利用UML图表达分析设计的问题]]></title>
        <link><![CDATA[http://hi.baidu.com/goodtigerzhao/blog/item/0d820ef4889c2fea7609d73c.html]]></link>
        <description><![CDATA[
		
		其实一直都觉得UML这东西是被误用了最多的东西，很多人其实对UML的各类图的细节都不怎么清楚，所以各人拿各种工具画出来的东西都是各种各样的。最简单的细节就是很多人不注意箭头，单单是箭头，就有好多种画法，但是在一些图中，基本上就是清一色的一种。<br>
还有利用UML图来进行系统的分析和设计是一个连贯的东西，从用例图到顺序图，从领域模型到类图，再综合到状态图，是一个不断细化设计的过程，但是很多图还是太独立了。基本上看了等于没有看。 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/goodtigerzhao/blog/category/%D6%D8%B9%B9%CF%E0%B9%D8">重构相关</a>&nbsp;<a href="http://hi.baidu.com/goodtigerzhao/blog/item/0d820ef4889c2fea7609d73c.html#comment">查看评论</a>]]></description>
        <pubDate>2008/07/05  13:05</pubDate>
        <category><![CDATA[重构相关]]></category>
        <author><![CDATA[GoodtigerZhao]]></author>
		<guid>http://hi.baidu.com/goodtigerzhao/blog/item/0d820ef4889c2fea7609d73c.html</guid>
</item>

<item>
        <title><![CDATA[终于看到自己遗留的丑陋代码]]></title>
        <link><![CDATA[http://hi.baidu.com/goodtigerzhao/blog/item/ebf3d7391e40e4f63a87ce03.html]]></link>
        <description><![CDATA[
		
		<p>很多的时候，我们一直在讲写代码最先讲的是把功能实现，然后再是优化等等问题。在一个人编写代码的时候这是可以的，但是在一个实际的项目中，这往往是会带来问题。</p>
<p>一、项目的需求变更迫使你改变原有的设计</p>
<p>在项目开发的中期，已经完成了系分设计，编码也进行到一半的时候，需求方提出需求变更。虽然可以拒绝接受需求的变更，但是由于功能点的重要性，接受了变更。但是面临的问题就是还有半个月，项目就有上线，为了能够在规定的时间内完成项目，并且实现变更的需求，我们采取的方案是尽量不改动原有的设计，以最小的代价来实现新的需求。最后我们的项目是按期完成了，满足需求方的第一期需求，但是我们付出的代价就是改变了我们原有的设计，使得设计变得丑陋了。</p>
<p>二、项目的deadline使得你不得不提交丑陋的实现代码</p>
<p>设计变得不完美的时候，实现的代码就会有bad smell了，但是项目的deadline就在眼前，你只得提交你不甚满意的代码，虽然这些代码已经实现了最初的功能。也许你会觉得，将来我再重构这些代码好了，但事实上，这几乎成了很困难的一件事情。首先、你改了代码就意味着测试那边需要进行一次回归测试，人力上的投入不是我们能说得算的，得boss同意。其次，你真的敢改已经运行的很正常的代码吗？没有良好的单元测试配套，没有良好的设计上的重构，想要对代码进行重构，那几乎是不可能的事情。</p>
<p>三、项目的二期、三期会让代码的bad smell越来越多</p>
<p>既然你没有办法去消除一期项目的bad smell，那么在二期、三期的时候，你的设计和变更不得不基于原有的丑陋的代码，那就出现了bad smell蔓延的情况，最后代码也就变得很难维护了。</p>
<p> </p>
<p> </p>
<p>以后还是要对自己写得每一个类，每一个方法都写好相应的tese case！</p>
<p> </p> <a href="http://hi.baidu.com/goodtigerzhao/blog/item/ebf3d7391e40e4f63a87ce03.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/goodtigerzhao/blog/category/%D6%D8%B9%B9%CF%E0%B9%D8">重构相关</a>&nbsp;<a href="http://hi.baidu.com/goodtigerzhao/blog/item/ebf3d7391e40e4f63a87ce03.html#comment">查看评论</a>]]></description>
        <pubDate>2008/07/03  09:34</pubDate>
        <category><![CDATA[重构相关]]></category>
        <author><![CDATA[GoodtigerZhao]]></author>
		<guid>http://hi.baidu.com/goodtigerzhao/blog/item/ebf3d7391e40e4f63a87ce03.html</guid>
</item>


</channel>
</rss>