﻿<?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>博客园-懒人居</title><link>http://www.cnblogs.com/Alexander-Lee/</link><description>要生猛的面对生活</description><language>zh-cn</language><lastBuildDate>Mon, 06 Jul 2009 11:31:07 GMT</lastBuildDate><pubDate>Mon, 06 Jul 2009 11:31:07 GMT</pubDate><ttl>60</ttl><item><title>apache+mod_wsgi部署quixote的方法</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2009/06/19/apache_mod_wsgi_quixote_configuration.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Fri, 19 Jun 2009 07:00:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2009/06/19/apache_mod_wsgi_quixote_configuration.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1506780.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2009/06/19/apache_mod_wsgi_quixote_configuration.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1506780.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1506780.html</trackback:ping><description><![CDATA[摘要: 折腾了好几天，终于搞定，特此记录，如有大牛发现方法有所不妥，请指正一下，不胜感激涕零........ &nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2009/06/19/apache_mod_wsgi_quixote_configuration.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1506780.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48008/" target="_blank">IBM发布全球首款开源智能编译器</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>利用metaclass实现python的aop</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2008/12/06/pythonaop.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Sat, 06 Dec 2008 15:34:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2008/12/06/pythonaop.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1349405.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2008/12/06/pythonaop.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1349405.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1349405.html</trackback:ping><description><![CDATA[摘要: 修行Python个把星期，终于有点成果了，呵呵，一个利用metaclass实现的aop&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2008/12/06/pythonaop.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1349405.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48007/" target="_blank">IE颓势不减 微软下月公布最新浏览器架构</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>获取数据库结构的奥义......(无码，完全版，未删节)</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2008/10/14/1310722.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Tue, 14 Oct 2008 05:10:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2008/10/14/1310722.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1310722.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2008/10/14/1310722.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1310722.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1310722.html</trackback:ping><description><![CDATA[摘要: 看过《朝花夕拾:代码生成器的基础——获取数据源的架构信息》一文，感觉，方法正确但是点到即止，没有完全说透，所以来个补全版。经验之谈，欢迎拍砖首先是获取的方法，没错，都是采用的Connection的GetSchema方法，但是这个方法对于不通的Connection来说，也就是底层连接的数据库有所不同的话，返回的DataTable其实是有区别的。有的是返回所有表和视图，有的是返回系统表+用户表+视图，&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2008/10/14/1310722.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1310722.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48002/" target="_blank">竞争日趋激烈 微软欲借 Windows 7 扭转战局</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Why .NET Sucks?</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2008/09/08/1287168.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Mon, 08 Sep 2008 15:17:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2008/09/08/1287168.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1287168.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2008/09/08/1287168.html#Feedback</comments><slash:comments>41</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1287168.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1287168.html</trackback:ping><description><![CDATA[<p>写此文纯粹为了回复<a href="http://www.cnblogs.com/windyitian/archive/2008/09/08/1287111.html">.NET不死，为什么企业招聘都要java？</a> 一文。从01年以来，.NET从最初的2000beta2一路凯歌猛进到了2008，Framework从1.0一下子跃进到了3.5，从3.5以来 wpf，wcf，wwf，Linq，ASP.NET MVC，我们的感觉是.NET很好很强大，什么都有。但是.NET的程序员怎么就越来越不值钱了呢？很简单的对比，在我原来所在的一个公司里，有java的项目也有.NET的项目，做Java的程序员待遇普遍比做.NET的高出一大截。就程序员本质来说其实并没有多大的区别，那么问题就只能在.NET本身上头来找，所以就有了本文：Why .NET Sucks?</p>
<p>第一，一种技术是否值钱，首先取决与市场价值，当然对于C#或者Java这类应用领域非常一致的商用语言来说，其实越难学的也就是工资越高的。越难学的工资越高这句话绝对是话糙理不糙。难学说明了人力成本中的培训成本会比较高，所以这类技术人员的工资确实就要高一些。那么.NET的超级工具，让我们开发起来超级方便的超级工具：VS.NET其实就是制约我们工资提升的最大障碍，老板会理直气壮的告诉你，会用VS.NET拖拖拉拉就能开发的程序员量产起来快得很，就这点工资你不老实干就开掉你换一个，你后头还有好几个找不到工作的.NET程序员供我选呢。</p>
<p>其二，.NET提供给我们的发展空间太狭窄了（或许是我眼光太狭窄），罗列一下之前我提到过的：wpf，wcf，wwf，Linq，ASP.NET MVC，微软把什么都做了，留给我们的除了傻乎乎的拿起linq，wcf，wwf去吭叱吭叱的码格子堆代码，还剩下些什么呢？架构设计？那是少数人的事情毕竟也轮不到程序员。做业务分析？那也是少数派报告。不可能一个项目从头开始全部手写代码吧？这样是不是活回去了？java程序员从Struts到Spring到Hibernate可谓武装到了牙齿。整套下来还不要钱，觉得Hibernate不合适还可以换ibatis，apache下头一大队候补的佳丽，可谓是后宫佳丽3千，试问.NET又能够靠什么让六宫粉黛无颜色呢？前有JAVA的堵截，后头还有ROR，Python，PHP，一大群追兵，从标榜自己开发起来不是一般得快的ROR（不知道沉得是否也快），到标榜自己跑起来飞快的Python（豆瓣的神话造就了Python的急速传说），还有标榜自己光膀子不怕穿鞋，完全免费的PHP。再换句话说，我们就坚定不移的跟着微软走吧，那么除了拿着VS.NET做网站，我们还剩下了些什么事情做呢，那就怪不得人家招JAVA的人多了，用JAVA做工作流中间件的可以卖钱，你用.NET试试，人家直接跟你说我们用WWF了，还用花钱用你的？做个ORM，MVC框架能卖钱？到处都是免费的，微软自带的，绝对没有任何一个开发企业会为了ORM还是MVC什么的花一分钱，要用都用开源的，所谓微软这种大包大揽的行为极大的打击了开源团队的积极性，MonoRails还没说要收钱呢，微软就忙不迭的搞了个自己的MVC框架出来。看着Java下第三方厂商的中间件热火朝天的时候，还真不知道我们应该在.NET下做点什么能卖钱的。</p>
<p>&nbsp;</p>
<p>其三是我个人多年来在使用.NET的时候的积怨，其实我到现在为止都挺厌恶微软给.NET设计的API，太恶心，尤其是Drawing下边的哪些API流露出浓重的MFC的味道。而且异常处理的机制也异常的混乱，既然有了异常处理的机制就用异常来解决问题嘛，结果有的通过返回bool来提示错误，有的通过错误标示的参数来返回错误，异常也没有声明的机制，结果很多时候在使用一些类的时候根本不知道有哪些异常需要处理，很多新手就很笼统的给个Exception了事，那么这个异常处理的机制还有什么用呢？习惯了JAVA的声明式异常之后会很迷惑于这种模糊的方式。</p>
<p>&nbsp;</p>
<p>还有一个很搞笑的地方就是异常的抛出：throw ex,throw,throw new XXException("error",ex);一个会中断异常的堆栈，一个不会另一个也不会，这不是多此一举么，简直就是茴香豆的回有四种写法。直接让throw ex不会中断异常堆栈就行了何必还要多此一举呢？<br />
</p>
<p>-------------------------------------------------------原文------------------------------------------------------------------------------------ <br />
</p>
<p align="left">还有一个很搞笑的地方是，你在捕获到一个异常的时候还不能直接把它抛出去，还要new一个异常，把捕获到的异常作为InnerException包裹一次后才能抛出去，不然在调试的时候就跟踪不到真正出现错误的地方而是在直接抛出的那个地方中断了。</p>
<p>----------------------------------------------------------------------------------------------------------------------------------------------- <br />
</p>
<p>都到了3.5了都还没有提供对DynamicProxy的支持，结果现在.NET下的AOP看起来都还是那么怪异，实现起来也麻烦。 <br />
</p>
<p>&nbsp;</p>
<p>其实发了很多牢骚，说.NET Sucks也不过是气话，我们无法否认.NET是一个伟大的开发平台，无法否认微软是一个伟大的公司，不过.NEt再伟大，得到利益的始终是微软而不是广大的开发人员而已。 <br />
</p>
<p>&nbsp;</p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1287168.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48001/" target="_blank">上海电信计划2012年80%用户实现100M带宽</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>自己动手实现纯Web远程监控系统(纯Web，跨浏览器)</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/30/1279856.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Fri, 29 Aug 2008 16:23:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/30/1279856.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1279856.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/30/1279856.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1279856.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1279856.html</trackback:ping><description><![CDATA[摘要: 想不想能够在网上看到自己家里的情况？罗技的网络摄像头又贵效果又不好，而且就只能摆一个死角度，而且页面上要安装插件，专业的监控系统死贵死贵，而且还是要用插件或者专门的软件，甚至有的还有端口限制，防火墙穿透能力极差。我们现在的目标就是在有限的资金投入下实现一个纯Web（没有专用插件），跨浏览器，支持摄像头的控制（水平270度，垂直210度，带变焦）的远程监控系统。甚至还能支持拍照和录像功能。首先由于资&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2008/08/30/1279856.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1279856.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48000/" target="_blank">数万名网友签名抗议星际争霸2取消局域网功能</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>实体类是个什么东西！答金色海洋同学的疑问</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/28/1278375.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Thu, 28 Aug 2008 02:18:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/28/1278375.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1278375.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/28/1278375.html#Feedback</comments><slash:comments>42</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1278375.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1278375.html</trackback:ping><description><![CDATA[<p>其实不想再啰嗦这个问题，但是要回答的东西很多，所以还是另起贴回复了。之前从很多方面来解释了分层，但是对于实体类这个家伙由于是一个一根棒子捅到底的异类，所以引起金同学的疑问，由于涉及到我的另一篇post，所以不得不作出几点说明。</p>
<p>其一，实体类是什么？</p>
<p>这里我做出一个符合大多数系统的定义：实体类就是只有属性且属性与数据库表的列定义一一对应，用途为在各个层次间传递数据的载体。也即是DTO（Data transfor object，大致这么拼写的）数据传输对象，java里叫pojo。那么我认为这个类的定义就是一个数据结构。<br />
</p>
<p>那么我们回过头来说数据结构。程序就是 数据结构+算法，这句话算是经典了，那么面向对象的程序里，类就是数据结构+算法的一个集合体，唯一的不同是面向对象提成封装，数据结构为私有，这样子通过方法作为契约来降低类之间的耦合度。但是，这不能从根本上解决问题。程序的数据不是内部 凭空而来，无论是输入还是输出都需要和外部由一个接口，那么这个时候这个接口就是一个耦合点。之前谈耦合的时候估计金同学没认真看，在接口的契约中，应该考虑采用标记耦合<br />
</p>
<p>------------无耻的自我引用----------------</p>
<p><strong>标记耦合</strong> ：一组模块通过参数表传递记录信息，就是标记耦合。这个记录是某一数据结构的子结构，而不是简单变量。</p>
<p>------------------------------------------</p>
<p>其实实体类就是这个：某一数据结构的子结构。<br />
</p>
<p>我们可以认为，数据库的结构也是一种数据结构（从数据结构的广义定义来说，确实是数据结构，数据存储的结构），那么实体类作为数据库表结构在程序中的映射来说也就是一种数据结构了。那么</p>
<p>CreateUser(UserEntity user)</p>
<p>这样子的&#8220;接口定义&#8221;（注意引号，此接口非彼接口）就是所谓的标记耦合了。<br />
</p>
<p>&nbsp;</p>
<p>再对比一下公共耦合的定义：</p>
<p>------------无耻的自我引用---------------- <br />
</p>
<p><strong>公共耦合</strong>：若一组模块都访问同一个公共数据环境，则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。</p>
<p>------------------------------------------</p>
<p>数据库作为全局的数据结构，自然也够得上公共耦合了，如果要真这么定义那么也没办法解决，这是个无解的问题，要用数据库就比如和这个公共的数据结构耦合。<br />
</p>
<p>&nbsp;</p>
<p>而且，必须注意的一点是，<strong><span style="color: red;">耦合是模块之间的消息传递、数据传递的途径，耦合是中性的，不可避免的 </span></strong><br />
</p>
<p>&nbsp;</p>
<p>所以在这点上努力是纯粹的在做无用功。也即是即使不用实体类，那么数据库的结构变了，也即是数据结构变了，那么修改代码是必然的，不可改变的结构。正如同操作数组做冒泡排序的算法如果把数组换成了hashtable还能正常工作？</p>
<p>&nbsp;</p>
<p>DataSet，不管强类型的还是弱类型的，DataReader都是要和数据库耦合的，所以这两个和实体类没什么区别。<br />
</p>
<p>&nbsp;</p>
<p style="color: red;"><strong>难道我们什么都不做？</strong>&nbsp; 答案是否定的<br />
</p>
<p>&nbsp;</p>
<p>就我现在的观点来说，解决之道就是<strong><span style="color: red;">动态</span></strong>。ORM用实体的定义作为契约，动态化了对数据的访问，所以如果数据库发生了变更我们只需要修改实体类和定义，这就大大的减小了对程序的修改。spring动态化了对业务模块的依赖，我们可以很容易的替换业务模块。那么如果数据库发生了变更，在修改实体类和定义的基础上我们只需要数据库修改的表所涉及的业务模块用新的替换掉就ok了。而界面上，动态的表单和数据控件也能够极大的减小修改的幅度。<br />
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>这里有一点是需要对金同学说明的：你的控件就算是用事件把一部分业务逻辑的工作剥离出来，但是业务逻辑是和数据耦合的，那么你用什么来让业务逻辑知道你的数据结构？数组？DataReader？DataSet？</p>
<p>表单所以依赖的数据结构变化了，配置变不变？所谓配置也就是程序的一个延续，我认为配置其实就是一种外置的DSL（见 <a href="http://www.cnblogs.com/Alexander-Lee/archive/2008/08/26/1277124.html">why xml sucks</a>） <br />
</p>
<p>修改配置文件和修改程序，很多时候由一个误解认为修改xml文件比修改程序好，殊不知xml文件的修改没有经过编译时的检测，而程序是通过了编译时检测的，修改xml的出错几率比修改程序高100倍（这点我好像在 <a href="http://www.cnblogs.com/Alexander-Lee/archive/2008/08/26/1277124.html">why xml sucks</a> 里头漏掉了）。<br />
</p>
<p>说回来，数据表的结构变化了，其实还是会涉及到对界面的修改，只不过你的控件把这个修 改从页面文件剥离出来，改成了修改配置文件（或者配置数据）。如果没有工具来完成配置的工作，出错的几率比修改页面高得多，且debug也复杂得多。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>还有一点要对回复金同学疑问的一些同学说的：好多同学对spring的理解委实有很大的偏差。spring是一个ioc容器+aop容器+抽象服务的集合体，当然我们用的最多的是前两者。很多同学吧ioc和aop弄混了。ioc是依赖注入的概念，其实也就是对虚拟工厂模式和代理模式的实现，而aop是方法切片，也就是在调用方法的前面和后面动态的植入另外的要执行的代码（其实也就是方法）。<br />
</p>
<p> <br />
</p>
<p><br />
</p>
<p> </p>
<p>&nbsp;</p>
<p> <br />
</p>
<p> </p><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1278375.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47999/" target="_blank">Silverlight打造杰克逊纪念专题</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>why xml sucks</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/26/1277124.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Tue, 26 Aug 2008 15:56:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/26/1277124.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1277124.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/26/1277124.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1277124.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1277124.html</trackback:ping><description><![CDATA[<br />
2000年以来，这是一个xml大行其道的年代。xml无所不能，我们如同崇拜x战警的强悍战斗力一般崇拜这个x开头的万能者。我们用它来传输数据（soap），定义数据（xsd），存储数据（xml数据库），配置文件（web.config或者web.xml），做网页（xhtml）......换一句二战的名言：如果xml能够做饭我就娶她做老婆。<br />
但是神话就是用来打破的。现在是到了打破这个顶在x字头顶上的光圈了。<br />
why xml sucks？<br />
当然没有一个全无能的废人正如没有一个全能超人一样，xml并不是在所有的时候都sucks，我的确将题目夸大了。但是我的目的还是很明确的，我们将xml神话了，然后滥用了，之后xml就在很多自己并不擅长的地方sucks了。<br />
<br />
fisrt sucks：存储数据<br />
xml天然的不适合存储数据。第一是冗余数据太多，xml文件本身就够浪费的了，然而一个xml树在内存中会扩大将近10倍的体积，也就是说1M的xml文件在内存中会占据大约10M的空间。所以用xml来存储数据非常的suck，除非是非常小的存储量的情况。<br />
<br />
second sucks：传输数据（比如ajax）<br />
在Web上远程获取数据使用xml这个庞然大物简直是太浪费了，所以很快用ajax远程调用WS的方式很快就从xml的序列化改成了json这种轻量级的方式。群众的眼睛是雪亮的。<br />
<br />
third sucks：配置文件<br />
如果用过hibernate，或者spring，或者任何java的传统的类库，大概会严重同意xml的配置文件极大的伤害了我们的视力。确实xml的配置包含了太多的无用内容，不容易阅读（起码我就觉得还不如ini来得容易看）。而且就用途来说，类似hibernate或者spring的配置来说，与其说配置倒不如说是一种外置的DSL，特别是spring。也可能是java或者c#的死板和强硬造就了xml，所以yaml这类看着易懂，写起来哈皮的配置方式一直很难看到，还是IronPython的同学比较有福气。<img src="http://www.cnblogs.com/Emoticons/others/surprise02.gif"  alt="" /><br />
老实说其实我很赞同程序也就是配置的思想（修改web.config会导致重新编译WebSite，那么我们修改了.cs文件导致重新编译有什么区别呢？特指WebSite的情况）。<br />
<br />
归根结底，计算机语言 写的是人，看的是机器，而xml所标榜的语义在很多时候就毫无意义，为了人看着能明白，结果是牺牲了机器处理的效率，结果最后我们发现，其实如果没有很好的工具的话纯粹书写也绝对是一种酷刑。<br />
<br />
so that's why xml sucks<br />
<br />
say no to xml:当然暂时还做不到，除非.net支持yaml。<br />
.net和java这对难兄难弟中xml的流毒很深，所以如果要对xml say no，还是投奔动态语言的怀抱吧。<br />
<br />
<br />
【引用】<br />
yaml:<br />
&nbsp;和GNU一样，YAML是一个递归着说&#8220;不&#8221;的名字。不同的是，GNU对UNIX说不，YAML说不的对象是XML。<br />
YAML不是XML。<br />
介绍yaml的page：http://www.ibm.com/developerworks/cn/xml/x-cn-yamlintro/<br />
<br />
&nbsp;<img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1277124.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47998/" target="_blank">传诺基亚正在开发Android手机</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>从UI-&gt;DB一条龙到代码生成到EOS，谈谈快速开发</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/26/1276262.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Mon, 25 Aug 2008 16:03:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/26/1276262.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1276262.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/26/1276262.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1276262.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1276262.html</trackback:ping><description><![CDATA[摘要: 人性是懒惰的，程序员尤其如此。再懒惰的人为了让自己过得更舒服，偶尔也会很勤快，程序员还是如此。我是一个懒人，所以赞同金色海洋同学的同学都是懒人。无可否认，对于懒人来说，极大降低重复工作量的方案无疑是充满了诱惑的。所以在极大的诱惑下我花了很长的时间来思考了一下关于快速开发的问题。毫无疑问 VS.NET工具本身就是一个非常优秀的快速开发的系统（比起java来说确实要快速很多），但是对于懒惰的我们来说却是不够的。而且在多层架构下要快速开发使用VS.NET还是会产生很多重复的代码。这对于懒惰的我们来说是极其要命的。所以我们不顾一切的想要去解决这个问题。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2008/08/26/1276262.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1276262.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47998/" target="_blank">传诺基亚正在开发Android手机</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>由【超级传送带】谈系统中如何使用数据库</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/17/1269579.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Sat, 16 Aug 2008 16:02:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/17/1269579.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1269579.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/17/1269579.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1269579.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1269579.html</trackback:ping><description><![CDATA[摘要: 看过金同学的【超级传送带】这篇Post及其里面的Reply，我又要深有所感，于是有话不得不发了。对系统设计来说之前我也说过没有一定之规，不通的系统设计的前提和背景有所区别，那么设计的方式有可能南辕北辙。就算是围绕数据库，以数据为核心的系统也会因为设计的出发点不通而产生很多相反的看法。那么我还是首先设定本次讨论的前提：一个以数据库为存储手段，以数据为核心的应用程序，比如说一个电子商务系统（又比如NewEgg，不要误会，我不在 NewEgg工作，只是有所了解）。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2008/08/17/1269579.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1269579.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47996/" target="_blank">7月编程语言排行榜</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>水无常态兵无常势-架构何须拘泥于形式？应赵俊同学的疑问</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/15/1268960.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Fri, 15 Aug 2008 12:33:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/15/1268960.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1268960.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/15/1268960.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1268960.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1268960.html</trackback:ping><description><![CDATA[摘要: 看过赵俊同学的《三层架构，我为什么对你越来越迷茫了》深有所感，遂作此文以和之。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2008/08/15/1268960.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1268960.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47995/" target="_blank">Google Voice 上手</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>鬼吹灯-漫谈大型网站的架构</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/14/1267750.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Thu, 14 Aug 2008 05:17:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/14/1267750.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1267750.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/14/1267750.html#Feedback</comments><slash:comments>47</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1267750.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1267750.html</trackback:ping><description><![CDATA[摘要: 看到很多社区的小组里头有人在讨论大型网站的架构问题，发觉这几年虽然没搞出个新浪百度出来，但是在大型系统的架构上还是有点心得，遂鬼吹一把，来谈谈大型网站的架构设计。

首先我们要明白什么算是大型网站，大型的网站有多大才叫大型？新浪、百度还是Google这般巨大？是用户数量很多，还是业务量很大。这里又分是社区类网站还是新闻类还是电子商务类的网站。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2008/08/14/1267750.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1267750.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47994/" target="_blank">Google号召社区力量为互联网加速</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>系统设计的变与不变（兼答金色海洋的疑问）</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/14/1267677.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Thu, 14 Aug 2008 03:34:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/14/1267677.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1267677.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/14/1267677.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1267677.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1267677.html</trackback:ping><description><![CDATA[系统设计的变与不变（兼答金色海洋的疑问）<br />
<br />
首先我们的讨论范围是针对基于数据库的应用设计，还有很多应用不会基于数据库来实现那就暂时不在我们的讨论范围内，<br />
在之前对分层设计的讨论中，金色海洋同学觉得分层没有解决数据库的表字段改动造成的各个层次代码的变动问题，那么<br />
我就以系统的变与不变做题来回答这个疑问。<br />
<br />
首先，对系统代码的改动是不可回避的问题，能够适用所有情况的万能组件就我现在看来还没有发现此类非地球物种。那么<br />
在系统设计中哪些应该变那些是不应该变的呢？首先从系统的结构上来说（以ASP.NET为例）。<br />
<br />
从以数据库为基础的应用程序上来说，以读取数据为例，整个程序的运行流程我们可以划分为几个阶段：<br />
首先是从页面获取参数-&gt;业务逻辑的判断逻辑-&gt;数据库操作的逻辑（发送Sql，获取返回数据集）-&gt;业务逻辑判断-&gt;页面显示逻辑。<br />
然后我们把这些相关的操作一分类，获取参数和页面显示逻辑显然都是在页面上或者和页面关联的类里实现，或者有人通过接口<br />
扩展到了用其他类来实现，我们把这类类归结到一起，就是显示层了，这个层就算通过接口和页面分割了，但是也是和页面高度<br />
耦合的。类似aspx页面和aspx.cs之间可以算作是内容耦合：<br />
比如在展现逻辑需要增加一个要显示的字符串（有可能不是因为数据表增加了列，而是在业务逻辑计算生成的。），那么这个时候<br />
页面就必须做修改。<br />
逻辑判断的类都算在业务逻辑层，为什么会需要业务逻辑层？在网站上的话大多数时候只是简单的读取数据，那么这个层次看似<br />
就很鸡肋，但是我们换一个地方来看，比如，登录、找回密码这些<br />
我们注册一个用户的话，再点击注册后，我们首先会检测用户是否存在，然后要对输入经行验证。再比如登录的时候我们需要对<br />
输入的用户名进行验证，有的时候不光是对数据库里的用户进行验证，有的时候还可能会通过接口去获取其他系统的用户信息来<br />
判断，比如在互联星空上你可以通过注册帐户也可以通过宽带和小灵通帐户都可以登录，那么这些复杂的判断工作就放在业务逻辑层了。<br />
这个层是变化最大的层，我们会尽量把用户的变化都体现在这里，一旦用户的业务逻辑发生了变化，那么就只需要变化这个层的代码。<br />
<br />
那么我们要注意一个概念的区别，系统的模型和业务逻辑。系统的模型是对用户需求分析后对系统运行方式的一个规划，数据库的设计<br />
就是根据系统的模型来建立的。<br />
打个比方我们要设计一个网络书店，经过分析我们决定建立一个表，Book来存储书的信息，里面有ISBN啊，书名等信息。结果等我们做<br />
到一半，客户突然说，好像不同的书要存储的属性不大一样，幼儿图书需要标明适合阅读的年龄层次，科技类图书需要标明相关的技术<br />
类型。这个时候你是不是要抓狂？这个时候就是对系统模型要进行就改了。错误在哪里呢？也许就是在需求调研的时候不够仔细，少问<br />
了几个为什么。在对系统模型做更改的时候，包括增减数据库的字段都算是类似的情况，这个时候任何架构都不能保证不对每个层修改<br />
代码。这是必然的。<br />
<br />
而业务逻辑呢？什么是业务逻辑，其实也就是逻辑上的判断。设计的不好的逻辑层可能充满if...else...设计得好的也许到处充满着如果设计<br />
模式的经典运用。但是不管是怎么样的设计，业务逻辑层所做的最多的就是判断和数据组织。比如登录。还是用互联星空做例子。<br />
<br />
客户的需求说明里：对录入的用户名，先检测是否宽带用户，再检测是否注册用户，都不是再看是不是外省用户，都不是就返回失败<br />
<br />
这就是业务逻辑。<br />
如果客户在后来的某个时候修改了登录方式的业务逻辑，改为：先看是否省用户，再检测是否注册用户，最后检测是否宽带用户。<br />
<br />
那么我们只需要修改User.Login的代码就可以了。<br />
<br />
所以我的观点是，在设计系统的时候要做好需求调研，把系统的模型设计好，留好变动的余量，在商务上尽量说服用户不要作出改变系统<br />
模型的需求变更。这是系统设计的不变。系统设计上的分层，采用MVC就是为了分离责任，为业务逻辑变更带来的系统改变做好准备。在业<br />
务逻辑发生改变的时候不至于打动干戈，这是系统的变。<br />
<br />
最后来说说金色海洋同学的新想法。<br />
=============================================================================<br />
表——表单控件。<br />
<br />
因为是信息管理方面的程序，是以数据为中心的，一般数据都是要放在数据库里面的，而数据库一般都提供了强大的数据操作功能。<br />
<br />
我们为什么仅仅把数据库当作存储数据的容器呢？<br />
<br />
我们为什么要忽略T_SQL的强大呢？<br />
<br />
所以我的思路是（信息管理方面的程序）：以数据库为主，围绕T_SQL编程。<br />
<br />
从现实的世界里面去抽象，我们得到了book，猫、狗，动物这样的类。<br />
<br />
那么从数据库的角度去抽象，我们会得到什么呢？我得到了表单控件、分页控件，呵呵。<br />
<br />
===============================================================================<br />
金同学这样子的话就直接迈过了业务逻辑，直接从数据到了表现。但是这样子的问题显而易见，无法应对变更，如果客户需要一个数据在进入数据库前需要先经过比较复杂的判断和计算才能入库。那么问题也就来了。首先这个控件无法适应所有的数据库设计，还需要专门的配置表或文件进行支撑，或者干脆就是使用自己的一套来存储数据。最后的结果就是有可能会因为系统的任何一点改动而去修改这个控件。呵呵<br />
<br />
=================================================================================<br />
那么如果一个类可以实现一个功能，而类的内部代码又不是很复杂，也是比较清晰，可维护、可扩展的。<br />
<br />
那么这个类还有耦合吗？<br />
<br />
类的内部就没有耦合了吧，只是在调用这个类的时候才会出现耦合。<br />
=================================================================================<br />
这里就很明白了，类就是要简单，功能单一，越简单的类越容易维护<img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1267677.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47994/" target="_blank">Google号召社区力量为互联网加速</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title> 谈谈系统中的耦合以及从另一个角度来解释姜同学的疑虑</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/13/1267356.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Wed, 13 Aug 2008 14:22:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/13/1267356.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1267356.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/13/1267356.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1267356.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1267356.html</trackback:ping><description><![CDATA[摘要: 今天姜同学发表了http://www.cnblogs.com/ASPNET2008/archive/2008/08/13/1266942.html   
这篇POST表达了对通过分层设计的概念无法解决系统耦合的问题。在之后andytao同学回复了对姜敏朋友的回复 一文作为回应
我在看回复的时候感觉说得不太透，所以忍不住发此文从另外一个角度来试着为姜同学做一次解答。
首先是从姜同学的疑虑开始。姜同学对分层主要是担心增加了工作量缺起不到消除系统耦合的目的。所以我们首先就来谈谈耦合。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2008/08/13/1267356.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1267356.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47989/" target="_blank">Twitter无处不在 魔兽世界Twitter发送器插件发布</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>做了个一个新的DAL组件，全源码供应，欢迎试用，帮忙挑错</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/10/query2object_publish.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Sun, 10 Aug 2008 13:18:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/10/query2object_publish.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1264764.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2008/08/10/query2object_publish.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1264764.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1264764.html</trackback:ping><description><![CDATA[摘要: 用了段时间Linq，结果发现周围很多人都还是在2.0上工作，而且支持3.5的主机不多，想自己弄得小东西来玩玩在2.0下离开了linq又不很方便了，遂自己发明了一个轮子。思路很简单，支持常规的Sql操作，强类型生成Sql，支持批量删除和更新。为了提高效率用到了代码生成，在WebSite下可以用Build Provider自动生成，如果自己写一个exe调用生成代码的Dll，一个方法就能生成了，也可以写个临时页面调用生成，可能过几天我会增加一个VS的 Addin来方便在WinForm和WebApplication项目中的使用。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2008/08/10/query2object_publish.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1264764.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47988/" target="_blank">Firefox 3.5匆忙推出漏洞多 Mozilla本月将更新</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>再论模板引擎-超越模板引擎</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2008/07/08/TemplateEngine2.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Tue, 08 Jul 2008 05:20:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2008/07/08/TemplateEngine2.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1238105.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2008/07/08/TemplateEngine2.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1238105.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1238105.html</trackback:ping><description><![CDATA[摘要: 说了半天看来还是没说明白，估计是长时间不写博语言组织能力退化了。其实要说的很简单，用了那么多模板引擎（为了赶项目自己还写过一个）结果到头来我发现自己在做一件很蠢的事情。让模板引擎支持判断，循环，分支，不同的强化出各种不同的标签，标签越来越像asp.net的控件标签，API越来越复杂。也许最后一回头发现我们实现了一个asp.net老早就已经存在的东西。那为什么我们不现在直接就拿来用了？<br>以下我将分几个部分来说明我的观点，再次重申，我不是说不用模板引擎，我的观点是aspx文件本身就是最好的模板引擎了，至于如何用，我后面会给出一个我自己用的一种方式，当然你也可以总结出你自己的：&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2008/07/08/TemplateEngine2.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1238105.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47987/" target="_blank">预测：Twitter最可能收购的十家公司</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>从模板引擎到模板引擎-使用aspx页面作为模板引擎的一种实现</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2008/07/08/aspxTemplateProject.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Tue, 08 Jul 2008 01:54:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2008/07/08/aspxTemplateProject.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1237953.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2008/07/08/aspxTemplateProject.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1237953.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1237953.html</trackback:ping><description><![CDATA[摘要: 此文完全有感而发，在网上看到很多介绍各类模板引擎的文章，但是我却越来越感觉到很多时候我们所做的事<br>情是在舍近求远。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2008/07/08/aspxTemplateProject.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1237953.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47987/" target="_blank">预测：Twitter最可能收购的十家公司</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>东拉山元旦游雪记</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2007/12/31/1021624.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Mon, 31 Dec 2007 06:40:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2007/12/31/1021624.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/1021624.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2007/12/31/1021624.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/1021624.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/1021624.html</trackback:ping><description><![CDATA[<h1>东拉山的雪 - 啥也不说 - 直接看图</h1>
<div class="ImageList">
<div class="ImageThumbnail">
<div class="ImageThumbnailImage"><a id="rprImages_ctl01_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49908.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0170.JPG"  alt="" /></a>&nbsp;平乐古镇的腊肉 <a id="rprImages_ctl02_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49909.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0187.JPG"  alt="" /></a> 发现第一只大熊猫的宝兴县&nbsp; <a id="rprImages_ctl03_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49910.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0195.JPG"  alt="" /></a> 东拉山口 </div>
</div>
<div class="ImageThumbnail">
<div class="ImageThumbnailImage"><a id="rprImages_ctl04_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49911.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0204.JPG"  alt="" /></a>&nbsp;明镜海&nbsp; <a id="rprImages_ctl05_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49912.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0208.JPG"  alt="" /></a> 很漂亮的水哇 <a id="rprImages_ctl06_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49913.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0214.JPG"  alt="" /></a> 一起来一张 <a id="rprImages_ctl07_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49914.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0215.JPG"  alt="" /></a> 亲一个再来一回 <br />
<a id="rprImages_ctl08_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49915.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0230.JPG"  alt="" /></a>&nbsp;雪地里的一抹红&nbsp; <a id="rprImages_ctl09_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49916.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0234.JPG"  alt="" /></a> 红裙&nbsp; <a id="rprImages_ctl10_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49917.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0235.JPG"  alt="" /></a> 斗牛士&nbsp; </div>
</div>
<div class="ImageThumbnail">
<div class="ImageThumbnailImage"><a id="rprImages_ctl11_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49918.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0238.JPG"  alt="" /></a>&nbsp;雪桥 <a id="rprImages_ctl12_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49919.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0251.JPG"  alt="" /></a> 飞瀑1 <a id="rprImages_ctl13_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49920.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0253.JPG"  alt="" /></a> 飞瀑2&nbsp; <a id="rprImages_ctl14_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49921.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0260.JPG"  alt="" /></a> 一地雪&nbsp; </div>
</div>
<div class="ImageThumbnail">
<div class="ImageThumbnailImage"><a id="rprImages_ctl15_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49922.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0269.JPG"  alt="" /></a>&nbsp;玩水 <a id="rprImages_ctl16_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49923.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0270.JPG"  alt="" /></a> love <a id="rprImages_ctl17_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49924.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0271.JPG"  alt="" /></a> 顶个大雪球 <a id="rprImages_ctl18_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49925.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0275.JPG"  alt="" /></a> 雪花&nbsp; </div>
</div>
<div class="ImageThumbnail">
<div class="ImageThumbnailImage"><a id="rprImages_ctl19_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49926.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84-DSC_0252.jpg"  alt="" /></a>&nbsp;瀑布边 <a id="rprImages_ctl20_lnkThumbnail" href="http://www.cnblogs.com/Alexander-Lee/gallery/image/49927.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/118186/t_%e6%94%b9%e5%8f%98%e4%ba%86%e5%a4%a7%e5%b0%8f%e7%9a%84DSC_0292.JPG"  alt="" /></a> 雪人 </div>
</div>
</div>
<img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/1021624.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47986/" target="_blank">网易澄清:与暴雪合资公司仅提供技术支持</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>马上就要08年了，C#拿怎么做Codereview？</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2007/11/12/957262.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Mon, 12 Nov 2007 13:28:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2007/11/12/957262.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/957262.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2007/11/12/957262.html#Feedback</comments><slash:comments>32</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/957262.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/957262.html</trackback:ping><description><![CDATA[摘要: 这段时间确实遇到一个很有意思的问题。众所周知，Codereview是配置管理过程当中一个相当重要的过程，对于提高代码质量来说有着相当重要的作用。上个月开始公司的过程改进已经推进到了配置管理中的CodeReview这个阶段。对此我首先是考察了各种语言下的静态代码分析软件。因为公司所用的语言比较杂，所以为了照顾大多数，C，C++有老牌的PC-lint。java下有CheckStyle。但是C#找来找去就找到了个FxCop&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2007/11/12/957262.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/957262.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47985/" target="_blank">杰克逊悼念仪式或成史上最大规模Web活动</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>大能的神啊，请允许我在首页求一个工具：StyleCop</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2007/11/12/LookingForStyleCop.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Mon, 12 Nov 2007 03:57:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2007/11/12/LookingForStyleCop.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/956597.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2007/11/12/LookingForStyleCop.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/956597.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/956597.html</trackback:ping><description><![CDATA[请DuDu允许我放半天首页，以期有在微软工作的大能放出StyleCop的下载的Url。此工具据称是微软内部使用，因为在MsBuild里找到了她的芳踪，但是到处都找不到下载。所以又在微软工作的大贤，请帮忙放出这个工具。<br />
<br />
我们需要的是Source Code 的Check工具，而不是Assembly的Check工具。FxCop是很大能，但是对我们并不适用。<br />
<br />
如果大家对配置管理和代码规范以及CodeReview有所心得，也请不吝赐教。
 <img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/956597.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47985/" target="_blank">杰克逊悼念仪式或成史上最大规模Web活动</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>从StringTemplate和jQuery打架说说StringTemplate短板</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2007/10/26/938344.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Fri, 26 Oct 2007 02:43:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2007/10/26/938344.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/938344.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2007/10/26/938344.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/938344.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/938344.html</trackback:ping><description><![CDATA[早上在用StringTemplate转化一个html文件的时候出错，转换出来一片空白，后来仔细一看，原来文件里引入了jQuery.<br />
jQuery使用了$而StringTemplate也使用了$作为关键字来定位变量，结果二位大神打架，我就遭了殃。<br />
我并没有去仔细研究StringTemplate的源代码，但是用一个单个关键字作为定位的依据却是有点说不过去，这样你的模板里绝对不能出现$（专跟钱过不去）<br />
这一点不改似乎会严重制约StringTemplate的发展。<br />
<br />
其实都不用加$，直接在文件开头部分引入jQuery就个屁了。真是怨念，如果有StringTemplate的大神能够指教在下如何才能不冲突，无限感激
 <img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/938344.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47984/" target="_blank">《商业周刊》:Mozilla的志愿者开发模式被复制</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>ASP.NET下难道就非得WebForm不可？</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2007/10/24/935955.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Wed, 24 Oct 2007 05:21:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2007/10/24/935955.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/935955.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2007/10/24/935955.html#Feedback</comments><slash:comments>30</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/935955.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/935955.html</trackback:ping><description><![CDATA[之前发过一篇《<a id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/Alexander-Lee/archive/2007/10/19/TalkAboutMVC.html">混乱的MVC，.NET非要MVC不可么？</a>》的Post，其后纷争不断。又有之前的《<a href="http://www.cnblogs.com/firstyi/archive/2007/10/17/927967.html">为什么要使用MonoRail？</a>》和其后的《<a href="http://www.cnblogs.com/Klesh/archive/2007/10/22/monorail-and-webform-which-is-the-victorinox.html">MonoRail和WebForm,谁是瑞士军刀</a>》等关于MVC和WebForm的讨论。其实最大的感受就是在.NET社区的人大多比较保守，宁愿跟着党走，WebForm的WebForm，MonoRails的MonoRails，而开源社区的思维就活跃多了，可以说是百花齐放，思维的碰撞使我们能够在其中得到更多的收益，从Struts，到springMVC，从Cocoon到Tapestry，从RoR到django不断的有新的idear冒出来，不断的有新的features。而在.NET社区却还在为选择WebForm还是MVC而伤脑经。且不说企业应用要如何如何，就纯技术的讨论来说也是百花齐放的比一言堂来的让人觉得舒心。为什么.NET老是要啃冷馒头吃剩饭（Nunit,Nhibernate,Nvelocity，N....）而没有一点自己的能够推广到其他的平台去的技术呢？.NET技术是要靠大家来一起推动，不是需要宣传,.NET已经够出名了，我们需要的是思考微软在ASP.NET中留下了很多的HOCK，我们还可以利用来做点什么，Web开发我们还有什么更好的idear没。正如怪怪所说MVC也好，WebForm也罢，都是出来多年的东西了，我们只需要学习，使用。而我们要研究，是如何用更先进的概念去提升他们，或者也许还有一些更新鲜的东西，比如让SmartClient如何摆脱对FramwWork的依赖等。<br />
也许有人会骂我，你娃娃自己都基础不牢靠爬都没学会就想学飞。但是我想提醒一下，学习和研究并不是前后关系，外国的小孩在读小学的时候就开始尝试自己研究历史等东西，交的作业也都是自己完成的研究报告，反过来看中国的小孩可能在小学就会解高阶方程，但是大多数都不会独立的去探索未知的东西。所以造成的结果就是---我们都能看见的，开源社区的项目，我们之前列举的项目，有多少是国内的技术人员提供的呢？这的确是一个很伤自尊心的事情。但是仔细研究会发现，其实这些项目并非使用了什么很高深的技术，而其中的每一行代码我们都能写得出来，但是为什么就没有人去想这么做和去这么做。<br />
如果你是真正热爱.NET技术，热爱编程，而不是只是想用编程的技能来养家糊口得过且过的话，我想你应该会认同我的看法。<br />
<br />
接下来的事情就是等着挨骂。
 <img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/935955.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47977/" target="_blank">Mono 的Virtual PC 虚拟机</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>闲话Web编程模型：WebForm、MVP还是MVC？</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2007/10/22/933027.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Mon, 22 Oct 2007 04:39:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2007/10/22/933027.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/933027.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2007/10/22/933027.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/933027.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/933027.html</trackback:ping><description><![CDATA[摘要: 此文写给所有还在迷茫中的初学者并欢迎高手进来讨论。<br>    首先什么是Web编程模型？在这里我们定义Web编程模型为如何编写代码生成html返回给最终用户的方法。它包括两部分，一个是如何编写Web应用程序的规范，另一个则是实现这一规范的Web编程框架，而ASP.NET就是用来实现WebForm模型的框架，当然ASP.NET的功能比较强大，留下了足够的空间，足够我们在此基础之上实现另外的模型，比如MonoRails。换个比方，和ASP.NET比较类似的，Jsp，Servlet也是实现Web编程模型的基础结构，Sun所定义的Jsp2.0规范定义了一个如何编写Web应用程序的规范，当然你可能不喜欢这么做，那么你还可以使用Struts或者SpringMVC，不过换汤不换药，之不过是换了一种做法而已。<br>    WebForm其实是一个很好的Idear。在我才接触WebForm编程的时候，当时的感触是原来Web下还能这么写程序。在WebForm模型下，我们将整个浏览器当成一个窗体来进行编程，把页面上的元素都作为控件来操作，拖放式，基于事件，不再是面条式的流程控制，一切都是那么的美好&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2007/10/22/933027.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/933027.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47970/" target="_blank">19岁天才黑客发布首个iPhone 3GS破解软件</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>在ASP.NET下做了一个实验MVC的小东西，希望能得到更多的参考意见</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2007/10/21/MVCTest.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Sun, 21 Oct 2007 11:53:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2007/10/21/MVCTest.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/932279.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2007/10/21/MVCTest.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/932279.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/932279.html</trackback:ping><description><![CDATA[摘要: 星期五下班前一时兴起，对MVC发表了一点看法。后来就想干脆弄个小东西来验证一些自己的想法帮组理清思路。所要源代码的免了，3个小时的急就章实在是乱得可以，既没有好的架构，也没有任何代码质量可言，主要是实现了对MVC的一点想法。所以拿出来大家给参考一下。申明：不是典型的MVC<br>&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2007/10/21/MVCTest.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/932279.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47969/" target="_blank">新浪邮箱大本营粉墨登场！Sina.cn开放注册</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>混乱的MVC，.NET非要MVC不可么？</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2007/10/19/TalkAboutMVC.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Fri, 19 Oct 2007 10:15:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2007/10/19/TalkAboutMVC.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/930821.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2007/10/19/TalkAboutMVC.html#Feedback</comments><slash:comments>31</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/930821.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/930821.html</trackback:ping><description><![CDATA[摘要: 最近流行MVC，不是因为大家都在用，而是他已经在.NET缺席N多年。本文题目是乱取的，吸引眼球而已<br><br>&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2007/10/19/TalkAboutMVC.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/930821.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47968/" target="_blank">IE市场份额首次跌破60%</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>浅谈跨域多点SSO（多注册服务器的SSO）</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/29/910373.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Sat, 29 Sep 2007 02:23:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/29/910373.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/910373.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/29/910373.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/910373.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/910373.html</trackback:ping><description><![CDATA[<p>多点SSO，我们这里可以理解为有多个注册服务器的SSO，也可以理解为分布式SSO，也即是用户的注册信息是分布在多台服务器上的，这类技术其实在现在来说是相对比较成熟的，比如tencent，skepy，互联星空等等大型的应用，比如Tencent的号码上亿，如果用一台服务器集中存储或者是只用一个群集来集中认证，那么所带来的漫长的等待是我们所不能忍受的。所以我们需要多点SSO。不过窃以为Tencent的QQ从技术上不应该用多点SSO来表述，而且实质上也不是SSO技术，而是Tencent自己的P2P协议来完成的。就自己的经验看来，其实多点SSO（着重是实现跨域服务器之间的分布式SSO）最好的例子应该是互联星空平台，限于保密协议的关系我们不继续讨论互联星空，我们来说多点的SSO。</p> <p>就技术上来说，多点SSO存在一下几点难题：</p> <ol> <li>多个注册服务器间的用户认证标示防止重复</li> <li>用户注册地址的定位</li> <li>跨域的认证状态同步（所有SSO都要解决的问题）</li> <li>注销登录状态的问题</li></ol> <p>对于第一点，一般来说可以借鉴SIP协议的方式。我们将用户的ID分成两段，前一段是注册站点内的ID然后在@后是网站的域名，结构上和Email地址差不多譬如<a href="mailto:Alexander-lee@cnblogs.com">Alexander-lee@cnblogs.com</a>，假设cnblogs.com就是我注册的站点，在注册的时候我只需要输入Alexander-lee，然后自动在尾巴上给我加上@cnblogs.com。这样子每个站点注册的时候限制就可以达到最小。</p> <p>同时，这个方式还可以达到定位用户注册服务器地址的作用，我们可以使用后面的域名信息来定位用户的注册位置，还是<a href="mailto:Alexander-lee@cnblogs.com">Alexander-lee@cnblogs.com</a>，识字的人看到都知道在cnblogs.com注册的。</p> <p>然后是跨域认证状态同步的问题。这个在拙作<a title="http://www.cnblogs.com/Alexander-Lee/archive/2007/01/27/631962.html" href="http://www.cnblogs.com/Alexander-Lee/archive/2007/01/27/631962.html">http://www.cnblogs.com/Alexander-Lee/archive/2007/01/27/631962.html</a>中已经描述的很清楚，也是大多数SSO所采用的做法（个人不建议使用跨域Cookie或者js注入等技术，都容易被严格点的浏览器挡获）。</p> <p>最后是注销登录状态的问题，这个在我原来的Post里面没有提到，对于单点SSO来说还算是比较简单的。但是对于多点SSO来说确是比较烦琐的事情了，因为需要清除多个服务器上的Cookie，还不能借助JS等客户端技术来完成的。最简单的方式就是所有站点全部使用非持久的Cookie，关闭浏览器就全部都失效了。但是如果是持久Cookie的话，个人来说还没有很好的主意，有一个想法就是在协议里规定一个Cookie用来存储所有登录过的服务器，然后在注销的时候一次一次的转跳到注销的接口页面（笨办法，期待高人给出比较简单的解决方案）。</p> <p>其实写这些东西是因为看了<a title="http://www.cnblogs.com/chinaxiaofei/archive/2007/09/28/909920.html" href="http://www.cnblogs.com/chinaxiaofei/archive/2007/09/28/909920.html">http://www.cnblogs.com/chinaxiaofei/archive/2007/09/28/909920.html</a> 这位高手的Post，看后感觉有很多问题没有谈到，也不是很完善，所以发此贴期待共同讨论。</p><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/910373.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47965/" target="_blank">Google App Engine宕机6小时——云的安全在哪里？</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>重构图书馆惊魂夜（理解模型，关注设计）</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/28/908657.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Thu, 27 Sep 2007 16:22:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/28/908657.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/908657.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/28/908657.html#Feedback</comments><slash:comments>26</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/908657.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/908657.html</trackback:ping><description><![CDATA[<p>前一篇Post因为绘图的关系导致理解上有所误区，所以重构一下，重新更新了图形，让我们重新来审视一下这个被多次讨论的设计。</p> <p>首先是图书馆的用例：</p> <p>其实用例的情况大家都很清楚了，简而概之就是用户在图书馆的书架上找到自己想要的书，然后向管理员出示借书卡后借到想要的书。</p> <p>用例图。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/WindowsLiveWriter/a34760cd6368_14F72/image16.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="345" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/WindowsLiveWriter/a34760cd6368_14F72/image16_thumb.png" width="486" border="0"></a></p> <p>这是一个很简单的用例，我没有分析完所有的用例以及子用例，这里到此就可以打住了，我们可以在以后的迭代过程当中来继续完善 </p> <p>然后根据需求我们来建立业务规则表：</p> <p>规则一：借书需要出示身份证明以及借书卡&nbsp;&nbsp; （来源：图书馆馆规）</p> <p>规则二：每个用户一张借书卡 （来源：图书馆规定）</p> <p>规则三：每张借书卡可以借N本书 （来源：图书馆规定）</p> <p>然后得到领域模型：</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/WindowsLiveWriter/a34760cd6368_14F72/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="354" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/Alexander-Lee/WindowsLiveWriter/a34760cd6368_14F72/image_thumb.png" width="626" border="0"></a> </p> <p>这个模型也是一个很粗略的模型，不过足够我们开始下面的分析了。这个模型是动态的，在我们分析的过程中还可能发生变化。我们不要害怕变化，优秀的开发过程和设计模型都是应对变化的丰富实践经验的结晶。我们可以通过这个领域模型清楚的看到概念类的属性以及概念类之间的关系。注意，概念类不是我们在编程的过程中所写的类，当然对于很多简单的模型来说，领域里的概念类可以直接变成程序里的类，但是并不表示其之间可以画上等号，我们还需要继续分析系统中对象的行为。我们可以通过时序图和通信图来表示这些行为的过程。</p> <p>我们在之前所界定的系统边界之内分析系统的操作，然后定义系统操作的操作契约。最后我们综合用例分析，领域模型和操作契约的分析，最终得到了系统的设计。</p> <p>这里我们没有看到任何的代码，也不涉及任何贫血充血的争论，我们先建立一个粗略的模型，然后在实现的过程中不断的迭代优化它，最终实现我们的软件，不会出现过度设计，也不会出现一上手就是代码的盲目。</p> <p>由于时间关系，LP吹促觉觉，故下文明日再说。</p><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/908657.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47961/" target="_blank">微软新推社交网站Windows Live Planet</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>图书馆惊魂记之一（一个简单的领域模型的建立过程）</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/26/905973.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Tue, 25 Sep 2007 16:23:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/26/905973.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/905973.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/26/905973.html#Feedback</comments><slash:comments>26</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/905973.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/905973.html</trackback:ping><description><![CDATA[摘要: 领域模型（Domain Model）是一个商业建模范畴的概念，他和软件开发并无一丝一毫的关系，即使一个企业他不开发软件，他也具备他的业务模型，所有的同行业的企业他们的业务模型必定有非常大的共性和内在的规律性，由这个行业内的各个企业的业务模型再向上抽象出来整个行业的业务模型，这个东西即“领域模型”。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Alexander-Lee/archive/2007/09/26/905973.html'>阅读全文</a><img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/905973.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47960/" target="_blank">火狐3.5版被指推出太匆忙：存在50多个漏洞</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>过节了，还在逛园子的同学进来留个言吧</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/25/905796.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Tue, 25 Sep 2007 12:15:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/25/905796.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/905796.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/25/905796.html#Feedback</comments><slash:comments>37</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/905796.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/905796.html</trackback:ping><description><![CDATA[祝大家中秋快乐，望dudu保留一晚上。
 <img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/905796.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47959/" target="_blank">Google对手机搜索进行优化升级</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>开一个讨论，说说我封装的看法【初学者谨慎观看，未成年人请在家长监督下观看：）】</title><link>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/23/902943.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Sat, 22 Sep 2007 17:41:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/23/902943.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/902943.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/23/902943.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/902943.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/902943.html</trackback:ping><description><![CDATA[上一篇Post效果不是很好，既然大家喜欢讨论，我就还是用讨论的形式来进行。<br />
这次还是接着上一次的话题，封装，可能是因为没有表述清楚，所以导致了很多Tx有所疑问，所以这里更加详细的阐述我对于封装的看法。<br />
===============================申明================================<br />
本文讨论环境在纯面向对象语言环境下（静态类型语言，比如C#，JAVA），C++使用<br />
者请注意某些和C++的不同之处。如果不加注释，本文的讨论不涉及ORM以及持久化等技术<br />
==================================================================<br />
<br />
首先什么是封装就不用多说了，上次说到，类是用来描述是什么，属性表示有什么，而行为表示能够执行什么动作的时候没有进一步对如何封装这些概念来做进一步的阐述。<br />
<br />
对属性的封装：<br />
属性表示对象的状态，而状态在程序里是使用数据来表示的，所以类中使用变量的来存储。所以一个类的内部成员变量是用来存储对象的状态的。<br />
为了封装状态，我们需要将变量的访问性设置为private。<br />
但是很多时候对象的某些状态是需要外界可见的（外部可见的状态，很容易理解，如果对象的状态都不清楚，那不是两眼一抹黑闷头操作），打个比方，汽车对象，起码来说，当前跑的速度，车身颜色，车牌号码都应该是外部能够了解的状态。那么，在java中，只有用方法来暴露了。到了后来就成了GetXXX,SetXXX方法，也就是POJO对属性的表示了。而在C#中专门提供了属性结构，其实在编译后还是两个方法。<br />
<br />
属性不管在Java还是在C#中都是对状态的封装的一种形式。既满足了封装，也满足了对对象内部需要暴露状态访问的要求。<br />
属性虽然说本质上就是两个方法（可以只有一个），但是属性的行为是有限制的（个人认为，当然你非要什么都写进去我也没法）。<br />
其一，属性内的过程只操作属性所对应的内部状态的变量<br />
其二，属性如果不需要接受外部的数据最好不要写set<br />
属性内的过程是用来约束读取和写入状态数据的判断逻辑，所以应该是判断的代码而不是行为的代码。不要当成了普通的方法来写。<br />
<br />
对行为的封装：<br />
对象的行为，在面向对象的语言里使用方法来封装行为。我们Call一个方法，也就是通知了一个对象执行某种操作。这种操作由于是对象的方法在执行，所以对内部的状态可以全权操作。但是如果一个对象的行为设计到涉及到另个对象的状态，比如我们需要打开数据库首先述要判断Connection对象是处于什么的状态。所以如果是在行为里需要依赖另外对象的状态，那么就需要另外一个对象用属性暴露出这个状态出来。<br />
<br />
但是，有一种方式我认为是不恰当的。比如，要保存对象的状态或者要设置对象的状态，都绕过了行为，而直接把属性当作公共出入口。从属性里读出来存入数据库，或者从数据库里读出来再挨个赋值给对象。最后再省略，这个类就连方法都没了。就我的看法，没有行为能力的人是死人（起码也是个植物人，高位截瘫什么的），没有行为能力的类，是死类：）。【个人觉得对一个对象的公有属性赋值，然后调用依赖于这些状态数据的方法是可以说得过去的，就和装好子弹扣扳机的过程一样，给这些属性赋值就是装子弹，执行方法就是扣扳机】<br />
<br />
最后一个对象是不会有耦合的。对象多了，对象直接必要要打交道。在满足封装性的条件下，对象之间打交道主要通过两个接口，一个是属性，一个就是方法（属性方法都是外部对类状态改变的接口），当然在C#里还可以通过事件，不过事件在本质上还是对方法的调用。<br />
<br />
最后我们必须来说说耦合的问题
<p>耦合度是用来度量代码块之间联系的程度的标准<br />
耦合度是从模块外部考察模块的独立性程度。它用来衡量多个模块间的相互联系。一般来说，耦合度应从以下三方面来考虑，即：<br />
耦合内容的数量，即模块间发生联系的数据和代码的多少，同这些数据和代码发生联系的模块的多少，多的耦合强，少的耦合弱；<br />
模块间的耦合类型。耦合类型有以下几种方式：<br />
①独立耦合<br />
②数据耦合<br />
③控制耦合<br />
④公共耦合<br />
⑤内容耦合<br />
下面重点对各种类型的耦合作进一步的说明。<br />
（1）独立耦合<br />
两个模块完全没联系<br />
（2）数据耦合<br />
指两个模块彼此交换数据。如一个模块的输出数据是另一个模块的输入数据，或一个模块带参数调用另一个模块，下层模块又返回参数。应该说，在一个软件系统中，此种耦合是不可避免的，且有其积极意义。因为任何功能的实现都离不开数据的产生、表示和传递。数据耦合的联系程度也较低。譬如调用方法<br />
（3）控制耦合<br />
若在调用过程中，两个模块间传递的不是数据参数而是控制参数，则模块间的关系即为控制耦合。控制耦合属于中等程度的耦合，较之数据耦合模块间的联系更为紧密。但控制耦合不是一种必须存在的耦合。当被调用模块接收到控制信息作为输入参数时，说明该模块内部存在多个并列的逻辑路径，即有多个功能。<br />
举个例子<br />
public void Action(bool param)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(param)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//do something<br />
&nbsp;&nbsp;&nbsp;&nbsp;}else<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//do something<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
这个方法就存在控制耦合。<br />
控制变量用以从多个功能中选择所要执行的部分，因而控制耦合是完全可以避免的。排除控制耦合可按如下步骤进行：<br />
①找出模块调用时所用的一个或多个控制变量；<br />
②在被调模块中根据控制变量找出所有的流程；<br />
③将每一个流程分解为一个独立的模块；<br />
④将原被调模块中的流程选择部分移到上层模块，变为调用判断。<br />
通过以上变换，可以将控制耦合变为数据耦合。由于控制耦合增加了设计和理解的复杂程度，因此在模块设计时要尽量避免使用。当然，如果模块内每一个控制流程规模相对较小，彼此共性较多，使用控制耦合还是合算的。<br />
（4）公共耦合<br />
公共耦合又称公共环境耦合或数据区耦合。若多个模块对同一个数据区进行存取操作，它们之间的关系称为公共耦合。公共数据区可以是全程变量、共享的数据区、内存的公共复盖区、外存上的文件、物理设备等。当两个模块共享的数据很多，通过参数传递可能不方便时，可以使用公共耦合。公共耦合共享数据区的模块越多，数据区的规模越大，则耦合程度越强。公共耦合最弱的一种形式是：两个模块共享一个数据变量，一个模块只向里写数据，另一个模块只从里读数据。<br />
当公共耦合程度很强时，会造成关系错综复杂，难以控制，错误传递机会增加，系统可靠性降低，可理解、维护性差。<br />
（5）内容耦合<br />
内容耦合是耦合程序最高的一种形式。若一个模块直接访问另一模块的内部代码或数据，即出现内容耦合。内容耦合的存在严重破坏了模块的独立性和系统的结构化，代码互相纠缠，运行错综复杂，程序的静态结构和动态结构很不一致，其恶劣结果往往不可预测。<br />
内容耦合往往表现为以下几种形式：<br />
①一个模块访问另一模块的内部代码或数据；<br />
②一个模块不通过正常入口而转到另一个模块的内部（如使用GOTO语句或JMP指令直接进入另一模块内部，C#和JAVA里基本上不会出现，C++情况不明，望C++达人提供有效情报）；<br />
③两个模块有一部分代码重迭（可能出现在汇编程序中，在一些非结构化的高级语言，如COBOL中也可能出现）；<br />
④一个模块有多个入口（这意味着一个模块有多种功能）。<br />
这里除了2，3两种情况，1和4都可能在面向对象的语言的代码里出现。<br />
第一种情况主要是本来该类内部行为共享的公共方法被错误的设置为public并且被外部的对象使用了。或者是直接将一个对象的属性读取出来，运算的结果又重新写回了对象的另一个属性。还可能有其它情况，不过限于个人能力，暂不知晓，有知道的请告知。<br />
就我个人来说，假如A类的对象有个Count属性，那么在累加的时候使用a.Count++我觉得还OK啦，还没有洁癖到非要去弄一个Upgrade的方法上去，当然如果这个Upgrade的动作还涉及到其他的状态，那就还是多个方法出来好了。<br />
一般讲，在模块划分时，应当尽量使用数据耦合。少用控制耦合（尽量转成数据耦合），限制公共耦合的范围，完全不用内容耦合。<br />
</p>
<p>所以说封装并不是表明就不耦合了，但是封装可以降低耦合度。对于耦合度来说我们是应该尽量降低的（在时间金钱允许的情况下），低耦合代表着在应对变化时我们能够更加从容应对。<br />
&nbsp;</p>
 <img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/902943.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47958/" target="_blank">风声又起 Windows 7 RTM版7月13日完成</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>又见手把手系列-面向对象扫盲-通俗的OO第一弹-【封装】 </title><link>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/21/901519.html</link><dc:creator>亚历山大同志</dc:creator><author>亚历山大同志</author><pubDate>Fri, 21 Sep 2007 08:19:00 GMT</pubDate><guid>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/21/901519.html</guid><wfw:comment>http://www.cnblogs.com/Alexander-Lee/comments/901519.html</wfw:comment><comments>http://www.cnblogs.com/Alexander-Lee/archive/2007/09/21/901519.html#Feedback</comments><slash:comments>57</slash:comments><wfw:commentRss>http://www.cnblogs.com/Alexander-Lee/comments/commentRss/901519.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Alexander-Lee/services/trackbacks/901519.html</trackback:ping><description><![CDATA[<p>最近针对OO有了太多的讨论，太多的误会，太多的不理解。让我来一次性解决什么是对象，为什么要面向对象的问题吧，这是第一篇。</p>
<p>所谓面向对象的编程、设计、思想。我们用大白话来说。</p>
<p>面向对象就是用 某物（对象），是什么（类），有什么（对象的状态），能干什么（方法）的方式来描述程序的方法。这就是面向对象。</p>
<p>面向对象的程序的特征，封装性：也就是某物状态的改变，必须是他自己的行为来改变。</p>
<p>打个比方，我（人类），有钱（有什么），你（人类），要找我借钱（能干什么）。于是</p>
<p>class Man()<br />
{<br />
&nbsp;&nbsp;&nbsp; private int money;<br />
&nbsp;&nbsp;&nbsp; public int Money<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get{return money}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set{money=value}<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void Borrow(Man Target,int Howmuch)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; money+=Howmuch;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Target.Money-=Howmuch;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
就是这个样子。这样子的写法是不对的，这样破坏类的封装性，我们绕过了Man的对象，直接去操作了对象的状态。这完全是强盗逻辑，跟你直接到我钱包里掏钱一样不可饶恕。所以，借钱这个动作还需要我来参与，你找我借钱，而我，要借给你钱。我们修改一下类的代码。我们给Man类增加一个Lend的方法，以封装在借出钱的时候对自身状态的改变。然后借钱的行为也要更改了。<br />
class Man()<br />
{<br />
&nbsp;&nbsp;&nbsp; private int money;<br />
&nbsp;&nbsp;&nbsp; public int Money<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get{return money}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set{money=value}<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public bool Lend(int Howmuch)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(Howmuch&lt;money)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; money-=Howmuch;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void Borrow(Man Target,int Howmuch)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; money+=Howmuch;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Target.Lend(Howmuch);<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
这样子的代码就是满足了封装性的原则，注意，封装既是特征，也是必须满足的条件，如果破坏了封装性原则那就是破坏了OO的原则。</p>
<p>这里回到了一个很实际的问题，失血模型为什么不OO。<br />
我们定义了Book类，封装了Book的状态（属性）。如果我们用一个BookManager类去Save这本书（典型的失学模式的做法）。那么，我们在BookManager中如何保存？很多人在BookManager.Save里读取Book的属性，生成SQL，写数据库，返回执行结果。这样子OO么？不OO，因为这种做法完全破坏了封装性的原则。就跟之前借钱的例子一样。所以我们要在Book类增加一个Save方法，这个方法是用来维护Book类本身的状态的。而很多的ORM也能够给我们的类注入这类方法，使我们的的类具备持久化的能力。这样Book的属性，如何在数据库里存储，如何读取，如何删除都是Book自身来负责，因为在数据库里关于Book 的记录都是属于Book的状态，所以都需要Book自身来封装，使其透明化。</p>
<p><br />
很多人在之前我写的Book.Save是否OO的话题里面说，觉得Book.Save方法仅仅是换了个位置。但是哪里知道，这个小小的改变却是一个原则性的问题。而至于双鱼座觉得在Save里加入上下文的参数更加符合实际情况，我个人觉的加和不加对Book类是否符合OO的原则没有太大的影响。<br />
但是有和没有确是天壤之别了。</p>
<p>封装是保证系统的高内聚低耦合的很重要的设计原则。<br />
还是用Book作为例子，如果你的Book需要添加一个属性来表示新的状态（换句俗话就是你在数据库里加列了，数据库变化了）。如果你的Book类自己维护了自己的持久化状态，那么你就只需要修改Book类的持久化状态的方法。如果你使用的VS2005的话，使用重构功能一次性就能把所影响到的地方全部修改（java的用Eclipse也有同样的功能）。而如果没有封装的话。那么你可能需要改的还有BookManager，如果在其他地方还用到了Book，可能还有数不清的代码在等着你改。为什么会麻烦，因为没有了封装，类和类之间产生了耦合。</p>
<p>下一章我们会接下来谈继承（也包括接口的Implement）<br />
</p>
<img src ="http://www.cnblogs.com/Alexander-Lee/aggbug/901519.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47957/" target="_blank">乔布斯和埃利森</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item></channel></rss>