﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-牛的技术天地-文章分类-OOA/OOD</title><link>http://www.blogjava.net/sysu-hjianm/category/28372.html</link><description>Welcome to the toppest technology garden, drive yourself crazy &amp; enjoy it.</description><language>zh-cn</language><lastBuildDate>Tue, 25 Dec 2007 22:33:25 GMT</lastBuildDate><pubDate>Tue, 25 Dec 2007 22:33:25 GMT</pubDate><ttl>60</ttl><item><title>构件设计原则OCP、LSP、DIP、ISP对高内聚、低耦合设计的作用</title><link>http://www.blogjava.net/sysu-hjianm/articles/170439.html</link><dc:creator>Hu@ng.JM</dc:creator><author>Hu@ng.JM</author><pubDate>Tue, 25 Dec 2007 20:11:00 GMT</pubDate><guid>http://www.blogjava.net/sysu-hjianm/articles/170439.html</guid><wfw:comment>http://www.blogjava.net/sysu-hjianm/comments/170439.html</wfw:comment><comments>http://www.blogjava.net/sysu-hjianm/articles/170439.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sysu-hjianm/comments/commentRss/170439.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sysu-hjianm/services/trackbacks/170439.html</trackback:ping><description><![CDATA[<span style="font-family: Arial;"><span style="font-size: 12pt;">
<span style="font-size: 12pt;"><span style="font-size: 14pt;">
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 内聚性意味着构件只封装相互联系密切并协同完成所需功能的属性和操作。内聚的程度越高，构件的功能越专一，更易于扩展和维护。软件构件作为系统体系结构的组成部分，自身不能独立存在，必须进行内部和外部的通信，构件间的耦合是必然的。但随着系统规模的逐渐增大，通信和协作的数量增长，构件间的相互依赖越来越多，耦合程度增加。高耦合的系统在需求变更的面前是脆弱的，进行修改时由于依赖的存在，往往会牵一发动全身，产生的错误连带向外扩散，导致原本健壮的系统崩溃，而修改的同时又可能带入新的不可预料的错误，使原本已通过测试的构件带有潜在的错误。进行构件设计的重要目标就是要达到高内聚、低耦合。对于用于指导构件设计的四条原则（</span><span lang="EN-US">OCP</span><span style="font-family: 宋体;">，</span><span lang="EN-US">LSP</span><span style="font-family: 宋体;">，</span><span lang="EN-US">DIP</span><span style="font-family: 宋体;">，</span><span lang="EN-US">ISP</span><span style="font-family: 宋体;">），其根本目的在于使得产生的设计在发生变更时能够适应变更并且减少副作用的传播，使系统更具有弹性。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">OCP</span><span style="font-family: 宋体;">原则说明构件应该对扩展开放，对修改封闭。对已通过测试的构件进行修改，不但出错的几率会增加，同时带有破坏内聚性的风险。对于一个功能内聚的构件，每加入一个新的运算就意味着构件的责任增加。对修改封闭，对扩展开放可以使得构件的使用者在保证构件内聚性的前提下通过扩展构件提供的基础功能来进行功能的定制，通过这种方式能够动态地将责任附加到构件上，使得设计具有弹性可以应对改变，具有很高的灵活性。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">LSP</span><span style="font-family: 宋体;">原则告诉我们&#8220;子类可以替换它们的基类&#8221;。</span><span lang="EN-US">LSP</span><span style="font-family: 宋体;">原则有助于降低构件间的印记耦合、例程调用耦合与类型使用耦合。由于子类遵守了基类的约定，在使用基类的地方都可以用子类代替，这种设计为构件注入了动态配置的能力，通过配置不同的子类以实现特定于某一低层实现的功能。在</span><span lang="EN-US">J2EE</span><span style="font-family: 宋体;">体系结构分层模型中，持久层的</span><span lang="EN-US">DAO</span><span style="font-family: 宋体;">模式就体现了</span><span lang="EN-US">LSP</span><span style="font-family: 宋体;">原则。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">DIP</span><span style="font-family: 宋体;">原则指导设计应该&#8220;依赖于抽象，而非具体实现&#8221;。上层构件直接依赖于下层构件，导致上层构件与下层构件紧密耦合，依赖的具体构件越多，其扩展和维护就越困难。在上下层构件之间提供一层抽象，上层构件只依赖于抽象，下层构件也只依赖于该抽象，能有效地为上下层构件解耦，可以比较容易地对设计进行扩展而不会导致大的混乱。</span><span lang="EN-US">DIP</span><span style="font-family: 宋体;">原则突出强调了下层构件依赖上层抽象的倒置的依赖关系。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">ISP</span><span style="font-family: 宋体;">原则强调接口的专用性而不是通用性。接口的专用，意味着接口只专注于自身的功能集合，不会引入功能需求之外的操作。</span><span lang="EN-US">ISP</span><span style="font-family: 宋体;">原则正式地约束了接口的操作，因此遵循了</span><span lang="EN-US">ISP</span><span style="font-family: 宋体;">原则的构件很容易达到最高级别的功能内聚。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><br />
</p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;"><span style="color: red;">*未经作者同意不得转载，转载请标明出处</span><br />
</span></p>
</span></span></span></span>
<img src ="http://www.blogjava.net/sysu-hjianm/aggbug/170439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sysu-hjianm/" target="_blank">Hu@ng.JM</a> 2007-12-26 04:11 <a href="http://www.blogjava.net/sysu-hjianm/articles/170439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>