面向对象 C 设计原则.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 仅当下列的所有标准被满足时,方可使用继承: 子类表达了“是一个…的特殊类型”,而非“是一个由…所扮演的角色”。 子类的一个实例永远不需要转化(transmute)为其它类的一个对象。 子类是对其父类的职责(responsibility)进行扩展,而非重写或废除(nullify)。 子类没有对那些仅作为一个工具类(utility class)的功能进行扩展。 Coad规则 * * 例 * * 组合与继承都是重要的重用方法 在OO开发的早期,继承被过度地使用 随着时间的发展,我们发现优先使用组合可以获得重用性与简单性更佳的设计 当然可以通过继承,以扩充可用的组合类集。 因此组合与继承可以一起工作 但是我们的基本法则是:优先使用对象组合,而非(类)继承 小结 * * Law of Demeter 又称 最少知识原则,一个对象应该对其他对象尽可能少的了解。 5.迪米特法则 (LoD) * * 控制信息过载,提高封装能力。 1. 创建弱耦合类,利于复用 2. 降低成员访问权限 3. 设计不变类 广义 * * 如果两个类不必彼此通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可通过第三者转发这个调用。 狭义 * * 朋友圈 * * * * Void Someone::Operation1(Friend friend){ Stranger stranger = friend.provide(); stranger.Operation3(); } Stranger Friend::provide(){ return stranger; } 例 * * 满足LOD吗? 思考 * * * * * * * 设计原则:迪米特法则 老子论“圣人之治” 使民无知:“是以圣人之治,虚其心,实其腹,弱其志,常使民无知无欲” 老死不相往来:“小国寡民...邻国相望,鸡犬之声相闻,民至老死,不相往来” 软件设计师就是软件系统的统治者 应当使得软件的不同对象彼此之间尽量“老死不相往来”,降低系统维护成本 * * * * 城门失火,殃及池鱼 四海之内皆兄弟 * * 使用多个专门的接口比使用单一的总接口好。 一个类对另一个类的依赖性应建立在最小的接口上。 6.接口隔离原则 (ISP) * * * * 定制服务:为同一角色提供宽窄不同的接口。 (承诺多,维护难) ISP * * 如果类的接口不是内聚的,就表示该类具有“胖”的接口。 ISP建议客户程序不应该看到它们作为单一的类存在。客户程序看到的应该是多个具有内聚接口的抽象基类。 * * 现在,考虑自动取款机(ATM) ATM需要一个非常灵活的用户界面。它的输出信息需要被转换成许多不同的语言。输出信息可能被显示在屏幕上,或者通过语音器说出来。显然界面需要创建一个抽象基类 同样可以把每个ATM可以执行的操作封装为类Transaction的派生类。有DepositTransaction,WithdrawTransaction以及TransferTransaction,每个类都调用UI的方法。 如何设计是违反LSP和遵守LSP? * * * * * * * * 单一职责原则(SRP) Rectangle Draw() Area() Computational Geometry Application Graphical Application * * Modem示例 Dial() Hangup() Send() Receive() 却显示两个职责 连接管理 数据通信 * * * * * * * * * * * 怎样遵循OCP 编写一个shape抽象类 这个类仅有一个抽象方法draw() 所有形状都从这个类派生 当绘制一种新的形状,只需要增加一个新的shape类的派生类。而DrawAllShapes 函数并不需要改变。 * * 使用指向基类(超类)的引用的函数,必须能够在不知道具体派生类(子类)对象类型的情况下使用它们。(Function Thar Use Referennces To Base(Super) Classes Must Be Able To Use Objects Of Derived(Sub) Classes Without Knowing It) 2.里氏替换法则 * * 一个软件如果使用的是一个父类的话,如果把该父类换成子类,它不能察觉出父类对象和子类对象的区别 也就是凡是父类适用的地方子类也适用 继承只有满足里氏代换原则才是合理的 * * *

文档评论(0)

a13355589 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档