<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>纵坐标的幻 - Hifar's Blog - 软件设计</title>
    <link>http://www.hifar.com/blog/</link>
    <description>THINKING, CREATING</description>
    <language>en-us</language>
    <copyright>Hifar</copyright>
    <lastBuildDate>Tue, 11 Dec 2007 08:58:21 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 0.0.0.0</generator>
    <managingEditor>hifar@gynow.com</managingEditor>
    <webMaster>hifar@gynow.com</webMaster>
    <item>
      <trackback:ping>http://www.hifar.com/blog/Trackback.aspx?guid=0f8d1714-52c1-4dd2-8c2d-4837df0b064f</trackback:ping>
      <pingback:server>http://www.hifar.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hifar.com/blog/PermaLink,guid,0f8d1714-52c1-4dd2-8c2d-4837df0b064f.aspx</pingback:target>
      <dc:creator>Jimmy Gao</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
随着VS 2008 发布 和 ASP.net Extension 3.5 的即将发布。
</p>
        <p>
ASP.NET 也有了自己的MVC 框架 见scottgu的blog： <a href="http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx">http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx</a></p>
        <p>
总结一下MVC的优缺点：
</p>
        <p>
优点： 
</p>
        <p>
1）视图控制模型分离， 提高代码重用性。
</p>
        <p>
2）提高开发效率。
</p>
        <p>
3）便于后期维护， 降低维护成本。
</p>
        <p>
4）方便多开发人员间的分工。
</p>
        <p>
缺点：
</p>
        <p>
1）清晰的构架以代码的复杂性为代价， 对小项目优可能反而降低开发效率。
</p>
        <p>
2）运行效率相对较低
</p>
        <p>
3）目前没有比较好的rich 客户端的解决方案
</p>
        <p>
4) 控制层和表现层有时会过于紧密，导致没有真正分离和重用
</p>
        <img width="0" height="0" src="http://www.hifar.com/blog/aggbug.ashx?id=0f8d1714-52c1-4dd2-8c2d-4837df0b064f" />
      </body>
      <title>MVC  (model-view-controller) 构架的优缺点</title>
      <guid isPermaLink="false">http://www.hifar.com/blog/PermaLink,guid,0f8d1714-52c1-4dd2-8c2d-4837df0b064f.aspx</guid>
      <link>http://www.hifar.com/blog/2007/12/11/MVCModelviewcontroller%e6%9e%84%e6%9e%b6%e7%9a%84%e4%bc%98%e7%bc%ba%e7%82%b9.aspx</link>
      <pubDate>Tue, 11 Dec 2007 08:58:21 GMT</pubDate>
      <description>&lt;p&gt;
随着VS 2008&amp;nbsp;发布 和 ASP.net Extension 3.5 的即将发布。
&lt;/p&gt;
&lt;p&gt;
ASP.NET 也有了自己的MVC 框架 见scottgu的blog：&amp;nbsp;&lt;a href="http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx"&gt;http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
总结一下MVC的优缺点：
&lt;/p&gt;
&lt;p&gt;
优点： 
&lt;/p&gt;
&lt;p&gt;
1）视图控制模型分离， 提高代码重用性。
&lt;/p&gt;
&lt;p&gt;
2）提高开发效率。
&lt;/p&gt;
&lt;p&gt;
3）便于后期维护， 降低维护成本。
&lt;/p&gt;
&lt;p&gt;
4）方便多开发人员间的分工。
&lt;/p&gt;
&lt;p&gt;
缺点：
&lt;/p&gt;
&lt;p&gt;
1）清晰的构架以代码的复杂性为代价， 对小项目优可能反而降低开发效率。
&lt;/p&gt;
&lt;p&gt;
2）运行效率相对较低
&lt;/p&gt;
&lt;p&gt;
3）目前没有比较好的rich 客户端的解决方案
&lt;/p&gt;
&lt;p&gt;
4) 控制层和表现层有时会过于紧密，导致没有真正分离和重用
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.hifar.com/blog/aggbug.ashx?id=0f8d1714-52c1-4dd2-8c2d-4837df0b064f" /&gt;</description>
      <category>.NET 技术</category>
      <category>软件设计</category>
    </item>
    <item>
      <trackback:ping>http://www.hifar.com/blog/Trackback.aspx?guid=5f5488ac-81e2-479b-8bdd-5327ccc8d304</trackback:ping>
      <pingback:server>http://www.hifar.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hifar.com/blog/PermaLink,guid,5f5488ac-81e2-479b-8bdd-5327ccc8d304.aspx</pingback:target>
      <dc:creator>Jimmy Gao</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h2>面向对象设计原则 
</h2>
        <p>
          <hr id="null" />
        </p>
        <div class="postbody">
          <strong>
            <div>“开－闭”原则（OCP）对可变性封装
</div>
            <div> 
</div>
            <div>The Open--Closed PrincipleClosed Principle<br />
任何系统在其生命周期中都会发生变化。如果我们希望开发出的系统不会在第一版本后就被抛弃，那么我们就必须牢牢记住这一点。<br />
软件组成实体（类，模块，函数，等等）应该是可扩展的，但是不可修改的。
</div>
            <div>OCP  特征
</div>
            <div>可扩展（对扩展是开放的）<br />
模块的行为功能可以被扩展，在应用需求改变或需要满足新的应用需求时，我们可以让模块以不同的方式工作<br />
不可更改（对更改是封闭的）<br />
这些模块的源代码是不可改动的。任何人都不许修改模块的源代码。
</div>
            <div>关键是抽象！<br />
模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体，因此它可以是不允许修改（closed for modification）的；同时，通过从这个抽象体派生，也可扩展此模块的行为功能。
</div>
            <div>符合OCP原则的程序只通过增加代码来变化而不是通过更改现有代码来变化，因此这样的程序就不会引起象非开放―封闭（open-closed）的程序那样的连锁反应的变化。
</div>
            <div>
              <br />
对可变性的封装 
</div>
            <div>考虑系统中什么可能会发生变化，一种可变性不应当散落在代码的很多角落里，而应当被封装到一个对象里。
</div>
            <div>正确理解继承<br />
一种可变性不应当与另一个可变性混合在一起
</div>
            <div>选择性的封闭（Strategic Closure）没有任何一个大的程序能够做到100%的封闭。一般来讲，无论模块是多么的“封闭”，都会存在一些无法对之封闭的变化。既然不可能完全封闭，因此就必须选择性地对待这个问题。也就是说，设计者必须对于他（她）设计的模块应该对何种变化封闭做出选择。
</div>
            <div>
              <hr id="null" />
              <br />
里氏替换原则（LSP）如何进行继承
</div>
            <div>
              <br />
Liskov替换原则替换原则<br />
LSP<br />
LSP The The Liskov Substitution Principle<br />
OCP原则背后的主要机制是抽象和多态。支持抽象和多态的关键机制是继承。
</div>
            <div>LSP LSP的定义 的定义<br />
若对于每一个类型S的对象o1，都存在一个类型T的对象o2，使得在所有针对T编写的程序P中，用o1替换o2后，程序P的行为功能不变，则S是T的子类型。<br />
LSP原则清楚地指出，OOD中Is-A关系是就行为功能而言。行为功能（behavior）不是内在的、私有的，而是外在、公开的，是客户程序所依赖的。行为功能（behavior）才是软件所关注的问题！所有派生类的行为功能必须和客户程序对其基类所期望的保持一致。
</div>
            <div>LSP 和DBC<br />
DBC（Design by Contract）定义把类和其客户之间的关系看作是一个正式的协议，明确各方的权利和义务。DBC对类的要求类的方法声明为先决条件（precondition）和后续条件（postcondition）。为了让方法得以执行，先决条件必须为真。完成后，方法保证后续条件为真。DBC对派生类的要求当重新定义派生类中的例行程序时，我们只能用更弱的先决条件和更强的后续条件替换之。
</div>
            <div>LSP－结论<br />
LSP原则是符合OCP原则应用程序的一项重要特性。仅当派生类能完全替换基类时，我们才能放心地重用那些使用基类的函数和修改派生类型。
</div>
            <div>
              <hr id="null" />
            </div>
            <div>依赖倒转原则（DIP）针对接口编程
</div>
            <div>
              <br />
高层模块不应该依赖于低层模块。二者都应该依赖于抽象。
</div>
            <div>抽象不应该依赖于细节。细节应该依赖于抽象。
</div>
            <div>实施重点
</div>
            <div>从问题的具体细节中分离出抽象，以抽象方式对类进行耦合<br />
不足 
<br />
导致生成大量的类<br />
假定所有的具体类都是会变化的，这也不总是正确的
</div>
            <div>DIP与设计模式<br />
DIP以LSP为基础，是实现OCP的主要手段，是设计模式研究和应用的主要指导原则
</div>
            <div>
              <br />
接口隔离原则（ISP）恰当的划分角色和接口<br />
接口的污染（Interface Contamination）一个没有经验的设计师往往想节省接口的数目，将一些功能相近或功能相关的接口合并，并将这看成是代码优化的一部分。
</div>
            <div>定义：从一个客户类的角度来讲：一个类对另外一个类的依赖性应当是建立在最小的接口上的。使用多个专门的接口比使用单一的总接口要好。
</div>
            <div>
              <br />
合成/聚合复用原则（CARP）尽量使用合成/聚合、尽量不使用继承<br />
定义：在一个新的对象里面使用一些已有的对象
</div>
            <div> 
</div>
            <div>
              <hr id="null" />
            </div>
          </strong>
        </div>
        <div class="postbody">千万不要忘啊
</div>
        <img width="0" height="0" src="http://www.hifar.com/blog/aggbug.ashx?id=5f5488ac-81e2-479b-8bdd-5327ccc8d304" />
      </body>
      <title>面向对象设计原则 </title>
      <guid isPermaLink="false">http://www.hifar.com/blog/PermaLink,guid,5f5488ac-81e2-479b-8bdd-5327ccc8d304.aspx</guid>
      <link>http://www.hifar.com/blog/2004/11/25/%e9%9d%a2%e5%90%91%e5%af%b9%e8%b1%a1%e8%ae%be%e8%ae%a1%e5%8e%9f%e5%88%99.aspx</link>
      <pubDate>Thu, 25 Nov 2004 04:20:19 GMT</pubDate>
      <description>&lt;h2&gt;面向对象设计原则 
&lt;/h2&gt;
&lt;p&gt;
&lt;hr id=null&gt;
&lt;/p&gt;
&lt;div class=postbody&gt;&lt;strong&gt; 
&lt;div&gt;&amp;#8220;开－闭&amp;#8221;原则（OCP）对可变性封装
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;The Open--Closed PrincipleClosed Principle&lt;br&gt;
任何系统在其生命周期中都会发生变化。如果我们希望开发出的系统不会在第一版本后就被抛弃，那么我们就必须牢牢记住这一点。&lt;br&gt;
软件组成实体（类，模块，函数，等等）应该是可扩展的，但是不可修改的。
&lt;/div&gt;
&lt;div&gt;OCP&amp;nbsp; 特征
&lt;/div&gt;
&lt;div&gt;可扩展（对扩展是开放的）&lt;br&gt;
模块的行为功能可以被扩展，在应用需求改变或需要满足新的应用需求时，我们可以让模块以不同的方式工作&lt;br&gt;
不可更改（对更改是封闭的）&lt;br&gt;
这些模块的源代码是不可改动的。任何人都不许修改模块的源代码。
&lt;/div&gt;
&lt;div&gt;关键是抽象！&lt;br&gt;
模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体，因此它可以是不允许修改（closed for modification）的；同时，通过从这个抽象体派生，也可扩展此模块的行为功能。
&lt;/div&gt;
&lt;div&gt;符合OCP原则的程序只通过增加代码来变化而不是通过更改现有代码来变化，因此这样的程序就不会引起象非开放―封闭（open-closed）的程序那样的连锁反应的变化。
&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;
对可变性的封装 
&lt;/div&gt;
&lt;div&gt;考虑系统中什么可能会发生变化，一种可变性不应当散落在代码的很多角落里，而应当被封装到一个对象里。
&lt;/div&gt;
&lt;div&gt;正确理解继承&lt;br&gt;
一种可变性不应当与另一个可变性混合在一起
&lt;/div&gt;
&lt;div&gt;选择性的封闭（Strategic Closure）没有任何一个大的程序能够做到100%的封闭。一般来讲，无论模块是多么的&amp;#8220;封闭&amp;#8221;，都会存在一些无法对之封闭的变化。既然不可能完全封闭，因此就必须选择性地对待这个问题。也就是说，设计者必须对于他（她）设计的模块应该对何种变化封闭做出选择。
&lt;/div&gt;
&lt;div&gt;
&lt;hr id=null&gt;
&lt;br&gt;
里氏替换原则（LSP）如何进行继承
&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;
Liskov替换原则替换原则&lt;br&gt;
LSP&lt;br&gt;
LSP The The Liskov Substitution Principle&lt;br&gt;
OCP原则背后的主要机制是抽象和多态。支持抽象和多态的关键机制是继承。
&lt;/div&gt;
&lt;div&gt;LSP LSP的定义 的定义&lt;br&gt;
若对于每一个类型S的对象o1，都存在一个类型T的对象o2，使得在所有针对T编写的程序P中，用o1替换o2后，程序P的行为功能不变，则S是T的子类型。&lt;br&gt;
LSP原则清楚地指出，OOD中Is-A关系是就行为功能而言。行为功能（behavior）不是内在的、私有的，而是外在、公开的，是客户程序所依赖的。行为功能（behavior）才是软件所关注的问题！所有派生类的行为功能必须和客户程序对其基类所期望的保持一致。
&lt;/div&gt;
&lt;div&gt;LSP 和DBC&lt;br&gt;
DBC（Design by Contract）定义把类和其客户之间的关系看作是一个正式的协议，明确各方的权利和义务。DBC对类的要求类的方法声明为先决条件（precondition）和后续条件（postcondition）。为了让方法得以执行，先决条件必须为真。完成后，方法保证后续条件为真。DBC对派生类的要求当重新定义派生类中的例行程序时，我们只能用更弱的先决条件和更强的后续条件替换之。
&lt;/div&gt;
&lt;div&gt;LSP－结论&lt;br&gt;
LSP原则是符合OCP原则应用程序的一项重要特性。仅当派生类能完全替换基类时，我们才能放心地重用那些使用基类的函数和修改派生类型。
&lt;/div&gt;
&lt;div&gt;
&lt;hr id=null&gt;
&lt;/div&gt;
&lt;div&gt;依赖倒转原则（DIP）针对接口编程
&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;
高层模块不应该依赖于低层模块。二者都应该依赖于抽象。
&lt;/div&gt;
&lt;div&gt;抽象不应该依赖于细节。细节应该依赖于抽象。
&lt;/div&gt;
&lt;div&gt;实施重点
&lt;/div&gt;
&lt;div&gt;从问题的具体细节中分离出抽象，以抽象方式对类进行耦合&lt;br&gt;
不足 
&lt;br&gt;
导致生成大量的类&lt;br&gt;
假定所有的具体类都是会变化的，这也不总是正确的
&lt;/div&gt;
&lt;div&gt;DIP与设计模式&lt;br&gt;
DIP以LSP为基础，是实现OCP的主要手段，是设计模式研究和应用的主要指导原则
&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;
接口隔离原则（ISP）恰当的划分角色和接口&lt;br&gt;
接口的污染（Interface Contamination）一个没有经验的设计师往往想节省接口的数目，将一些功能相近或功能相关的接口合并，并将这看成是代码优化的一部分。
&lt;/div&gt;
&lt;div&gt;定义：从一个客户类的角度来讲：一个类对另外一个类的依赖性应当是建立在最小的接口上的。使用多个专门的接口比使用单一的总接口要好。
&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;
合成/聚合复用原则（CARP）尽量使用合成/聚合、尽量不使用继承&lt;br&gt;
定义：在一个新的对象里面使用一些已有的对象
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;
&lt;hr id=null&gt;
&lt;/div&gt;
&lt;/strong&gt;
&lt;/div&gt;
&lt;div class=postbody&gt;千万不要忘啊
&lt;/div&gt;
&lt;img width="0" height="0" src="http://www.hifar.com/blog/aggbug.ashx?id=5f5488ac-81e2-479b-8bdd-5327ccc8d304" /&gt;</description>
      <category>软件设计</category>
      <category>文摘和收藏</category>
    </item>
  </channel>
</rss>