面向对象设计原理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

依赖性倒置原则 (DIP)
Depend upon Abstractions. Do not depend upon concretions.依赖抽象,不要依赖具体
依赖性倒置原则 (DIP)
依赖性倒置原则 (DIP)
接口隔离原则 (ISP)
Many client specific interfaces are better than one general purpose interface多个和客
朝稳定的方向依赖Depend in the direction of
stability.
依赖稳定原则(SDP) 依赖稳定原则(SDP)
X是稳定的
依赖稳定原则(SDP) 依赖稳定原则(SDP)
Y是不稳定的
依赖稳定原则(SDP) 依赖稳定原则(SDP)
稳定性量度(Stability Metrics).我们可以用一 稳定性量度( Metrics). ).我们可以用一 种简单的"三件套"量度来计算一个包的稳定性. Ca 传入耦合(Afferent Coupling, incomming dependencies):包外依赖于包中类的类的数量 dependencies):包外依赖于包中类的类的数量 Ce 传出耦合(Efferent Coupling, outgoing dependencies):. dependencies):.被包中类所依赖的包外类的数量 I 不稳定性(Instability):位于[0,1]区间的量度 Instability):位于[0,1]区间的量度

无依赖回路原则 (ADP)
包与包之间的依赖不能形成回路.The
dependencies between packages must not form cycles
无依赖回路原则 (ADP)
无依赖回路原则 (ADP)
无依赖回路原则 (ADP)
无依赖回路原则 (ADP)
依赖稳定原则(SDP) 依赖稳定原则(SDP)
OCPOCP-动态多态性
class Modem { public: virtual void Dial(const string& pno) = 0; virtual void Send(char) = 0; virtual char Recv() = 0; virtual void Hangup() = 0; }; void LogOn(Modem& m,string& pno, string& user, string& pw) { m.Dial(pno); // you get the idea. }
展的时候被打开(暴露模块内部),在修改 的时候是关闭的(模块是黑盒子)
OCPOCP-动态多态性
struct Modem { enum Type {hayes, courrier, ernie) type; }; struct Hayes { Modem::Type type; // Hayes related stuff }; struct Courrier { Modem::Type type; // Courrier related stuff }; struct Ernie { Modem::Type type; // Ernie related stuff };
稳定抽象原则( SAP) 稳定抽象原则(
稳定抽象原则( SAP) 稳定抽象原则(
距离度量(Distance Metrics) 给定A和I值, 距离度量( 我们想知道这个包离主序有多远. D:距离 . 在 [0,0.707]区间取值. D': 规范化距离Normalized Distance. . 这 个量度比D更常用,因为它在[0,1]区间取值. 0表示包直接位于主序上,1表示包离主序最 远.
共同封闭原则 (CCP)
一起变化的类放在一起.Classes that change
together, belong together. 一个大的开发项目通常分割成很多网状互联的包. 管理,测试和发布这些包的工作可不是微不足道的 工作.在任何一个发布的版本中,如果改动的包数 量越多,重建,测试和部署也就会越多.因此我们 应该尽量减少在产品的发布周期中被改动的包的数 量,这就要求我们将一起变化的类放在一起(同一 个包).
共同重用原则 (CRP)
不一起重用的类不应该放在一起.Classes that aren't
reused together should not be grouped together. 对一个包的依赖就是对包里面所有东西的依赖.当一个包改 变时,这个包的所有使用者都必须验证是否还能正常运行, 即使它们所用到的没有任何改变也不行. 如我们就常遇到操作系统需要升级.当开发商发布一个新版 本以后,我们的升级是迟早的问题,因为开发商将会不支持 旧版本,即使我们对新版本没有任何兴趣,我们也得升级. 如果把不一起使用的类放在一起,同样的事情我们也会遇到. 一个和我们无关的类的改变来自百度文库产生包的一个新版本,我们被 强迫升级和验证这个包是否影响正常的运行.
void LogOn(Modem& m,string& pno, string& user, string& pw) { if (m.type == Modem::hayes) DialHayes((Hayes&)m, pno); else if (m.type == Modem::courrier) DialCourrier((Courrier&)m, pno); else if (m.type == Modem::ernie) DialErnie((Ernie&)m, pno) // ...you get the idea }
Ce I= Ca+ Ce
依赖稳定原则:依赖那些I 依赖稳定原则:依赖那些I(不稳定性量度)比你低 的包
依赖稳定原则(SDP) 依赖稳定原则(SDP)
违反了SDP 违反了SDP
稳定抽象原则( SAP) 稳定抽象原则(
稳定的包应该是抽象包.Stable packages
should be abstract packages.
Liskov 替换原则 (LSP)
Subclasses should be substitutable for their base classes.子类应该可以替换其基

Liskov 替换原则 (LSP)
Derived类应该能替换其 Derived类应该能替换其 Base类.也就是说,Base Base类.也就是说,Base 基类的一个用户User如果 基类的一个用户User如果 被传递给一个Devrived类而 被传递给一个Devrived类而 不是Base类作为参数,也 不是Base类作为参数,也 能正常的工作. 如果某个User函数有一个 如果某个User函数有一个 Base类型的参数,那么, Base类型的参数,那么, 将一个Derived类的实例作 将一个Derived类的实例作 为参数传递给User函数也 为参数传递给User函数也 应该是合法的.
稳定抽象原则( SAP) 稳定抽象原则(
抽象度量.我们可以用另外一个"三件套" 抽象度量. 来计算抽象程度. Nc:包中类的数量. Na:包中抽象类的数量.记住,一个抽象类 至少含有一个纯接口,并且不能被实例化 A :抽象程度. ,位于[0,1]区间的量度 A为0表示包中没有抽象类,A为1表示包中全 部为抽象类.
面向对象设计原则
OO Principles
体系结构和依赖性
1. 2. 3. 4. 设计正在"腐烂"的征兆 过于僵硬Rigidity 过于僵硬Rigidity 过于脆弱 不可重用性 粘滞性过高
开放关闭原则 (OCP)
A module should be open for extension but closed for modification.一个模块应该只在扩
户相关的接口要好于一个通用接口.
接口隔离原则 (ISP)
接口隔离原则 (ISP)
发布重用等价原则(REP) 发布重用等价原则(REP)
重用的粒度就是发布的粒度.The granule of reuse is the
granule of release. 一个可重用的元件(组件,一个类,一组类等),只有在 它们被某种发布(Release)系统管理以后,才能被重用. 它们被某种发布(Release)系统管理以后,才能被重用. 用户不愿意使用那些每次改动以后都要被强迫升级的元件. 因此,即使开发者发布了可重用元件的新版本,他也必须 支持和维护旧版本,这样才有时间让用户熟悉新版本. 因此,将什么类放在一个包中的判断标准之一就是重用, 并且因为包是发布的最小单元,它们同样也是重用的最小 单元.体系结构师应该将可重用的类都放在包中
OCPOCP-静态多态性
另外一种使用 OCP的技术就是 使用模板或范型. LogOn函数不用 修改代码就可以 扩展出多种类型 的modem.
template <typename MODEM> void LogOn(MODEM& m,string& pno, string& user, string& pw) { m.Dial(pno); // you get the idea. }
相关文档
最新文档