OO principle

OO principle
OO principle

面向对象设计原则:面向对象设计(OOD)原则疯狂代码 https://www.360docs.net/doc/0411043542.html,/ ?:http:/https://www.360docs.net/doc/0411043542.html,/SoftwareEngineering

/Article35337.html

单职责原则(SRP):个类应当只有个改变原因类只需要知道件事情它们应当有个单独职责要点就是当个类需要改变时应当只有个原因

开放-封闭原则(OCP):软件Software实体(类、模块、等)应当为扩展而开放又为修改而封闭这个原则有个相当详细定义但是个简单意思是:你应当能够改变个模块周边环境而无须改变模块本身

Liskov替换原则(LSP):子类型(subtypes)必须是为它们基类型(base types)可替代

依存关系倒置原则(DIP) :A.高层模块应当不依赖低层模块它们应当依赖于抽象

B.抽象应当不依赖于细节细节应当依赖于抽象

更好描述是:不要依赖那些容易变化具体类如果你要继承个类从个抽象类继承吧如果你要持有个类引用从个抽象类引用吧如果你要个从个抽象吧

接口隔离原则(ISP):客户不应当依赖那些它们根本不用思路方法

整理总结:

5个简单原则是:

1、SRP--个类应当只有个发生变化原因

2、OCP――应当能够改变个类环境而无须改变类本身

3、LSP――避免造成派生类思路方法非法或退化个基类用户应当不需要知道这个派生类

4、DIP ――用依赖于接口和抽象类来替代依赖容易变化具体类

5、ISP――给个对象每个用户个接口这个接口仅有用户需要思路方法

正如牛顿 3大定律在经典力学中位置样“开-闭”原则(Open-Closed Principle)是面向对象可复用设计(Object Oriented Design或OOD)基石其他设计原则(里氏代换原则、依赖倒转原则、合成/聚合复用原则、迪米特法则、接口隔离原则)是实现“开-闭”原则手段和工具

、“开-闭”原则(Open-Closed Principle,OCP)

1.1“开-闭”原则定义及优点

1)定义:个软件Software实体应当对扩展开放对修改关闭( Software entities should be open for extension,but closed for modication.)即在设计个模块时候应当使这个模块可以在不被修改前提下被扩展

2)满足“开-闭”原则系统优点

a)通过扩展已有软件Software系统可以提供新行为以满足对软件Software新需求使变化中软件Software系统有定适应性和灵活性

b)已有软件Software模块特别是最重要抽象层模块不能再修改这就使变化中软件Software系统有定稳定性和延续性

c)这样系统同时满足了可复用性和可维护性

1.2如何实现“开-闭”原则

在面向对象设计中不允许更改是系统抽象层而允许扩展是系统实现层换言的定义个劳永逸抽象设计层允许

尽可能多行为在实现层被实现

解决问题关键在于抽象化抽象化是面向对象设计第个核心本质

对个事物抽象化实质上是在概括归纳整理总结它本质抽象让我们抓住最最重要东西从更高层去研究这降低了研究复杂度我们不用同时考虑那么多东西换言的我们封装了事物本质看不到任何细节

在面向对象编程中通过抽象类及接口规定了具体类特征作为抽象层相对稳定不需更改从而满足“对修改关闭”;而从抽象类导出具体类可以改变系统行为从而满足“对扩展开放”[Page]

对实体进行扩展时不必改动软件Software源代码或者 2进制代码关键在于抽象

1.3对可变性封装原则

“开-闭”原则也就是“对可变性封装原则”(Principle of Encapsulation of Variation EVP)即找到个系统可变原因将的封装起来换言的在你设计中什么可能会发生变化应使的成为抽象层而封装而不是什么会导致设计改变才封装

“对可变性封装原则”意味着:

a)种可变性不应当散落在代码许多角落而应当被封装到个对象里面同可变性区别表象意味着同个继承等级结构中具体子类因此此处可以期待继承关系出现继承是封装变化思路方法而不仅仅是从般对象生成特殊对象 b)种可变性不应当和另种可变性混合在起作者认为类图继承结构如果超过两层很可能意味着两种区别可变性混合在了起

使用“可变性封装原则”来进行设计可以使系统遵守“开-闭”原则

即使无法百分的百做到“开-闭”原则但朝这个方向努力可以显著改善个系统结构

2、里氏代换原则(Liskov Substitution Principle, LSP)

2.1概念

定义:如果对每个类型为T1对象O1都有类型为T2 对象O2使得以T1定义所有P在所有对象O1都代换为O2时P行为没有变化那么类型T2是类型T1子类型

即个软件Software实体如果使用是个基类话那么定适用于其子类而且它觉察不出基类对象和子类对象区别也就是说,在软件Software里面,把基类都替换成它子类,行为没有变化

反过来代换不成立如果个软件Software实体使用是个子类话那么它不定适用于基类

任何基类可以出现地方子类定可以出现

基于契约设计、抽象出公共部分作为抽象基类设计

2.2里氏代换原则和“开-闭”原则关系

实现“开-闭”原则关键步骤是抽象化基类和子类的间继承关系就是抽象化体现因此里氏代换原则是对实现抽象化具体步骤规范标准

违反里氏代换原则意味着违反了“开-闭”原则反的未必

3、 依赖倒转原则(dependence inversion principle, DIP)

3.1概念

依赖倒转原则就是要依赖于抽象不要依赖于实现(Abstractions should not depend upon details. Details should depend upon abstractions.)要针对接口编程不要针对实现编程(Program to an erface, not an implementation.)

也就是说应当使用接口和抽象类进行变量类型声明、参数类型声明、思路方法返还类型介绍说明以及数据类型转换等而不要用具体类进行变量类型声明、参数类型声明、思路方法返还类型介绍说明以及数据类型转换等要保证做到这点个具体类应当只实现接口和抽象类中声明过思路方法而不要给出多余思路方法

传统过程性系统设计办法倾向于使高层次模块依赖于低层次模块抽象层次依赖于具体层次倒转原则就是把这个依赖关系倒转过来 2008-12-13 21:55:28

疯狂代码 https://www.360docs.net/doc/0411043542.html,/

相关主题
相关文档
最新文档