<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_深蓝医生</title><subtitle type="text">深蓝的智慧，医生的严谨！</subtitle><id>http://feed.cnblogs.com/blog/u/66597/rss</id><updated>2012-02-27T16:12:21Z</updated><author><name>深蓝医生</name><uri>http://www.cnblogs.com/bluedoctor/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedoctor/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/66597/rss"/><entry><id>http://www.cnblogs.com/bluedoctor/archive/2012/02/27/2369256.html</id><title type="text">使用操作符重载，生成ORM实体类的SQL条件语句</title><summary type="text">SQL的条件语句其实就是一些简单条件的复杂组合，因此采用“组合模式”能够很好的处理ORM框架生成复杂的SQL条件查询语句，而操作符重载的应用能够使得这个过程更加优雅！</summary><published>2012-02-26T16:20:00Z</published><updated>2012-02-26T16:20:00Z</updated><author><name>深蓝医生</name><uri>http://www.cnblogs.com/bluedoctor/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedoctor/archive/2012/02/27/2369256.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedoctor/archive/2012/02/27/2369256.html"/><content type="html">&lt;p&gt;ORM框架的一个不可或缺的功能就是根据实体类，生成操作数据库的SQL语句，这其中，最难处理的就是那些复杂的SQL条件比较语句。比如，有下面这样一个SQL语句：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;,&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;BankCode&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;,&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;CityCode&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;,&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;FundCode&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;,&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;FundName&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;,&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;FundReviews&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;,&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;EndDagte&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;,&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;addDate&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;FundReviews&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&amp;nbsp;&amp;nbsp;(&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;CityCode&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #008000"&gt;@CP1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #808080"&gt;OR&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;BankCode&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #008000"&gt;@CP2&lt;/span&gt;)&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #808080"&gt;AND&lt;/span&gt;&amp;nbsp;&amp;nbsp;(&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;FundCode&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #008000"&gt;@CP3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #808080"&gt;OR&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;BankCode&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #008000"&gt;@CP4&lt;/span&gt;)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这个复杂的查询条件由两个OR子条件最后组合成一个AND 条件的，因此它有3组条件：&lt;/p&gt;&lt;p&gt;1：&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;CityCode&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #008000"&gt;@CP1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #808080"&gt;OR&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;BankCode&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #008000"&gt;@CP2;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;2：&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;FundCode&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #008000"&gt;@CP3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #808080"&gt;OR&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;BankCode&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #008000"&gt;@CP4;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;3：1 AND 2 ;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;而条件1其实就是 Condition1 OR Condition2，这又是一个条件组合。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;我们发现，尽管SQL的条件语句可能很复杂，但这些条件却是由一些子条件组合成的，或者说由一组条件组合成一个新的条件，大家想想，这是不是典型的&amp;#8220;&lt;strong&gt;组合模式&lt;/strong&gt;&amp;#8221;阿？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;在PDF.NET框架的ORM组件中，有一个专门处理条件的对象OQLCompare ，它就是根据&amp;#8220;&lt;strong&gt;组合模式&lt;/strong&gt;&amp;#8221;设计的，我们来看看怎么由它来构造这个查询条件：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;&lt;strong&gt;1，采用AND，OR重载：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;FundReviews&amp;nbsp;p&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;FundReviews();&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;实例化一个实体类&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;OQL&amp;nbsp;q&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;OQL(p);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;实例化一个OQL对象&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;Console.WriteLine(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;OQLCompare&amp;nbsp;复杂比较条件表达式测试---------&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;OQLCompare&amp;nbsp;cmp&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;OQLCompare(p);&lt;br /&gt;OQLCompare&amp;nbsp;cmpResult&amp;nbsp;=&amp;nbsp;(cmp.Comparer(p.CityCode,&amp;nbsp;OQLCompare.CompareType.Equal,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;021&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;cmp.Comparer(p.BankCode,&amp;nbsp;OQLCompare.CompareType.Equal,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;008&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;&amp;nbsp;(cmp.Comparer(p.FundCode,&amp;nbsp;OQLCompare.CompareType.Equal,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;KF008&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;cmp.Comparer(p.BankCode,&amp;nbsp;OQLCompare.CompareType.Equal,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;008&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;q.Select().Where(cmpResult);&lt;br /&gt;&lt;br /&gt;Console.WriteLine(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;SQL=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;q.ToString());&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;在OQL中，采用了类似SQL的语法，也是 &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;Select&lt;/span&gt;(&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;属性列表&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;).&lt;span style="color: #0000ff"&gt;Where&lt;/span&gt;(&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;条件表达式&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;).OrderBy(&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;排序字段&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;).GroupBy(&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;分组字段&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;)&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;其中[条件表达式]就可以使用OQLCompare对象来构造。由于OQLCompare对象Comparer函数返回的仍然是一个OQLCompare对象，所以可以利用这个特点，采用组合模式，构造出非常复杂的SQL条件语句。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;我们看到OQL采用了类似函数式的语法风格，但在[条件表达式]的构造过程中，还是显得很冗长，我们可以继续对OQLCompare对象进行重构：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;设置等于某个实体属性的比较条件&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param&amp;nbsp;name="compare"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;当前实体比较对象&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param&amp;nbsp;name="Value"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;要比较的值&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;构造的实体比较对象&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;OQLCompare&amp;nbsp;&lt;span style="color: #0000ff"&gt;operator&lt;/span&gt;&amp;nbsp;==(OQLCompare&amp;nbsp;compare,&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;Value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;BuildOperator(compare,&amp;nbsp;Value,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;设置不等于某个实体属性的比较条件&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param&amp;nbsp;name="compare"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;当前实体比较对象&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param&amp;nbsp;name="Value"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;要比较的值&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;构造的实体比较对象&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;OQLCompare&amp;nbsp;&lt;span style="color: #0000ff"&gt;operator&lt;/span&gt;&amp;nbsp;!=(OQLCompare&amp;nbsp;compare,&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;Value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;BuildOperator(compare,&amp;nbsp;Value,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;lt;&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;根据实体对象的属性，获取新的条件比较对象&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param&amp;nbsp;name="field"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;OQLCompare&amp;nbsp;Property(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;field)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OQLCompare&amp;nbsp;cmp&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;OQLCompare();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmp.CompareString&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.currPropName&amp;nbsp;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;cmp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;OQLCompare&amp;nbsp;BuildOperator(OQLCompare&amp;nbsp;compare,&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;Value,&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;operatorString)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;paraName&amp;nbsp;=&amp;nbsp;compare.GetNewParameterName();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compare.CompareString&amp;nbsp;+=&amp;nbsp;operatorString&amp;nbsp;+&amp;nbsp;paraName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compare.compareValueList.Add(paraName.Substring(&lt;span style="color: #800080"&gt;1&lt;/span&gt;),&amp;nbsp;Value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;compare;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;我们可以采用类似的方式，继续实现 &amp;gt;=,&amp;gt;,&amp;lt;=,&amp;lt; 等SQL条件比较符号的重载，这里就不一一举例了，我们来看新的使用方式：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2，采用SQL比较符号的重载：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;对象&amp;nbsp;p&amp;nbsp;为实体类&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;OQLCompare&amp;nbsp;cmp2&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;OQLCompare(p);&lt;br /&gt;OQLCompare&amp;nbsp;cmpResult2&amp;nbsp;=&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&amp;nbsp;cmp2.Property(p.CityCode)&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;021&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;&amp;nbsp;|&amp;nbsp;cmp2.Property(p.BankCode)&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;008&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&amp;nbsp;cmp2.Property(p.FundCode)&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;KF008&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;|&amp;nbsp;cmp2.Property(p.BankCode)&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;008&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;q.ReSet();&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;重新初始化OQL&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;q.Select().Where(cmpResult2);&lt;br /&gt;&lt;br /&gt;Console.WriteLine(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;操作符重载&amp;nbsp;SQL=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;q.ToString());&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;现在这个SQL条件的构造过程是不是清晰多了？这就是操作符重载的魅力：）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3，使用Equal方法，简化相等比较&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;直接看下面的代码，功能跟上面的例子一样：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;对象&amp;nbsp;p&amp;nbsp;为实体类&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;OQLCompare&amp;nbsp;cmp2&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;OQLCompare(p);&lt;br /&gt;OQLCompare&amp;nbsp;cmpResult2&amp;nbsp;=&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&amp;nbsp;cmp2.Equal(p.CityCode,&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;021&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;cmp2.Equal(p.BankCode,&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;008&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&amp;nbsp;cmp2.Equal(p.FundCode,&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;KF008&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)&amp;nbsp;&amp;nbsp;|&amp;nbsp;cmp2.Equal(p.BankCode,&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;008&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&lt;br /&gt;q.ReSet();&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;重新初始化OQL&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;q.Select().Where(cmpResult2);&lt;br /&gt;&lt;br /&gt;Console.WriteLine(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;操作符重载&amp;nbsp;SQL=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;q.ToString());&lt;/div&gt;&lt;/div&gt;&lt;p&gt;从性能上来说，这种方式效率稍高，因为它是函数式的处理方式，更直接。&lt;/p&gt;&lt;p&gt;-------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;注:本文介绍的这个OQL特性仅在PDF.NET Ver 4.3版本受支持，但之前的版本参照本文说的方法加以改进，也可以使用。有关PDF.NET的版本信息，请看官网介绍：&lt;br /&gt;&lt;a href="http://www.pwmis.com/sqlmap"&gt;http://www.pwmis.com/sqlmap&lt;/a&gt;&lt;br /&gt;有关PDF.NET的开源信息，请参看我的博客文章：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;&lt;a id="PostsList1_rpPosts_TitleUrl_1" href="http://www.cnblogs.com/bluedoctor/archive/2011/09/29/2195751.html"&gt;&lt;font color="#1a8bc8"&gt;节前送礼：PDF.NET（PWMIS数据开发框架）V3.0版开源&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bluedoctor/aggbug/2369256.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bluedoctor/archive/2012/02/27/2369256.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328054.html</id><title type="text">模块架构不是软件成功的“决定因素”</title><summary type="text">与公司中的非技术人员关于架构的设计、架构演进方面的PK文章。</summary><published>2012-01-20T09:29:00Z</published><updated>2012-01-20T09:29:00Z</updated><author><name>深蓝医生</name><uri>http://www.cnblogs.com/bluedoctor/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328054.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328054.html"/><content type="html">&lt;div&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;【本文是09年的一篇旧文，出于某些原因，对原文内容有删减，在这里整理后重新发表】&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;span .="FONT-FAMILY: 宋体;"&gt;前言&lt;/span&gt; &lt;/div&gt;&lt;p .="TEXT-INDENT: 21.75pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;感谢XXX对我们技术，对我们公司产品提出这些意见，我们公司卖的是软件产品，开发软件是一件技术活，说实话，要把技术上面的东西用非技术的语言来向大家交流，的确不是容易的事情。&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;架构的概念和架构的变迁&lt;/span&gt; &lt;/div&gt;&lt;p .="TEXT-INDENT: 21.75pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p .="TEXT-INDENT: 21.75pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;首先，&amp;#8220;&lt;strong .=""&gt;架构&lt;/strong&gt;&amp;#8221;一词我们技术和大家有不同的理解，从于冬琪提出的&amp;#8220;&lt;strong .=""&gt;平行架构&lt;/strong&gt;&amp;#8221;和&amp;#8220;&lt;strong .=""&gt;树形架构&lt;/strong&gt;&amp;#8221;的字面意思来理解，他（&lt;u&gt;暂且用这个&amp;#8220;他&amp;#8221;而不是&amp;#8220;她&amp;#8221;，现在我们只见其声不见其人，不知者无罪，假设错了还请见谅：）&lt;/u&gt;　）的关注点应该是&amp;#8220;&lt;strong .=""&gt;功能模块的组织结构&lt;/strong&gt;&amp;#8221;，我们先来看看这两种组织结构都有啥特点，为叙述方便，我们用一个公司的组织结构的发展变迁来说明这个问题。&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&lt;em&gt;某公司的组织架构例子&lt;/em&gt;&lt;/span&gt; &lt;/div&gt;&lt;p .=""&gt;&lt;u&gt;&lt;span .="FONT-FAMILY: 宋体; FONT-SIZE: 12pt;"&gt;１，公司成立时期&lt;/span&gt;&lt;/u&gt;&lt;span .="FONT-FAMILY: 宋体; FONT-SIZE: 12pt;"&gt;：&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;甲、乙、丙　三人因为共同的兴趣和合适的时机凑到了一起，他们决定成立一个公司来卖产品。公司成立之初，没有任何自己的产品，只是大家都认为这个行业很有发展潜力，决定代销某公司的产品。这个时候，只要把产品销售出去即可，而公司的组织结构没有任何明确的结构，公司的所有经营事项三个人一起分担来做，包括行政，财务，销售等。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 黑体; FONT-SIZE: 12pt;"&gt;这个时候公司的实际组织结构为&amp;#8213;&amp;#8213;无架构&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;u&gt;&lt;span .="FONT-FAMILY: 宋体; FONT-SIZE: 12pt;"&gt;２，公司初步发展：&lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;在甲、乙、丙　三人共同的努力下，公司打开了市场，销售形势逐步好转，有了一定的原始积累，招聘了几个新人，公司确定了成立行政，财务，销售三个部门，甲负责行政，乙负责财务，丙负责销售，公司的整体运营仍然由三人共同负责。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 黑体; FONT-SIZE: 12pt;"&gt;这个时候公司的实际组织结构为&amp;#8213;&amp;#8213;平行架构&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;u&gt;&lt;span .="FONT-FAMILY: 宋体; FONT-SIZE: 12pt;"&gt;３，公司快速发展：&lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;经过数年的发展，公司逐步打开了国内市场，销售成果突飞猛进，公司取得了快速发展，员工超过了数百人，公司的组织结构分化为：&lt;/span&gt;&lt;/p&gt;&lt;p .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: Wingdings;"&gt;&lt;span .=""&gt;l&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;行政部&amp;#8213;&amp;#8213;行政部，人事部，售后服务部；&lt;/span&gt;&lt;/p&gt;&lt;p .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: Wingdings;"&gt;&lt;span .=""&gt;l&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;财务部&amp;#8213;&amp;#8213;财务部，税务部，合同部，资金部；&lt;/span&gt;&lt;/p&gt;&lt;p .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: Wingdings;"&gt;&lt;span .=""&gt;l&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;销售部&amp;#8213;&amp;#8213;营销部，销售部，仓储部。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;每一个部门设立一个部门经理，甲，乙，丙分任三大部门的副总经理，并且由甲兼任公司总经理。普通员工向部门经经理负责，部门经理向直属副总经理负责，副总经理向总经理负责。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 黑体; FONT-SIZE: 12pt;"&gt;这个时候公司的实际组织结构为&amp;#8213;&amp;#8213;树形架构&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;u&gt;&lt;span .="FONT-FAMILY: 宋体; FONT-SIZE: 12pt;"&gt;４，公司发展到顶峰&lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;经过１０几年的发展，甲、乙、丙三人员来所在的公司已经发展到同行业第一企业，发展成了一个企业集团，集团下属有　&lt;/span&gt;&lt;/p&gt;&lt;p .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: Wingdings;"&gt;&lt;span .=""&gt;l&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;技术研究院，&lt;/span&gt;&lt;/p&gt;&lt;p .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: Wingdings;"&gt;&lt;span .=""&gt;l&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;产品生产企业，&lt;/span&gt;&lt;/p&gt;&lt;p .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: Wingdings;"&gt;&lt;span .=""&gt;l&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;专业销售公司，&lt;/span&gt;&lt;/p&gt;&lt;p .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: Wingdings;"&gt;&lt;span .=""&gt;l&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;集团物流公司&lt;/span&gt;&lt;/p&gt;&lt;p .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: Wingdings;"&gt;&lt;span .=""&gt;l&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;集团总公司&lt;/span&gt;&lt;/p&gt;&lt;p .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: Wingdings;"&gt;&lt;span .=""&gt;l&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;。。。。。。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;等数个公司和工厂，研究机构，发展成集&amp;#8220;技，工，贸&amp;#8221;一体的大型企业集团，集团各个下属企业独立运作，由集团总部综合管理，统一协调。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 黑体; FONT-SIZE: 12pt;"&gt;这个时候公司的实际组织结构为&amp;#8213;&amp;#8213;平行架构＋树形架构&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;（很多人认为这个时候还是树形结构，但这个时候集团各个企业是独立运作的，管理上是平级的，站在集团的层次看，它们之间是平行架购，而站在各个企业上门看，它们又都是树形架构的）&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .="TEXT-INDENT: 21pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;在现实社会中，很多公司都经历了上面类似的发展历程，从上面叙述的某个公司的发展历程来说，我们看到在公司发展的不同阶段，我们应该采用不同的&amp;#8220;企业架构&amp;#8221;，即可以没有任何架构，也可以有平行架购，再到树形架构，甚至是两种或多种架构并存。&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&lt;em&gt;架构变迁&lt;/em&gt;&lt;/span&gt; &lt;/div&gt;&lt;p .="TEXT-INDENT: 21pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;俗话说，&lt;strong .=""&gt;水无常形，兵无常势&lt;/strong&gt;，任何事物的结构性态都不是固定的，都是根据当时的情况决定的，不能一开始就说它应该是某种形态，不应该是某种形态。事物的发展，社会的变迁，都是遵循一种&amp;#8220;&lt;strong .=""&gt;螺旋式上升&lt;/strong&gt;&amp;#8221;的道理，期间可能有种种曲折和反复，但大势如此，任何人都不能够阻止和改变！&lt;/span&gt;&lt;/p&gt;&lt;p .="TEXT-INDENT: 21pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p .="TEXT-INDENT: 21pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;XX的发展历程张鹏已经叙述的很清楚了，我们选择的&amp;#8220;模块架构&amp;#8221;事实上也遵循了从没有明确的架构，到平行架购，到树形架构的一个变迁（下文我会说ＦＴ其实已经是一个树形的功能模块架构），这中间也充满了曲折和反复，但是要求我们的软件从一开始就符合最理想的&amp;#8220;树形架构&amp;#8221;是不现实的，物越分越细，理越辩越明，如果有人一开始就能这么有先见，我只能说&amp;#8220;神人啊&amp;#8221;！&lt;/span&gt;&lt;/p&gt;&lt;p .="TEXT-INDENT: 21pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;ＦＴ从总体功能模块上面，是一个树形结构（架构），但具体到某一个层次，它又是平行结构（架构）。基金类，理财诊断类，资讯类三大模块之间可以认为是平行结构，但它可能又不完全是，请看下图的 &lt;/p&gt;&lt;p .="MARGIN: 0cm 0cm 0pt"&gt;&lt;span .="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;基金诊断用例：&lt;/span&gt;&lt;/p&gt;&lt;p .="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p .="MARGIN: 0cm 0cm 0pt"&gt;&lt;span .="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;img alt="" src="http://www.hisun139.com/data/attachment/album/201101/14/140210gcquw8uuipwqpepe.gif" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p .="MARGIN: 0cm 0cm 0pt"&gt;&lt;span .="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p .="MARGIN: 0cm 0cm 0pt"&gt;&lt;span .="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p .="MARGIN: 0cm 0cm 0pt"&gt;&lt;span .="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span .="FONT-FAMILY: 宋体; mso-ascii-font-family: Cambria; mso-hansi-font-family: Cambria"&gt;&lt;em&gt;数据架构&lt;/em&gt;&lt;/span&gt; &lt;/p&gt;&lt;p .="MARGIN: 0cm 0cm 0pt"&gt;&lt;span .="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;功能的实现是基于一套完善的数据的，同样这些数据的组织也是有结构的，如果大家非要问数据的组织是啥架构，那么我只能说它既不是平行架购，也不是树形架构，&lt;/span&gt;&lt;/p&gt;&lt;p .="MARGIN: 0cm 0cm 0pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;这只是一个概念模型，实际上，每一部分的数据处理都是很复杂的，就拿基金基础数据集来说，它本身的处理就分为了原子层，指标层，展现层。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;strong .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;原子层&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;原始的数据，在&lt;/span&gt;FT/MB&lt;span .="FONT-FAMILY: 宋体;"&gt;项目中使用的基金业务数据来自于&amp;#8220;巨灵数据库&amp;#8221;，我们需要在这样的数据上面进一步处理成我们自己的数据形式。这样原始的数据集合称为&amp;#8220;原子层&amp;#8221;；&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;strong .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;指标层&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;对原子层的数据进行加工后的数据，它是单一的数据指标，存储的是每一个逻辑意义上面的，基本符合第&lt;/span&gt;3&lt;span .="FONT-FAMILY: 宋体;"&gt;范式的数据，数据之间关系明确，没有冗余数据；也可以认为是符合&amp;#8220;数据接口&amp;#8221;的数据，这些&amp;#8220;接口&amp;#8221;便是一个个指标。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;strong .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;展现层&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;为方便客户端以更方便的方式使用数据，降低数据在客户端的处理量，我们可以将常用的数据的不同展现方式进行封装，例如建立一个视图，封装多个数据指标。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;下图是基金基础数据分层关系图&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;img alt="" src="http://www.hisun139.com/data/attachment/album/201101/14/140544piq4niz8363ih6d4.gif" /&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .="MARGIN: 0cm 0cm 0pt"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&lt;em&gt;总结&lt;/em&gt;&lt;/span&gt; &lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;从产品的功能架购，到产品相关的数据架购，再到产品的应用架购，最后到整个公司的技术架购，甚至，还可以延伸到&amp;#8220;企业架构&amp;#8221;，&amp;#8220;架构&amp;#8221;一词在不同的层次，有不同的含义，具体到每一个层次，很难说这个架构应该是&amp;#8220;平行架购&amp;#8221;还是&amp;#8220;树形架构&amp;#8221;。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;架构层次图：&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;/p&gt;&lt;span&gt;&lt;div .="uchome-message-pic"&gt;&lt;img alt="" src="http://www.hisun139.com/data/attachment/album/201101/14/140548u86mzub0mm0s30i0.gif" /&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p .="MARGIN: 0cm 0cm 0pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;正式由于ＦＴ的功能模块繁多，数据量大数据处理复杂，客户环境特殊，而且产品是逐步发展壮大的不是一开始就设计好的，才导致我们的软件显得有些&amp;#8220;臃肿&amp;#8221;，有些&amp;#8220;笨拙&amp;#8221;。当然，到了一定的阶段，我们有必要对&amp;#8220;架构&amp;#8221;进行重新梳理，但这是一个长期的，持续的，绝对不是一蹴而就的过程。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .="MARGIN: 0cm 0cm 0pt"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&lt;em&gt;架构不是&amp;#8220;决定因素&amp;#8221;&lt;/em&gt;&lt;/span&gt; &lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;但是，不管采用何种架构，要想使问题能够迅速高效的解决，这是不现实的，要不怎么会有这么多的企业管理书籍呢？怎么会有这么的软件架构设设计的书籍和讨论呢？真正想解决问题，那我们就不要把问题复杂化，拿我们的&lt;/span&gt;FT&lt;span .="FONT-FAMILY: 宋体;"&gt;软件来说，如果要想让它&amp;#8220;飞起来&amp;#8221;，但又想保持这么多功能，这样的展现形式，是不可能的，也就是说问题的根源&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;strong .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;不在于采用何种架构，而是我们能不能把问题找得简单点！&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;比如功能简单点，界面简单点，操作简单点，自然我们设计的软件也就是简单的，短小精悍的。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;在这里我代表所有的程序员大声宣称：&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;我是一个懒惰的程序员，我不喜欢复杂！&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .="MARGIN: 0cm 0cm 0pt"&gt;&lt;span .="FONT-FAMILY: 宋体; FONT-SIZE: 10.5pt;"&gt;理想归理想，事实归事实，我&amp;#8220;懒惰&amp;#8221;不代表我不想改变，我们一直在试图寻找一个好的解决方案，让我们的&lt;/span&gt;&lt;span .="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 10.5pt;"&gt;FT&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体; FONT-SIZE: 10.5pt;"&gt;，&lt;/span&gt;&lt;span .="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 10.5pt;"&gt;MB&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体; FONT-SIZE: 10.5pt;"&gt;飞起来，就像张鹏说的，&lt;/span&gt;&lt;span .="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 10.5pt;"&gt;FT&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体; FONT-SIZE: 10.5pt;"&gt;，&lt;/span&gt;&lt;span .="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 10.5pt;"&gt;MB&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体; FONT-SIZE: 10.5pt;"&gt;对我们来说，它们就是我们的孩子，我们一直都在试图努力让它们成长的更好！而根据前面的分析，现有的架构是由软件产品本身的复杂性和软件开发的过程特点决定的，&lt;strong .=""&gt;&amp;#8220;架构&amp;#8221;只是其中的一个问题，不是决定性的问题。&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&lt;p .="TEXT-INDENT: 21pt;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bluedoctor/aggbug/2328054.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328054.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328043.html</id><title type="text">书读百篇，其义自现</title><summary type="text">“演绎推理”和“归纳推理”这两种思维方式是大脑重要的“思维模式”（用模式这个词可能更符合软件技术人员的口味），而它就像是金字塔的不同视角.</summary><published>2012-01-20T09:13:00Z</published><updated>2012-01-20T09:13:00Z</updated><author><name>深蓝医生</name><uri>http://www.cnblogs.com/bluedoctor/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328043.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328043.html"/><content type="html">&lt;div&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 最近公司组织读书活动，我读了《走出软件作坊》，《金子塔原理》，《&lt;/span&gt;&lt;span .=""&gt;.NET&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;核心探秘》，《大话设计模式》等和以前自己读过的其他书籍，发现很多书籍不管是技术的还是人文的，书籍的写作方式和书籍表述的内容中隐含的思考方式，都符合《金字塔原理》一书中讲述的观点：&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div .=""&gt;&lt;strong .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;分治&lt;/span&gt;&lt;/strong&gt;&lt;span .=""&gt;&amp;#8212;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;自顶向下，逐步分解，将问题和问题域划分成一个金字塔形式的结构，它的视角是从金字塔的顶端到底端，这是一种&amp;#8220;演绎推理&amp;#8221;的思维方式；&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div .=""&gt;&lt;strong .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;合取&lt;/span&gt;&lt;/strong&gt;&lt;span .=""&gt;&amp;#8212;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;从一般到抽象，从具体到特殊，从实践到理论，从粗到精，这也是一种金字塔形式的结构，只是它的角度是从金字塔的底层到顶端&lt;/span&gt; &lt;span .="FONT-FAMILY: 宋体;"&gt;，这是一种&amp;#8220;归纳推理&amp;#8221;的思维方式。&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#8220;演绎推理&amp;#8221;和&amp;#8220;归纳推理&amp;#8221;这两种思维方式是大脑重要的&amp;#8220;思维模式&amp;#8221;（用模式这个词可能更符合软件技术人员的口味），而它就像是金字塔的不同视角，我们知道，金字塔结构是最稳定的结构，也是最优美的结构，它是对称的，简单的。任何事物都可以用这两种角度来观察，来推导，来思考。&lt;/span&gt;&lt;span .=""&gt;--&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;这就是神奇的&amp;#8220;金字塔原理&amp;#8221;。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 《走出软件作坊》作者通过大量的事情，从多个角度，比如软件开发过程，软件相关人员（开发人员到架构师），软件测试，软件产品研发，产品运营等，归纳总结出了本土软件企业的&amp;#8220;生存之道&amp;#8221;。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 《&lt;/span&gt;&lt;span .=""&gt;.NET&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;核心探秘》从&lt;/span&gt;&lt;span .=""&gt;.NET&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;的核心&lt;/span&gt;&lt;span .=""&gt;MSIL&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;开始，讲述了&lt;/span&gt;&lt;span .=""&gt;CLR&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;的运行机制，&lt;/span&gt;&lt;span .=""&gt;.NET&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;平台语言的规范和原理，&lt;/span&gt;&lt;span .=""&gt;IDE&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;的设计，应用程序的优化等很多核心的底层技术，由浅入深，由点到面，将&lt;/span&gt;&lt;span .=""&gt;.NET&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;演绎成一个宏大的平台。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 《大话设计模式》更是从实际生活总抽取生动的例子，分析总结归纳出各种设计模式的应用，将晦涩的道理讲得浅显易懂。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 可见，&amp;#8220;金字塔原理&amp;#8221;在我们的工作中，生活中是多么的普遍，书是人们的思想表达，经验总结，更是作者思维方式的体现。我们读书不仅需要明白书里面讲了啥，还要明白书中内容的表述方式，内在联系，作者的思考过程，只有这样，我们才能明白读书的真正意义。如果按照这种思路去读书，那么&amp;#8220;书读百篇&amp;#8220;，也就&amp;#8221;其义自现&amp;#8221;了，明白世间万事万物都有很多共通的道理。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (本文写于2009.12.28)&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/bluedoctor/aggbug/2328043.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328043.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328040.html</id><title type="text">卓越软件工程--《微软360度》读后感</title><summary type="text">一篇对技术性质的公司发展战略的探讨性文章，论述了“技工贸”和“贸工技”两种模式的异同点。</summary><published>2012-01-20T09:12:00Z</published><updated>2012-01-20T09:12:00Z</updated><author><name>深蓝医生</name><uri>http://www.cnblogs.com/bluedoctor/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328040.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328040.html"/><content type="html">&lt;p align="center" .=""&gt;&lt;strong .=""&gt;&lt;span .="FONT-FAMILY: 黑体; FONT-SIZE: 26pt;"&gt;卓越软件工程&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="center" .=""&gt;&lt;span .="FONT-SIZE: 26pt;"&gt;--&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体; FONT-SIZE: 26pt;"&gt;《微软&lt;/span&gt;&lt;span .="FONT-SIZE: 26pt;"&gt;360&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体; FONT-SIZE: 26pt;"&gt;度》读后感&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;卓越软件工程&lt;/span&gt; &lt;p .=""&gt;&lt;span .=""&gt;&lt;span .=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;这一段时间，读了《微软&lt;/span&gt;&lt;span .=""&gt;360&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;度&lt;/span&gt;&lt;span .=""&gt;&amp;#8212;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;成功与成长》这本书，感觉微软之所以取得巨大成功，与微软重视人才，重视知识与技能的积累是分不开的。尽管微软在技术方面不是业界最好的，但他们有一套很好的机制，能够包揽最好的技术人才为其所用，并让其发挥最大的价值，这套机制的重要组成部分就是&lt;/span&gt;&lt;span .=""&gt;&amp;#8212;&lt;/span&gt;&lt;strong .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;卓越软件工程！&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&lt;em&gt;卓越软件工程介绍&lt;/em&gt;&lt;/span&gt; &lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;借用微软研究院官方网站对卓越软件工程的叙述如下：&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .=""&gt;&lt;a href="http://www.microsoft.com/china/crd/ee.mspx" target="_blank"&gt;http://www.microsoft.com/china/crd/ee.mspx&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;strong&gt;&lt;span .="FONT-FAMILY: 宋体; BACKGROUND: #d9d9d9;"&gt;卓越软件工程&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;strong&gt;&lt;span .="FONT-FAMILY: 宋体; BACKGROUND: #d9d9d9;"&gt;卓越软件工程部&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体; BACKGROUND: #d9d9d9;"&gt;微软中国研发集团将卓越软件工程部（Engineering Excellence Group）带入了中国。它通过员工培训、整合商业及工作流程、优化产品开发工具等手段，不断完善微软产品的品质，提升软件工程师们的工作效率及其工程实践的能力。&lt;br /&gt;卓越软件工程部的重点突破在于如下方面： &lt;/span&gt;&lt;/p&gt;&lt;ul type="disc"&gt;&lt;li .=""&gt;&lt;strong&gt;&lt;span .="FONT-FAMILY: 宋体; BACKGROUND: #d9d9d9;"&gt;人员：&lt;/span&gt;&lt;/strong&gt;&lt;span .="FONT-FAMILY: 宋体; BACKGROUND: #d9d9d9;"&gt;确保每位员工获得事业成功所需的培训、信息和支持；&lt;/span&gt;&lt;/li&gt;&lt;li .=""&gt;&lt;strong&gt;&lt;span .="FONT-FAMILY: 宋体; BACKGROUND: #d9d9d9;"&gt;流程：&lt;/span&gt;&lt;/strong&gt;&lt;span .="FONT-FAMILY: 宋体; BACKGROUND: #d9d9d9;"&gt;使商业过程更加有效率，通过透明化的最佳实践来促进合作；&lt;/span&gt;&lt;/li&gt;&lt;li .=""&gt;&lt;strong&gt;&lt;span .="FONT-FAMILY: 宋体; BACKGROUND: #d9d9d9;"&gt;工具：&lt;/span&gt;&lt;/strong&gt;&lt;span .="FONT-FAMILY: 宋体; BACKGROUND: #d9d9d9;"&gt;在组织的内部和外部强化、优化和推广最佳产品开发工具。&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体; BACKGROUND: #d9d9d9;"&gt;在中国，卓越软件工程部可以说是专门针对大中华区的需要所设立。今天，中国研发团队工程人员的规模正在以几何级的速度发展与壮大，卓越软件工程部刚可为他们的成长提供必要的支持。&lt;br /&gt;&lt;br /&gt;卓越软件工程部的目标是通过增加本地培训，帮助团队建立和改进工程流程，进一步加强微软在中国的软件研发实力。其培训课程包括： &lt;/span&gt;&lt;/p&gt;&lt;ul type="disc"&gt;&lt;li .=""&gt;&lt;span .="FONT-FAMILY: 宋体; BACKGROUND: #d9d9d9;"&gt;工程入门&lt;/span&gt;&lt;/li&gt;&lt;li .=""&gt;&lt;span .="FONT-FAMILY: 宋体; BACKGROUND: #d9d9d9;"&gt;正在进行的技术能力发展&lt;/span&gt;&lt;/li&gt;&lt;li .=""&gt;&lt;span .="FONT-FAMILY: 宋体; BACKGROUND: #d9d9d9;"&gt;从普通员工到工程经理每阶段的一般性工程技能发展&lt;/span&gt;&lt;/li&gt;&lt;li .=""&gt;&lt;span .="FONT-FAMILY: 宋体; BACKGROUND: #d9d9d9;"&gt;高潜力工程人员的早期发现和发展，以及如何支持研发队伍快速成长&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体; BACKGROUND: #d9d9d9;"&gt;此外，微软的人力、组织能力部门还提供了一般性的员工发展课程，以便与上述工程技能、职业发展课程互为补充。&lt;/span&gt;&lt;/p&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&lt;em&gt;&lt;strong&gt;&amp;#8220;技－工－贸&amp;#8221;模式&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt; &lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;从上面的叙述和《微软&lt;/span&gt;&lt;span .=""&gt;360&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;度&lt;/span&gt;&lt;span .=""&gt;&amp;#8212;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;成功与成长》书中我们都可以得知，卓越软件工程部的工作内容就是：&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;员工培训&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;整合商业及工作流程&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;优化产品开发工具&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;其目标就是&lt;/span&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;完善产品品质&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;提高工程师的工作效率&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;提高工程实践能力&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p .=""&gt;&lt;span .=""&gt;&lt;span .=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;《微软&lt;/span&gt;&lt;span .=""&gt;360&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;度&lt;/span&gt;&lt;span .=""&gt;&amp;#8212;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;成功与成长》说，卓越软件工程部里面都是来自微软全球的顶尖软件和项目工程专家，可以说是微软全球帝国的人才和技术孵化器，是微软技术研究院的重要组成部门。微软研究院是微软的技术研究部门，在微软的产品取得巨大成功背后，都有他们在技术和人才推动方面的突出贡献，而卓越软件工程部更是对这一功能的强化，因此，&amp;#8220;技术驱动力&amp;#8221;对于微软这样的&lt;/span&gt;&lt;span .=""&gt;IT&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;企业的作用至关重要，同样，像&lt;/span&gt;&lt;span .=""&gt;IBM&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;，&lt;/span&gt;&lt;span .=""&gt;Oracle&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;，&lt;/span&gt;&lt;span .=""&gt;SAP&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;这样的国际&lt;/span&gt;&lt;span .=""&gt;IT&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;巨头，都是靠技术起家的，&amp;#8220;技术引领市场，市场推动技术&amp;#8221;，现在，像联想这样的民族&lt;/span&gt;&lt;span .=""&gt;IT&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;大企业，也在逐渐转型，从&amp;#8220;贸工技&amp;#8221;向&amp;#8220;技工贸&amp;#8221;过渡。另外，像国内通讯业界巨头华为，中兴，也都是从技术起家的，他们在国内都设立有技术研究院，甚至像盛大这样的网游巨头，都在上海设立有盛大研究院。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .=""&gt;&lt;span .=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;纵观这些成功的大型技术企业，对技术都是十分重视的，这可能是他们取得成功的基础，而这些大型技术企业都设立有专门的研究机构，为产品开发和市场开拓提供技术支持，可以说技术决定了未来的市场，而产品不过是为了占领这个市场。下图是技术，产品，市场的一个关系图：&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;/p&gt;&lt;span .=""&gt;&lt;p .=""&gt;&lt;span .=""&gt;&lt;img alt="" src="http://www.hisun139.com/data/attachment/album/201101/18/125949rpyddjgo6ryykjgk.gif" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;不难看出，上图中&amp;#8220;技术&lt;/span&gt;&lt;span .=""&gt;-&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;开发&lt;/span&gt;&lt;span .=""&gt;-&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;市场&amp;#8221;相互促进的这个企业运作模式其实就是联想倡导的&amp;#8220;技&lt;/span&gt;&lt;span .=""&gt;-&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;工&lt;/span&gt;&lt;span .=""&gt;-&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;贸&amp;#8221;模式，我们就把这样的模式先暂时命名为&lt;strong .=""&gt;&amp;#8220;技&lt;/strong&gt;&lt;/span&gt;&lt;strong .=""&gt;&lt;span .=""&gt;-&lt;/span&gt;&lt;/strong&gt;&lt;strong .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;工&lt;/span&gt;&lt;/strong&gt;&lt;strong .=""&gt;&lt;span .=""&gt;-&lt;/span&gt;&lt;/strong&gt;&lt;strong .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;贸&amp;#8221;模式&lt;/span&gt;&lt;/strong&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;吧。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&lt;em&gt;&lt;strong&gt;卓越工程部&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt; &lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;借鉴&amp;#8220;卓越软件工程&amp;#8221;的思想，我们可以在软件开发公司中成立一个类似的部门，具体来说，这个部门可以进行下面一些工作：&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div .=""&gt;&lt;span .="FONT-FAMILY: Wingdings;"&gt;&lt;span .=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;培训&lt;/span&gt;&lt;span .=""&gt;--&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;对开发人员进行技能培训&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: Wingdings;"&gt;&lt;span .=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;流程&lt;/span&gt;&lt;span .=""&gt;--&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;对项目开发过程进行梳理和指导&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: Wingdings;"&gt;&lt;span .=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;技术&lt;/span&gt;&lt;span .=""&gt;--&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;研究和推动技术的创新与应用&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: Wingdings;"&gt;&lt;span .=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;工具&lt;/span&gt;&lt;span .=""&gt;--&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;研究提升开发效率的支持工具&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;根据这些工作职能，可以为这个部门配置专职或兼职的&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;培训师&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;架构师&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;开发专家&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div .="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 0pt 21pt;"&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;项目管理专家&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;这个部门的名字我们也暂定为&lt;/span&gt; &lt;span .="FONT-FAMILY: 宋体;"&gt;&amp;#8220;卓越工程部&amp;#8221;吧，下面描述一下该部门与其他部门的关系：&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .=""&gt;&lt;img alt="" src="http://www.hisun139.com/data/attachment/album/201101/18/1259497g5f7p6822e8qbg8.gif" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&amp;#8220;卓越工程部&amp;#8221;为&amp;#8220;项目开发部&amp;#8221;提供项目管理支持，架构设计，核心功能设计，提供先进的开发架构，开发模式、开放技术和开放工具支持，提升&amp;#8220;项目开放部&amp;#8221;成员的开发技能和开发效率。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&amp;#8220;卓越工程部&amp;#8221;的工作跟&amp;#8220;产品运维部&amp;#8221;的工作也紧密相关，项目产品的运行状况通过产品运维部提供的运行分析报告，来验证软件设计的品质，提供改善设计的建议；同时，产品运维部的工作也需要&amp;#8220;卓越工程部&amp;#8221;的协助，解决一些重大难题事件。&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&amp;#8220;卓越工程部&amp;#8221;主导技术，&amp;#8220;项目开发部&amp;#8221;应用技术开发项目产品，&amp;#8220;产品运维部&amp;#8221;收集客户的反馈，保障产品的运行，这样一种协作关系，其实也是&amp;#8220;技&lt;/span&gt;&lt;span .=""&gt;-&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;工&lt;/span&gt;&lt;span .=""&gt;-&lt;/span&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;贸&amp;#8221;模式！&lt;/span&gt;&lt;/p&gt;&lt;p .=""&gt;&amp;nbsp;&lt;/p&gt;&lt;p .=""&gt;&lt;span .="FONT-FAMILY: 宋体;"&gt;&lt;em&gt;注：本文是对原文的修改后发表出来的，原文写于 &lt;span .="FONT-FAMILY: 宋体; FONT-SIZE: 12pt;"&gt;二〇一〇年三月三日星期三&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bluedoctor/aggbug/2328040.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328040.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328038.html</id><title type="text">C#中？与？？的区别</title><summary type="text">起初我也不知道C#中有？？操作符，今天张鹏在查看我的MVC示例程序的时候问了这个问题，检查代码后发现，下面的代码是VS2010在生成MVC应用程序自己添加的： public AccountMembershipService(MembershipProvider provider) { _provider = provider ?? Membership.Provider; }起初我猜想这个？？操作符的意思可能跟下面的语句类似：foreach(...);循环块中没有任何内容，所以猜测？？跟此类似，表示什么都不用处理，也就是说？？前的表达式为真，什么都不用处理，反之才需要处理？？后的内容。张鹏Ba</summary><published>2012-01-20T09:10:00Z</published><updated>2012-01-20T09:10:00Z</updated><author><name>深蓝医生</name><uri>http://www.cnblogs.com/bluedoctor/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328038.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328038.html"/><content type="html">&lt;div&gt;起初我也不知道C#中有？？操作符，今天张鹏在查看我的MVC示例程序的时候问了这个问题，检查代码后发现，下面的代码是VS2010在生成MVC应用程序自己添加的：&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public AccountMembershipService(MembershipProvider provider)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _provider = provider ?? Membership.Provider;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;起初我猜想这个？？操作符的意思可能跟下面的语句类似：&lt;/div&gt;&lt;div&gt;foreach(...);&lt;/div&gt;&lt;div&gt;循环块中没有任何内容，所以猜测？？跟此类似，表示什么都不用处理，也就是说？？前的表达式为真，什么都不用处理，反之才需要处理？？后的内容。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;张鹏Baidu了一下，下面是结果：&lt;/div&gt;&lt;div&gt;单问号---用于给变量设初值的时候,给变量(int类型)赋值为null,而不是0!&lt;/div&gt;&lt;div&gt;双问号---用于判断并赋值,先判断当前变量是否为null,如果是就可以赋一个新值,否则跳过!&lt;/div&gt;&lt;div&gt;使用？？操作符，需要前面的表达式为引用对象，值对象是不允许的。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;看来，.NET中真有很多不知名的却是很好的东西等待我们挖掘！&lt;/div&gt;&lt;img src="http://www.cnblogs.com/bluedoctor/aggbug/2328038.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328038.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328036.html</id><title type="text">浅议“全局变量”、“多线程”和“编译器陷阱”</title><summary type="text">今天偶然看到一段代码，也看到了作者对此的说明，觉得很有意思：public event EventHandler Started;protected virtual void OnStarted(EventArgs e){ EventHandler handler = Started; if (handler != null) { handler(null, e); }} 为什么要申明一个全局的事件变量 Started?一开始我也觉得很多余，后来听作者说这段代码可以用到多线程中，有可能正在判断事件变量Started的时候，它有可能被另外的一个线程给改变了，这里引入一个局部变量 handler,可</summary><published>2012-01-20T09:09:00Z</published><updated>2012-01-20T09:09:00Z</updated><author><name>深蓝医生</name><uri>http://www.cnblogs.com/bluedoctor/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328036.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328036.html"/><content type="html">&lt;div&gt;今天偶然看到一段代码，也看到了作者对此的说明，觉得很有意思：&lt;/div&gt;&lt;div&gt;&lt;font color="#0000f0"&gt;&lt;span .="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; &lt;/span&gt;&lt;span .="COLOR: #0000ff"&gt;event&lt;/span&gt;&lt;/font&gt;&lt;span .="COLOR: #000000"&gt; EventHandler Started;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;font color="#0000f0"&gt;&lt;span .="COLOR: #0000ff"&gt;protected&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; &lt;/span&gt;&lt;span .="COLOR: #0000ff"&gt;virtual&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; &lt;/span&gt;&lt;span .="COLOR: #0000ff"&gt;void&lt;/span&gt;&lt;/font&gt;&lt;span .="COLOR: #000000"&gt; OnStarted(EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EventHandler handler &lt;/span&gt;&lt;span .="COLOR: #000000"&gt;=&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; Started;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span .="COLOR: #0000ff"&gt;if&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; (handler &lt;/span&gt;&lt;span .="COLOR: #000000"&gt;!=&lt;/span&gt;&lt;font color="#0000f0"&gt;&lt;span .="COLOR: #000000"&gt; &lt;/span&gt;&lt;span .="COLOR: #0000ff"&gt;null&lt;/span&gt;&lt;/font&gt;&lt;span .="COLOR: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; handler(&lt;/span&gt;&lt;span .="COLOR: #0000ff"&gt;&lt;font color="#0000f0"&gt;null&lt;/font&gt;&lt;/span&gt;&lt;span .="COLOR: #000000"&gt;, e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt; &lt;p&gt;为什么要申明一个全局的事件变量 Started?一开始我也觉得很多余，后来听作者说这段代码可以用到多线程中，有可能正在判断事件变量Started的时候，它有可能被另外的一个线程给改变了，这里引入一个局部变量 handler,可以保留Started之前的对象引用，确保后面的事件能够得到正确的处理。&lt;/p&gt;&lt;p&gt;那么我们是否可以按照这个风格写下面类似的代码呢？&lt;/p&gt;&lt;p&gt;&lt;font color="#0000f0"&gt;&lt;span .="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; &lt;/span&gt;&lt;span .="COLOR: #0000ff"&gt;object&lt;/span&gt;&lt;/font&gt;&lt;span .="COLOR: #000000"&gt; MyObject;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;font color="#0000f0"&gt;&lt;span .="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span .="COLOR: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; &lt;/span&gt;&lt;span .="COLOR: #0000ff"&gt;void&lt;/span&gt;&lt;/font&gt;&lt;span .="COLOR: #000000"&gt; OnFunction()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span .="COLOR: #0000ff"&gt;&lt;font color="#0000f0"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; obj&lt;/span&gt;&lt;/span&gt;&lt;span .="COLOR: #000000"&gt;=&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; MyObject;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span .="COLOR: #0000ff"&gt;if&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; (obj&lt;/span&gt;&lt;span .="COLOR: #000000"&gt;!=&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; &lt;/span&gt;&lt;span .="COLOR: #0000ff"&gt;&lt;font color="#0000f0"&gt;null&lt;/font&gt;&lt;/span&gt;&lt;span .="COLOR: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt;//在这里对obj进行其它处理&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span .="COLOR: #000000"&gt;&lt;/span&gt;&lt;span .="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;上面这段代码在一般情况下没有问题，在多线程下面也工作良好，但如果你&lt;strong&gt;启用了编译器优化&lt;/strong&gt;，很不幸，这段代码被优化成了下面的样子：&lt;/p&gt;&lt;p&gt;&lt;font color="#0000f0"&gt;&lt;span .="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; &lt;/span&gt;&lt;span .="COLOR: #0000ff"&gt;object&lt;/span&gt;&lt;/font&gt;&lt;span .="COLOR: #000000"&gt; MyObject;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;font color="#0000f0"&gt;&lt;span .="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span .="COLOR: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; &lt;/span&gt;&lt;span .="COLOR: #0000ff"&gt;void&lt;/span&gt;&lt;/font&gt;&lt;span .="COLOR: #000000"&gt; OnFunction()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; &lt;/span&gt;&lt;span .="COLOR: #0000ff"&gt;if&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; (MyObject&lt;/span&gt;&lt;span .="COLOR: #000000"&gt;!=&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; &lt;/span&gt;&lt;span .="COLOR: #0000ff"&gt;&lt;font color="#0000f0"&gt;null&lt;/font&gt;&lt;/span&gt;&lt;span .="COLOR: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt;//在这里对&lt;font color="#000000"&gt;MyObject&lt;/font&gt;进行其它处理&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span .="COLOR: #000000"&gt;&lt;/span&gt;&lt;span .="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;也就是说，MyObject 对象引用的代码被inline（内联）了，取消了局部变量&lt;span .="COLOR: #0000ff"&gt;&lt;font color="#0000f0"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; obj的定义，&lt;/span&gt;减少了对象数量和创建过程，有助于提高效率，如果这段代码被用于多线程中，噩梦很可能就来了，你不知道是谁修改了MyObject的值，这就是&amp;#8220;&lt;strong&gt;编译器陷阱&lt;/strong&gt;&amp;#8221;！&lt;/p&gt;&lt;p&gt;类似的代码，为什么上面EventHandler Started 在多线程下工作的很好，而&lt;span .="COLOR: #0000ff"&gt;object&lt;/span&gt;&lt;span .="COLOR: #000000"&gt; MyObject 却不可以？原来，这其中有玄机，在.NET平台中，它采用了不同的优化策略，参加原博文中的说法：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span .="COLOR: #000000"&gt;&lt;font color="#808080"&gt;如果我说，这样的代码明显是会被编译器优化掉的，因此这样写完全没有意义，怎样呢？毕竟EventHandler作为一个委托，并没有用volatile关键字声明（事实上事件不能声明为volatile，但可以在这里用Thread.VolatileRead(ref object)方法），使用时也没有用Interlocked来访问。我其实真没有想到那么远，不过CLR Via C#上给出了解释（记不得是哪一章了）：JIT的编译器在这里会识别出这个写法并且确保不会把handler变量优化掉。真是万幸，但估计又成为了一个被学院派的诟病的特性。&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span .="COLOR: #000000"&gt;原文地址：&lt;/span&gt;&lt;/p&gt;&lt;span .="COLOR: #000000"&gt;&lt;a id="ctl02_TitleUrl" href="http://www.cnblogs.com/Gildor/archive/2011/01/18/1937886.html"&gt;&lt;font color="#0066ff"&gt;再说说C#定义事件的写法&lt;/font&gt;&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/bluedoctor/aggbug/2328036.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328036.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328034.html</id><title type="text">微软没有公开的游标分页</title><summary type="text">转发的，原文地址在 http://87cool.spaces.live.com/blog/cns!C961D7041DDB28DA!269.entryCREATEprocedurep_qcd_Paginationcursor@sqlnvarchar(4000),--要执行的sql语句@currentpageint=1,--要显示的页码@pagesizeint=10,--每页的大小@pagecountint=0out,--总页数@recordCountint=0out--总记录数assetnocountondeclare@cursorint--cursor是游标的iddeclare@timedi</summary><published>2012-01-20T09:06:00Z</published><updated>2012-01-20T09:06:00Z</updated><author><name>深蓝医生</name><uri>http://www.cnblogs.com/bluedoctor/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328034.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328034.html"/><content type="html">&lt;div&gt;&lt;span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry"&gt;&lt;p&gt;转发的，原文地址在 &lt;a href="http://87cool.spaces.live.com/blog/cns!C961D7041DDB28DA!269.entry" target="_blank"&gt;http://87cool.spaces.live.com/blog/cns!C961D7041DDB28DA!269.entry&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;procedure&lt;/span&gt;&amp;nbsp;p_qcd_Paginationcursor&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008000"&gt;@sql&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;nvarchar&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold"&gt;4000&lt;/span&gt;),&amp;nbsp;&lt;span style="color: #008080"&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt;要执行的sql语句&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;@currentpage&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #008080"&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt;要显示的页码&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;@pagesize&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;10&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #008080"&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt;每页的大小&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;@pagecount&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;0&lt;/span&gt;&amp;nbsp;out,&amp;nbsp;&lt;span style="color: #008080"&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt;总页数&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;@recordCount&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;0&lt;/span&gt;&amp;nbsp;out&lt;span style="color: #008080"&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt;总记录数&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&amp;nbsp;nocount&amp;nbsp;&lt;span style="color: #0000ff"&gt;on&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;declare&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;@cursor&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008080"&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt;cursor&amp;nbsp;是游标的id&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;declare&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;@timediff&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;datetime&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008080"&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt;耗时测试时间差&amp;nbsp;cn-web.com提供&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;@timediff&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;getdate&lt;/span&gt;()&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;exec&lt;/span&gt;&amp;nbsp;sp_cursoropen&amp;nbsp;&lt;span style="color: #008000"&gt;@cursor&lt;/span&gt;&amp;nbsp;output,&lt;span style="color: #008000"&gt;@sql&lt;/span&gt;,&lt;span style="color: #008000"&gt;@scrollopt&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;1&lt;/span&gt;,&lt;span style="color: #008000"&gt;@ccopt&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;1&lt;/span&gt;,&lt;span style="color: #008000"&gt;@rowcount&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #008000"&gt;@pagecount&lt;/span&gt;&amp;nbsp;output&amp;nbsp;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;@recordCount&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #008000"&gt;@pagecount&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;@pagecount&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;ceiling&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold"&gt;1.0&lt;/span&gt;&lt;span style="color: #808080"&gt;*&lt;/span&gt;&lt;span style="color: #008000"&gt;@pagecount&lt;/span&gt;&lt;span style="color: #808080"&gt;/&lt;/span&gt;&lt;span style="color: #008000"&gt;@pagesize&lt;/span&gt;)&amp;nbsp;,&lt;span style="color: #008000"&gt;@currentpage&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;(&lt;span style="color: #008000"&gt;@currentpage&lt;/span&gt;&lt;span style="color: #808080"&gt;-&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;1&lt;/span&gt;)&lt;span style="color: #808080"&gt;*&lt;/span&gt;&lt;span style="color: #008000"&gt;@pagesize&lt;/span&gt;&lt;span style="color: #808080"&gt;+&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;1&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;@pagecount&lt;/span&gt;,&lt;span style="color: #008000"&gt;@currentpage&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;exec&lt;/span&gt;&amp;nbsp;sp_cursorfetch&amp;nbsp;&lt;span style="color: #008000"&gt;@cursor&lt;/span&gt;&amp;nbsp;,&lt;span style="color: #800000; font-weight: bold"&gt;16&lt;/span&gt;,&lt;span style="color: #008000"&gt;@currentpage&lt;/span&gt;,&lt;span style="color: #008000"&gt;@pagesize&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;exec&lt;/span&gt;&amp;nbsp;sp_cursorclose&amp;nbsp;&lt;span style="color: #008000"&gt;@cursor&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff00ff"&gt;datediff&lt;/span&gt;(ms,&lt;span style="color: #008000"&gt;@timediff&lt;/span&gt;,&lt;span style="color: #ff00ff"&gt;getdate&lt;/span&gt;())&amp;nbsp;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&amp;nbsp;耗时&amp;nbsp;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;GO&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;此方案所说是微软没有公开的游标分页，刚开始怀疑游标分页肯定浪费性能，不过经过详细测试后，发现微软就是微软，不管如何测试，不管条件如何复杂，数据量再大，性能一直保持最强劲。&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/bluedoctor/aggbug/2328034.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328034.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328031.html</id><title type="text">为VS2010默认模板添加版权信息</title><summary type="text">通过以下方式可以自定义CS类文件代码模板（以下为VS2010，VS2008类似）：1，打开VS的安装目录，例如 D:\ProgramFiles\MicrosoftVisualStudio10.0\Common7\IDE\ItemTemplates\CSharp\Code\2052 2，打开文件 Class.zip，找到文件 Class.cs，在文件头部加上下面的内容：#region&lt;&lt;版本注释&gt;&gt;/**========================================================================*Copyright(c)</summary><published>2012-01-20T09:04:00Z</published><updated>2012-01-20T09:04:00Z</updated><author><name>深蓝医生</name><uri>http://www.cnblogs.com/bluedoctor/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328031.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328031.html"/><content type="html">&lt;div&gt;&lt;font color="#0000ff"&gt;通过以下方式可以自定义CS类文件代码模板（以下为VS2010，VS2008类似）：&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#0000ff"&gt;1，打开VS的安装目录，例如 D:\Program&amp;nbsp;Files\Microsoft&amp;nbsp;Visual&amp;nbsp;Studio&amp;nbsp;10.0\Common7\IDE\ItemTemplates\CSharp\Code\2052 &lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#0000ff"&gt;2，打开文件 Class.zip，找到文件 Class.cs，在文件头部加上下面的内容：&lt;/font&gt;&lt;/div&gt;&lt;font color="#0000ff"&gt;&lt;div&gt;&lt;font color="#000000"&gt;#region&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;版&amp;nbsp;本&amp;nbsp;注&amp;nbsp;释&amp;nbsp;&amp;gt;&amp;gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;/*&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;&amp;nbsp;*&amp;nbsp;========================================================================&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;&amp;nbsp;*&amp;nbsp;Copyright(c)&amp;nbsp;2008-2011北京高阳金信信息技术有限公司,&amp;nbsp;All&amp;nbsp;Rights&amp;nbsp;Reserved.&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;&amp;nbsp;*&amp;nbsp;========================================================================&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;&amp;nbsp;*&amp;nbsp;【当前类文件的功能】&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;&amp;nbsp;*&amp;nbsp;作者：[中文姓名]&amp;nbsp;&amp;nbsp;&amp;nbsp;时间：$time$&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;&amp;nbsp;*&amp;nbsp;文件名：$safeitemname$&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;&amp;nbsp;*&amp;nbsp;版本：V1.0.0&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;&amp;nbsp;*&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;&amp;nbsp;*&amp;nbsp;修改者：&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;时间：&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;&amp;nbsp;*&amp;nbsp;修改说明：&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;&amp;nbsp;*&amp;nbsp;========================================================================&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;*/&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color="#000000"&gt;#endregion&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;3，保存Class.cs文件并且按照提示保存Class.zip;&lt;/div&gt;&lt;div&gt;4，打开目录 D:\Program&amp;nbsp;Files\Microsoft&amp;nbsp;Visual&amp;nbsp;Studio&amp;nbsp;10.0\Common7\IDE\ItemTemplates\Web\CSharp\2052 &lt;/div&gt;&lt;div&gt;5，类似上面的步骤2，3，修改并保存文件Class.zip&lt;/div&gt;&lt;div&gt;6，在visual studuo 2010 的命运行下运行 devenv /setup （运行该命令前请关闭VS。这个命令比较耗时，大概要几分钟）&lt;/div&gt;&lt;div&gt;7，重新启动VS，添加类文件，即可看到自定义的文件头效果。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;详细过程，请参考下面的文章：&lt;/div&gt;&lt;div&gt;VS2008修改自定义模板(转) &lt;a href="http://apps.hi.baidu.com/share/detail/21498297" target="_blank"&gt;&lt;font color="#0000ff"&gt;http://apps.hi.baidu.com/share/detail/21498297&lt;/font&gt;&lt;/a&gt; &lt;/div&gt;&lt;div&gt;为Visual&amp;nbsp;Studio添加项目模板及项模板 &lt;a href="http://blog.csdn.net/qiaozhiwei/archive/2009/12/15/5014664.aspx" target="_blank"&gt;&lt;font color="#0000ff"&gt;http://blog.csdn.net/qiaozhiwei/archive/2009/12/15/5014664.aspx&lt;/font&gt;&lt;/a&gt; &lt;/div&gt;&lt;div&gt;为VS2008默认模板添加版权信息 &lt;a href="http://blog.csdn.net/zhangqqshuo/archive/2010/07/03/5710755.aspx" target="_blank"&gt;&lt;font color="#0000ff"&gt;http://blog.csdn.net/zhangqqshuo/archive/2010/07/03/5710755.aspx&lt;/font&gt;&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/font&gt;&lt;img src="http://www.cnblogs.com/bluedoctor/aggbug/2328031.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328031.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328029.html</id><title type="text">VS2008连接CodePlex的源代码管理服务</title><summary type="text">为了更有效的分享部门的.NET代码，我们决定把一些通用的组件源代码通过CodePlex来托管。CodePlex是MS提供的一个第三方源代码托管服务和开源项目管理网站，只要注册了CodePlex用户或者有LiveID，即可使用。目前，VS2010能够非常轻松的连接到CodePlex的TFS，但是VS2008却有点问题，需要经过以下步骤来连接：1，先看看有关VS2005、2008连接TFS注意事项的内容：http://codeplex.codeplex.com/wikipage?title=Connect%20to%20TFS%20with%20Team%20Explorer%202008%20o</summary><published>2012-01-20T09:03:00Z</published><updated>2012-01-20T09:03:00Z</updated><author><name>深蓝医生</name><uri>http://www.cnblogs.com/bluedoctor/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328029.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328029.html"/><content type="html">&lt;div&gt;为了更有效的分享部门的.NET代码，我们决定把一些通用的组件源代码通过CodePlex来托管。CodePlex是MS提供的一个第三方源代码托管服务和开源项目管理网站，只要注册了CodePlex用户或者有LiveID，即可使用。&lt;/div&gt;&lt;div&gt;目前，VS2010能够非常轻松的连接到CodePlex的TFS，但是VS2008却有点问题，需要经过以下步骤来连接：&lt;/div&gt;&lt;div&gt;1，先看看有关VS2005、2008连接TFS注意事项的内容：&lt;/div&gt;&lt;div&gt;&lt;a href="http://codeplex.codeplex.com/wikipage?title=Connect%20to%20TFS%20with%20Team%20Explorer%202008%20or%202005" target="_blank"&gt;http://codeplex.codeplex.com/wikipage?title=Connect%20to%20TFS%20with%20Team%20Explorer%202008%20or%202005&lt;/a&gt;&lt;/div&gt;&lt;div&gt;2,下载一个VS2008的TFS补丁（11.2M），下载地址：&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=cf13ea45-d17b-4edc-8e6c-6c5b208ec54d&amp;amp;displaylang=en" target="_blank"&gt;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=cf13ea45-d17b-4edc-8e6c-6c5b208ec54d&amp;amp;displaylang=en&lt;/a&gt;&lt;/div&gt;&lt;div&gt;3，安装补丁，成功以后，重新启动VS2008，添加TFS服务器，如下图：&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=CodePlex&amp;amp;DownloadId=144341"  alt="" /&gt;&lt;/div&gt;&lt;div&gt;注意：如果没有打补丁，输入服务器名字后，下面的端口号和协议还是可以选择的。&lt;/div&gt;&lt;div&gt;TFS服务器的名字可以在你的CodePlex项目页面的Source Codex选项卡下面找到，&lt;/div&gt;&lt;div&gt;&lt;div .="ContentPanelBox SideBarControl"&gt;&lt;div .="Content"&gt;&lt;div .="Header StandardPaddingBottom"&gt;Source Control&lt;/div&gt;&lt;div id="SubversionInfoLink"&gt;&lt;img src="http://i3.codeplex.com/Images/v17672/node-open.png"  .="sourceControlInfoImage"  alt="" /&gt;&lt;a href="http://ft.codeplex.com/SourceControl/list/changesets#"  . click="return showInfo('Subversion')"&gt;Subversion&lt;/a&gt;&lt;/div&gt;&lt;div id="TeamExplorerInfoLink"&gt;&lt;img src="http://i3.codeplex.com/Images/v17672/node-open.png"  .="sourceControlInfoImage"  alt="" /&gt;&lt;a href="http://ft.codeplex.com/SourceControl/list/changesets#"  . click="return showInfo('TeamExplorer')"&gt;Visual Studio Team Explorer&lt;/a&gt;&lt;/div&gt;&lt;div id="TeampriseInfoLink"&gt;&lt;img src="http://i3.codeplex.com/Images/v17672/node-open.png"  .="sourceControlInfoImage"  alt="" /&gt;&lt;a href="http://ft.codeplex.com/SourceControl/list/changesets#"  . click="return showInfo('Teamprise')"&gt;Team Explorer Everywhere&lt;/a&gt;&lt;/div&gt;&lt;div id="ChangeInfoLink" .="PADDING-TOP: 10px"&gt;&lt;img src="http://i3.codeplex.com/Images/v17672/node-open.png"  .="sourceControlInfoImage"  alt="" /&gt;&lt;a href="http://ft.codeplex.com/SourceControl/list/changesets#"  . click="return showInfo('Change')"&gt;Change Source Control Type&lt;/a&gt;&lt;/div&gt;&lt;div .="PADDING-TOP: 10px"&gt;选择Team Explorer Everywhere即可看到。&lt;/div&gt;&lt;div .="PADDING-TOP: 10px"&gt;如FT的项目所在的TFS服务器地址是：&lt;/div&gt;&lt;div .="PADDING-TOP: 10px"&gt;Server URL: &lt;strong&gt;&lt;a href="https://tfs.codeplex.com/tfs/TFS23" target="_blank"&gt;https://tfs.codeplex.com/tfs/TFS23&lt;/a&gt; &lt;/strong&gt;&lt;/div&gt;&lt;div .="PADDING-TOP: 10px"&gt;&lt;strong&gt;4，单击上面对话框的确定按钮，会让你输入用户名和密码。注意在输入用户名的时候，不要输入Domain名称。&lt;/strong&gt;&lt;/div&gt;&lt;div .="PADDING-TOP: 10px"&gt;&lt;strong&gt;5，经过以上步骤，你会发现Codeplex的TFS地址已经添加到源代码管理客户端了。&lt;/strong&gt;&lt;/div&gt;&lt;div .="PADDING-TOP: 10px"&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/div&gt;&lt;div .="PADDING-TOP: 10px"&gt;&lt;strong&gt;VS2008连接CodePlex的问题困扰了半天，VS的补丁必须打，否则怎么都连接不上。&lt;/strong&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/bluedoctor/aggbug/2328029.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328029.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328026.html</id><title type="text">那些满脑子只考虑后台数据库的人他整天研究的就是针对自己查询一些数据的sql语句</title><summary type="text">如果从那些满脑子只考虑后台数据库的人的思路出发，就很难接受这种方式，因为他整天研究的就不是围绕着用户的千变万化的交互操作需求爱好的变化的而是针对自己查询一些数据的sql语句。</summary><published>2012-01-20T09:01:00Z</published><updated>2012-01-20T09:01:00Z</updated><author><name>深蓝医生</name><uri>http://www.cnblogs.com/bluedoctor/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328026.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328026.html"/><content type="html">&lt;div&gt;如果从&lt;strong&gt;&lt;font color="#ff0000"&gt;那些满脑子只考虑后台数据库的人&lt;/font&gt;&lt;/strong&gt;的思路出发，就很难接受这种方式，因为&lt;strong&gt;&lt;font color="#ff0000"&gt;他整天研究的&lt;/font&gt;&lt;/strong&gt;就不是围绕着用户的千变万化的交互操作需求爱好的变化的而&lt;strong&gt;&lt;font color="#ff0000"&gt;是针对自己查询一些数据的sql语句。&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;---这是CSDN大牛Sp123在和大家讨论&amp;#8220;三层的优点和缺点&amp;#8221;的时候的原话，原帖地址：&lt;a href="http://topic.csdn.net/u/20110330/20/d9b25d81-5162-4144-b7bb-3c18d09987bd.html" target="_blank"&gt;&lt;font color="#003399"&gt;http://topic.csdn.net/u/20110330/20/d9b25d81-5162-4144-b7bb-3c18d09987bd.html&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;下面是他的原文，值得我们思考：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;如果你将前台界面设计跟系统业务逻辑设计分离，那么自然也就是三层了（至少是三层了）。因为业务逻辑层自动化地处理前台跟系统数据的关联。这时候，你可以针对同一套业务逻辑api接口而开发出几十种前台应用程序，而它们的后台都是同一个。&amp;#8220;三层&amp;#8221;是指前后台网络架构。&lt;br /&gt;&lt;br /&gt;而MVC是前台界面程序开发时的最古老的一种分层方式，它表示各种图形控件（比如设计GIS中的各种建筑物）并不依赖于的真实数据，通过编写程序去监听控件与内存数据的双向变化来进行控制（同步）。MVC是指客户端界面程序的开发方法，比如当元件的温度的改变的时候那么所绑定到这个温度数值上的所有界面（颜色、刻度、警报声等等）都应该自动变化。&lt;br /&gt;&lt;br /&gt;不论是三层还是MVC（这两个都是30几年以上的老古董了，它们产生了许多具体的模式），最终都是为了让交互设计师快速地拼生产出新软件，90%的时间不是在那里写枯燥的代码来创作，而是使用绘图和行为工具来所见即所地立刻就给用户做出产品修改。如果从那些满脑子只考虑后台数据库的人的思路出发，就很难接受这种方式，因为他整天研究的就不是围绕着用户的千变万化的交互操作需求爱好的变化的而是针对自己查询一些数据的sql语句。&lt;/p&gt;&lt;p&gt;当你自己有了设计的需求，经过两三次产品重构过程的验证，就会找到程序的优势。而不是把所有软件都限制在&amp;#8220;增删改查&amp;#8221;这个设计思路内。&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/bluedoctor/aggbug/2328026.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2328026.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
