类设计的基本经验.ppt

上传人:xin****828 文档编号:15513501 上传时间:2020-08-15 格式:PPT 页数:27 大小:180.50KB
收藏 版权申诉 举报 下载
类设计的基本经验.ppt_第1页
第1页 / 共27页
类设计的基本经验.ppt_第2页
第2页 / 共27页
类设计的基本经验.ppt_第3页
第3页 / 共27页
资源描述:

《类设计的基本经验.ppt》由会员分享,可在线阅读,更多相关《类设计的基本经验.ppt(27页珍藏版)》请在装配图网上搜索。

1、授课:李远辉,类设计的基本经验 OO设计原则,湖南工程学院计算机与通信学院,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,1、类要单一 2、加强内聚,松散耦合 3、好的封装性 4、类的粒度要合理 5、实现类不能依赖它的使用类 6、应考虑灵活性,也就是可配置、可维护 可配置:可以通过修改配置文件来选择系统提供的功能 可维护:可以很方便地修改功能,容易定位bug,功能隔离较好,不会牵一发而动全身,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,7、要考虑性能、考虑可伸缩性 综合性能、性能定点、性能拐点,软件的体系结构决定了性能的顶点 8、要考虑今后可能的变

2、化,也就是可扩展性 9、要考虑合理的复用 10、要合理地考虑接口和抽象类的使用 优先使用接口,抽象类既要约束子类的行为,又要为子类提供公共的功能。 11、尽量减少类与协作类的交互次数和交互信息的量 12、父类不应知道子类的信息,子类必须知道父类的信息 13、更多地使用类的组合,而不是继承 14、访问对象必须通过接口,不能绕过接口直接去访问。,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,面向对象的设计原则 (1)单一职责原则:就一个类而言,应该仅有一个引起变化的原因。 (2)开放-封闭原则:软件实体应该是可以扩展的,但是不可修改。 (3)替换原则:子类应该能够替换他的父类

3、。 (4)依赖倒置原则:抽象不应该以来细节,细节应该以来抽象 (5)接口隔离原则:不应强迫用户依赖他们不用的方法,接口属于客户,不属于他所在的类层次。 (6)重用发布等价原则:重用的粒度就是发布的粒度。 (7)共同封闭原则:包所有类应该对于同一类性质的变化应该是共同封闭的。 (8)共同重用原则:一个包中的所有类应该是共同重用的。如果重用包中的一个类,就应该重用包中所有类。 (9)无环依赖原则:在包的依赖图中不应该存在环。 (10)稳定依赖原则:朝着稳定依赖的方向进行依赖。 (11)稳定抽象原则:包的抽象程度应该和依赖的程度一致。,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教

4、程,依赖是和变化紧密联系在一起的概念。 由于依赖关系的存在,变化在某处发生时,影响会波及开来,造成很多修改工作,这就是依赖的危害。可以说变化是始作俑者,依赖是助纣为虐。我们可以不去拥抱变化吗?不可以。未来将是越来越不可预测,这是新经济最具挑战性的方面之一。商务和技术上的瞬息万变会产生变化,这既可以看作要防范的威胁,也可以看作应该欢迎的机遇。既然变化不可避免,我们所能做的就是处理好依赖关系,将变化造成的影响波及范围尽量减小。,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,单 一职责原则(Single-Resposibility Principle)。 对一个类而言,应该仅有

5、一个引起它变化的原因。本原则是我们非常熟悉地高内聚性原则的引申,但是通过将职责极具创意地 定义为变化的原因,使得本原则极具操作性,尽显大师风范。同时,本原则还揭示了内聚性和耦合生,基本途径就是提高内聚性;如果一个类承担的职责过多, 那么这些职责就会相互依赖,一个职责的变化可能会影响另一个职责的履行。其实OOD的实质,就是合理地进行类的职责分配。,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,开放封闭原则 (Open-Closed principle)。 软件实体应该是可以扩展的,但是不可修改。本原则紧紧围绕变化展开,变化来临时,如果不必改动软件实体裁的源代码,就能扩充它

6、的行为,那么这个软件实体设计就是满足开放封闭原则的。如果说我们预测到某种变化,或者某种变化发生了,我们应当创建抽象类来隔离以后发生的同类变化。在 Java中,这种抽象是指抽象基类或接口;在C+中,这各抽象是指抽象基类或纯抽象基类。当然,没有对所有情况都贴切的模型,我们必须对软件实体应该面 对的变化做出选择。,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,Liskov替换原则(Liskov-Substituion Principle)。 子类型必须能够替换掉它们的基类型。本原则和开放封闭原则关系密切,正是子类型的可替换性,才使得使用基类型模块无需修改就可 扩充。Liskov

7、替换原则从基于契约的设计演化而来,契约通过为每个方法声明先验条件和后验条件;定义子类时,必须遵守这些先验条件和后 验条件。当前基于契的设计发展势头正劲,对实现软件工厂的组装生产梦想是一个有力的支持,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,依赖倒置原则(Dependecy- Inversion Principle)。 抽象不应依赖于细节,细节应该依赖于抽象。本原则几乎就是软件设计的正本清源之道。因为人解决问题的思考过程是先抽象后具体, 从笼统到细节,所以我们先生产出的势必是抽象程度比较高的实体,而后才是更加细节化的实体。于是,细节依赖于抽象就意味着后来的依赖于先前的,

8、这是自 然而然的重用之道。而且,抽象的实体代表着笼而统之的认识,人们总是比较容易正确认识它们,而且本身也是不易变的,依赖于它们是安全的。依赖倒置原则适应 了人类认识过程的规律,是面向对象设计的标志所在。,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,接口隔离原则(Interface-Segregation Principle)。多个专用接口优于一个单一的通用接口。本原则是单一职责原则用于接口设计的自然结果。一个接口应该保证,实现该接口的实例对象 可以只呈现为单一的角色;这样,当某个客户程序的要求发生变化,而迫使接口发生改变时,影响到其他客户程序的可能生性小。,湖南工程学院

9、计算机与通信学院,授课:李远辉,Java 编程技术教程,良性依赖原则 不会在实际中造成危害的依赖关系,都是良性依赖。通过分析不难发现,本原则的核心思想是务实,很好地揭示了极限编程(Extreme Programming)中简单设计各重构的理论基础。本原则可以帮助我们抵御面向对象设计五大原则以及设计模式的诱惑,以免陷入过度设计 (Over-engineering)的尴尬境地,带来不必要的复杂性。,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,OO设计原则 什么是设计原则? 设计原则是基本的工具,应用这些规则可以使你的代码更加灵活、更容易维护,更容易扩展。 基本原则: 封装变

10、化Encapsulate what varies. 面向接口编程而非实现 Code to an interface rather than to an implementation.优先使用组合而非继承 Favor Composition Over Inheritance,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,SRP: The single responsibility principle 单一职责 系统中的每一个对象都应该只有一个单独的职责,而所有对象所关注的就是自身职责的完成。 Every object in your system should have a

11、 single responsibility ,and all the object s services should be focused on carrying out that single responsibility . 每一个职责都是一个设计的变因,需求变化的时候,需求变化反映为类职责的变化。当你系统里面的对象都只有一个变化的原因的时候,你就已经很好的遵循了SRP原则。,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,SRP: The single responsibility principle 单一职责 如果一个类承担的职责过多,就等于把这些职责耦合在了一

12、起。一个职责的变化就可能削弱或者抑制这个类其它职责的能力。这种设计会导致脆弱的设计。当变化发生的时候,设计会遭到意想不到的破坏。 SRP 让这个系统更容易管理维护,因为不是所有的问题都搅在一起。 内聚Cohesion 其实是SRP原则的另外一个名字.你写了高内聚的软件其实就是说你很好的应用了SRP原则。 怎么判断一个职责是不是一个对象的呢?你试着让这个对象自己来完成这个职责,比如:“书自己阅读内容”,阅读的职责显然不是书自己的。 仅当变化发生时,变化的轴线才具有实际的意义,如果没有征兆,那么应用SRP或者任何其它的原则都是不明智的。,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技

13、术教程,DRY : Dont repeat yourself Principle 通过抽取公共部分放置在一个地方避免代码重复. Avoid duplicate code by abstracting out things that are common and placing those thing in a single location . DRY 很简单,但却是确保我们代码容易维护和复用的关键。 你尽力避免重复代码候实际上在做一件什么事情呢?是在确保每一个需求和功能在你的系统中只实现一次,否则就存在浪费!系统用例不存在交集,所以我们的代码更不应该重复,从这个角度看DRY可就不只是在说代码

14、了。 DRY 关注的是系统内的信息和行为都放在一个单一的,明显的位置。就像你可以猜到正则表达式在.net中的位置一样,因为合理所以可以猜到。 DRY 原则:如何对系统职能进行良好的分割!职责清晰的界限一定程度上保证了代码的单一性。,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,OCP : Open-Close Principle开闭原则 类应该对修改关闭,对扩展打开; Classes should be open for extension ,and closed for modification . OCP 关注的是灵活性,改动是通过增加代码进行的,而不是改动现有的代码

15、; OCP的应用限定在可能会发生的变化上,通过创建抽象来隔离以后发生的同类变化 OCP原则传递出来这样一个思想:一旦你写出来了可以工作的代码,就要努力保证这段代码一直可以工作。这可以说是一个底线。稍微提高一点要求,一旦我们的代码质量到了一个水平,我们要尽最大努力保证代码质量不回退。这样的要求使我们面对一个问题的时候不会使用凑活的方法来解决,或者说是放任自流的方式来解决一个问题;比如代码添加了无数对特定数据的处理,特化的代码越来越多,代码意图开始含混不清,开始退化。,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,OCP : Open-Close Principle开闭原则

16、OCP 背后的机制:封装和抽象;封闭是建立在抽象基础上的,使用抽象获得显示的封闭;继承是OCP最简单的例子。除了子类化和方法重载我们还有一些更优雅的方法来实现比如组合; 怎样在不改变源代码(关闭修改)的情况下更改它的行为呢?答案就是抽象,OCP背后的机制就是抽象和多态 没有一个可以适应所有情况的贴切的模型!一定会有变化,不可能完全封闭.对程序中的每一个部分都肆意的抽象不是一个好主意,正确的做法是开发人员仅仅对频繁变化的部分做出抽象。拒绝不成熟的抽象和抽象本身一样重要。 OCP是OOD很多说法的核心,如果这个原则有效应用,我们就可以获更强的可维护性 可重用 灵活性 健壮性 LSP是OCP成为可能

17、的主要原则之一,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,LSP: The Liskov substitution principle 子类必须能够替换基类 Subtypes must be substitutable for their base types. LSP关注的是怎样良好的使用继承. 必须要清楚是使用一个Method还是要扩展它,但是绝对不是改变它。 LSP清晰的指出,OOD的IS-A关系是就行为方式而言,行为方式是可以进行合理假设的,是客户程序所依赖的。 LSP让我们得出一个重要的结论:一个模型如果孤立的看,并不具有真正意义的有效性。模型的有效性只能通

18、过它的客户程序来表现。必须根据设计的使用者做出的合理假设来审视它。而假设是难以预测的,直到设计臭味出现的时候才处理它们。 对于LSP的违反也潜在的违反了OCP,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,DIP:依赖倒置原则 高层模块不应该依赖于底层模块,二者都应该依赖于抽象; 抽象不应该依赖于细节,细节应该依赖于抽象; 什么是高层模块?高层模块包含了应用程序中重要的策略选择和业务模型。这些高层模块使其所在的应用程序区别于其它。 如果高层模块依赖于底层模块,那么在不同的上下文中重用高层模块就会变得十分困难。然而,如果高层模块独立于底层模块,那么高层模块就可以非常容易的被

19、重用。该原则就是框架设计的核心原则。 这里的倒置不仅仅是依赖关系的倒置也是接口所有权的倒置。应用了DIP我们会发现往往是客户拥有抽象的接口,而服务者从这些抽象接口派生。,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,DIP:依赖倒置原则 这就是著名的Hollywood原则:Dont call us well call you.底层模块实现了在高层模块声明并被高层模块调用的接口。 通过倒置我们创建了更灵活 更持久更容易改变的结构 DIP的简单的启发规则:依赖于抽象;这是一个简单的陈述,该规则建议不应该依赖于具体的类,也就是说程序汇总所有的依赖都应该种植于抽象类或者接口。 如

20、果一个类很稳定,那么依赖于它不会造成伤害。然而我们自己的具体类大多是不稳定的,通过把他们隐藏在抽象接口后面可以隔离不稳定性。 依赖倒置可以应用于任何存在一个类向另一个类发送消息的地方 依赖倒置原则是实现许多面向对象技术多宣称的好处的基本底层机制,是面向对象的标志所在。,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,ISP:接口隔离原则 不应该强迫客户程序依赖它们不需要的使用的方法。 接口不是高内聚的,一个接口可以分成N组方法,那么这个接口就需要使用ISP处理一下。 接口的划分是由使用它的客户程序决定的,客户程序是分离的,接口也应该是分离的。 一个接口中包含太多行为时候,导致它们的客户程序之间产生不正常的依赖关系,我们要做的就是分离接口,实现解耦。 应用了ISP之后,客户程序看到的是多个内聚的接口。,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,湖南工程学院计算机与通信学院,授课:李远辉,Java 编程技术教程,

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!