第5章 面向对象的设计原则

合集下载

面向对象分析设计原则

面向对象分析设计原则

一、单一职责原则(SRP)就一个类而言,应该仅有一个引起它变化的原因。

软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。

测试驱动的开发实践常常会在设计出现臭味之前就迫使我们分离职责。

二、开闭原则(OCP)软件实体(类、模块、函数)应该是可扩展的,但是不可修改的。

也就是说:对于扩展是开放的,对于更改是封闭的。

怎样可能在不改动模块源代码的情况下去更改它的行为呢?怎样才能在无需对模块进行改动的情况下就改变它的功能呢?关键是抽象!因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。

该原则同样适合于非面向对象设计的方法,是软件工程设计方法的重要原则之一。

三、替换原则(LSP)子类应当可以替换父类并出现在父类能够出现的任何地方。

这个原则是Liskov于1987年提出的设计原则。

它同样可以从Bertrand Meyer 的DBC (Design by Contract〔基于契约设计〕) 的概念推出。

四、依赖倒置原则(DIP)1、高层模块不应该依赖于低层模块。

二者都应该依赖于抽象。

2、抽象不应该依赖于细节。

细节应该依赖于抽象。

在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。

具体类只负责相关业务的实现,修改具体类不影响与特定业务有关的依赖关系。

在结构化设计中,我们可以看到底层的模块是对高层抽象模块的实现(高层抽象模块通过调用底层模块),这说明,抽象的模块要依赖具体实现相关的模块,底层模块的具体实现发生变动时将会严重影响高层抽象的模块,显然这是结构化方法的一个"硬伤"。

面向对象方法的依赖关系刚好相反,具体实现类依赖于抽象类和接口。

五、接口分离原则(ISP)采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。

ISP原则是另外一个支持诸如COM等组件化的使能技术。

缺少ISP,组件、类的可用性和移植性将大打折扣。

面向对象的设计原则(精)

面向对象的设计原则(精)

稳定依赖原则
稳定性度量:计算进出该包的依赖关系的数目,使
用这些数值来计算该包的稳定性。

Ca——输入耦合度:指处于该包的外部并且依赖于该 包内的类的类的数目。 Pc的稳定性:
Ca = 3 Ce ——输出耦合度:指处于该包的内部并且依赖于该 Ce = 1 包外的类的类的数目 I = 1/4


I——不稳定性: I = Ce / (Ca+ Ce)
相互之间没有紧密关联的类不应该放在同一包里。
共同封闭原则

共同封闭原则:解决哪些类应该放在同一个包里
包中的所有类对于同一类性质的变化应该是共同封
闭的。

一个变化若对一个包产生影响,则将对包中的所有类 产生影响,而对于其他的包不造成影响。
这是单一职责原则应用于包的规定。 单一职责原则规定了一个类不应该包含多个引起变化 的原因,共同封闭原则则规定了一个包不应该包含多 个引起变化的原因。
接口隔离原则
作类都不会使用。
接口隔离原则

接口隔离原则是用来处理“胖接口”的。
胖类会导致它们的客户程序之间产生不好的耦合关
系。
通过把胖类的接口分解为多个特定于客户程序的接
口,然后胖类继承这些接口,实现它们。这样可以
解除这种耦合关系。
包的设计原则

通过包来管理软件的开发和发布。
需要根据一些原则对应用程序的类进行划分,然后
包的内聚性原则
包的耦合性原则
接口隔离原则

接口隔离原则(ISP)
从一个客户类的角度来讲,一个类对另外一个类的
依赖性应当是建立在最小的接口上的。

不能强迫用户去依赖那些他们不使用的接口。

面向对象设计原则ppt

面向对象设计原则ppt
如果 fun方法的参数Rectangle 指向的是一个正方形 ,产生的结果就会让人产生迷惑。 结果是4! 对于写fun方法的人来讲,他会认为应该是2.
Square对象的行为方式和函数fun所期望的Rectangle对象的行为方式不相容.
01
对象的行为方式才是软件真正所关注的问题.(关心是不是想象中的那种行为)
面向对象设计原则
宋俊杰
重新认识一下面向对象
了解面向对象设计原则
目标
并不是面向对象的全部,甚至只是浅陋的面向对象
通过面向对象编程语言(OOPL)认识到的面向对象,
01
我们不能依赖编程语言的面向对象机制来掌握面向对象 OOPL的三大机制“封装、继承、多态”可以表达面向对 象的概念,但是没有刻画出面向对象的核心精神。 可以用这三大机制做出好的“面向对象设计”也可以做出差的“面向对象的设计” .
02
abstract class Employee{ … public abstract int getSalary(); } class Sales extends Employee[ … public int getSalary(){ … } } .
class Engineer extends Employee{ … public int getSalary(){ … } } // 显示工资程序 Employee e = emFactory.getEmployee(id); System.out.println(e.getSalary());
要依赖于抽象不要依赖于具体
抽象不应该依赖于细节,细节应该依赖于抽象
另一种说法:要对接口编程,不要针对实现编程.0102 Nhomakorabea03
依赖倒置原则 DIP

面向对象设计六大原则

面向对象设计六大原则

面向对象设计六大原则面向对象设计的原则是面向对象思想的提炼,它比面向对象思想的核心要素更具可操作性,但与设计模式相比,却又更加的抽象,是设计精神要义的抽象概括。

形象地将,面向对象思想像法理的精神,设计原则则相对于基本宪法,而设计模式就好比各式各样的具体法律条文了。

面向对象设计原则有6个:开放封闭原则,单一职责原则,依赖倒置原则,Liskov替换原则,迪米特法则和接口隔离原则或合成/聚合复用原则(不同资料略有不同,这里对7个都做了整理)。

1单一职责原则(Single Responsibility Principle SRP)There should never be more than one reason for a class to change.什么意思呢?所谓单一职责原则就是一个类只负责一个职责,只有一个引起变化的原因。

如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化会削弱或抑制这个类完成其他职责的能力,这个耦合会导致脆弱的设计。

软件设计真正要做的许多内容,就是发现职责并把这些职责相互分离;如果能够想到多于一个动机去改变一个类,那么这个类就具有多于一个职责,就应该考虑类的分离。

以调制解调器为例如下图:从上述类图里面我们发现有四个方法Dial(拨通电话),Hangup(挂电话),Receive(收到信息),Send(发送信息),经过分析不难判断出,实际上Dial(拨通电话)和Hangup(挂电话)是属于连接的范畴,而Receive(收到信息)和Send(发送信息)是属于数据传送的范畴。

这里类包括两个职责,显然违反了SRP。

这样做有潜在的隐患,如果要改变连接的方式,势必要修改Modem,而修改Modem 类的结果导致凡事依赖Modem类可能都需要修改,这样就需要重新编译和部署,不管数据传输这部分是否需要修改。

因此要重构Modem类,从中抽象出两个接口,一个专门负责连接,另一个专门负责数据传送。

面向对象设计的三大原则,理解并能举例

面向对象设计的三大原则,理解并能举例

面向对象设计的三大原则,理解并能举例
面向对象编程设计有三大原则,分别是封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。

1. 封装(Encapsulation):封装是将数据和相关行为(方法)
组合在一个类中,以实现隐藏内部实现细节的原则。

通过封装,可以将一组数据和对它们的操作封装在一个类中,对外部只暴露必要的接口,隐藏了实现的细节,提高了代码的安全性和可维护性。

例如,一个汽车类可以封装了颜色、品牌、速度等变量和加速、刹车等方法,对外只提供加速和刹车的接口,而隐藏了内部细节。

2. 继承(Inheritance):继承是指创建一个新类(子类)从已
有的类(父类)中继承属性和方法的过程。

子类可以通过继承父类的特性来扩展和增强功能,并且可以重用已有的代码。

例如,有一个动物类,定义了一些公共属性和方法,然后创建了狗类和猫类继承动物类,狗类和猫类就可以共享动物类的一些功能,同时可以根据需要添加自己的特定功能。

3. 多态(Polymorphism):多态是指同一类对象在不同情况下
可以表现出不同的行为。

对象多态性使用继承和接口实现,通过动态绑定和方法重写,允许不同的对象对同一个方法做出不同的响应。

例如,一个动物类中有一个叫声的方法,猫类和狗类都继承了动物类,并重写了叫声的方法,当通过调用叫声方法时,猫和狗的叫声不同,实现了多态性。

这三个原则是面向对象设计的基石,有助于实现代码的可重用性、可扩展性和灵活性。

面向对象设计方法 原则

面向对象设计方法 原则

面向对象设计方法原则
以下是面向对象设计方法的原则:
1. 单一职责原则(SRP):每个对象或类都应该只有一个责任。

2. 开放封闭原则(OCP):软件实体应该是可扩展的,但是不可修改的。

3. 里氏替换原则(LSP):子类对象必须能够替换基类对象并
且行为一致。

4. 接口隔离原则(ISP):不应该强迫任何类实现它不需要使
用的方法。

5. 依赖倒置原则(DIP):高层次的模块不应该依赖于底层次
的模块,而是依赖于抽象。

6. 组合/聚合复用原则(CARP):尽可能使用组合/聚合而不
是继承来实现复用。

7. 最少知识原则(LKP):一个对象应该只知道与其交互的对象的最少信息。

这些原则可以帮助我们实现松耦合、可扩展、易维护、易测试的面向对象设计。

面向对象设计5大基本原则

面向对象设计5大基本原则

⾯向对象设计5⼤基本原则⾯向对象设计模式有5⼤基本原则:单⼀职责原则、开发封闭原则、依赖倒置原则、接⼝隔离原则、Liskov替换原则。

1、单⼀职责原则(SRP): 1.1,SRP(Single Responsibilities Principle)的定义:就⼀个类⽽⾔,应该仅有⼀个引起它变化的原因。

简⽽⾔之,就是功能要单⼀。

1.2,如果⼀个类承担的职责过多,就等于把这些职责耦合在⼀起,⼀个职责的变化可能会削弱或者抑制这个类完成其它职责的能⼒。

这种耦合会导致脆弱的设计,当变化发⽣时,设计会遭受到意想不到的破坏。

1.3,软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。

⼩结:单⼀职责原则可以看做是低耦合、⾼内聚在⾯向对象原则上的引申,将职责定义为引起变化的原因,以提⾼内聚性来减少引起变化的原因。

职责过多,可能引起它变化的原因就越多,这样导致职责依赖,相互之间就会产⽣原因,⼤⼤损伤其内聚性和耦合度。

2、开放-封闭原则(OCP): 2.1,OCP(Open-Close Principle)的定义:就是说软件实体(类,⽅法等等)应该可以扩展,但是不能修改。

它是软件设计中也是最重要的⼀种设计原则。

2.2,OCP的两个特征: 2.2.1> 对于扩展是开放的。

2.2.2> 对于修改是封闭的。

2.3,什么时候应⽤OCP原则呢? 在我们最初编写代码时,假设变化不会发⽣,当变化发⽣时,我们就创建抽象(⽐如抽象类,接⼝等等)来隔离以后发⽣的同类变化。

2.4,开放-封闭原则是⾯向对象设计的核⼼所在。

遵循这个原则可以带来⾯向对象技术所声称的巨⼤好处,也就是可维护,可扩展,可复⽤,灵活性好。

开发⼈员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然⽽,对于应⽤程序中的每个部分都刻意地进⾏抽象同样不是⼀个好主意。

拒绝不成熟的抽象和抽象本⾝⼀样重要。

2.5,OCP的UML图:⼩结:开放封闭原则是⾯向对象设计的核⼼所在。

面向对象设计原则

面向对象设计原则

面向对象七大设计原则1、开闭原则2、里氏替换原则3、单一职责原则4、接口隔离原则5、依赖倒置原则6、迪米特原则7、组合/聚合复用原则知识点关联学习面向对象的设计模式,是深入面向对象思想的钥匙,通过大师级的微妙案例,我们可以开阔自己的认知。

在学习面向对象设计七大原则之前,我们要对基本的封装、继承、多态思想有足够的了解,对抽象类和接口也要有足够的编码能力,因为设计模式是以上知识点的综合应用。

另外,在接触具体的设计模式之前,面向对象的七大设计原则会让你知道,设计模式出现的必然性和意义所在。

1、每一种设计思想的精准含义,具体如下:先从整体认识这七种设计思想。

一、开闭原则:这一条放在第一位来理解,它的含义是对扩展开放,对修改关闭。

解释一下就是,我们写完的代码,不能因为需求变化就修改。

我们可以通过新增代码的方式来解决变化的需求。

当然,这是一种理想的状态,在现实中,我们要尽量的缩小这种修改。

再解释一下这条原则的意义所在,我们采用逆向思维方式来想。

如果每次需求变动都去修改原有的代码,那原有的代码就存在被修改错误的风险,当然这其中存在有意和无意的修改,都会导致原有正常运行的功能失效的风险,这样很有可能会展开可怕的蝴蝶效应,使维护工作剧增。

说到底,开闭原则除了表面上的可扩展性强以外,在企业中更看重的是维护成本。

所以,开闭原则是设计模式的第一大原则,它的潜台词是:控制需求变动风险,缩小维护成本。

以下几种原则,都是为此原则服务的。

二、里氏替换选择:此原则的含义是子类可以在任何地方替换它的父类。

解释一下,这是多态的前提,我们后面很多所谓的灵活,都是不改变声明类型的情况下,改变实例化类来完成的需求变更。

当然,继承的特性看似天然就满足这个条件。

但这里更注重的是继承的应用问题,我们必须保证我们的子类和父类划分是精准的。

里氏替换原则的潜台词是:尽量使用精准的抽象类或者接口。

三、单一职责原则:单一职责的含义是:类的职责单一,引起类变化的原因单一。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OOP 21
手(注意:被改变了!)
public class Hand1 { public Door1 door; public Drawer1 drawer; public int item=1; void act() { switch (item){ case 1: if (door.isOpen()) door.close(); else door.open(); break;
“开-闭”原则、里氏替换原则、依赖
倒转原则、合成/聚合复用原则
OOP
6
开放-封闭原则 Open-Closed Principle
定义
软件实体(类,模块,函数,等等)应该 尽可能允许扩展,同时尽可能避免被更改。 SOFTWARE ENTITIES (CLASSES, MODULES, FUNCTIONS, ETC.) SHOULD BE OPEN FOR EXTENSION, BUT CLOSED FOR MODIFICATION. -Bertrand Meyer 1988
OOP 14
OCP的关键
符合OCP原则的程序只通过增加代码来变 化而不是通过更改现有代码来变化,因此 这样的程序就不会引起象非开放―封闭的 程序那样对变化的连锁反应
OOP
15
OCP实例(1)
思考:如何在程序中模拟用手去开门和关 门? 行为:
开门
关门 判断门的状态
OOP
16
OOP
8
任何软件系统都会发生变化
任何软件系统在其生命周期中都会发生变 化。如果我们不希望开发出的系统第一版 本后就被抛弃,那么我们就必须牢牢记住 这一点。 -IvarJacobson
OOP
9
OCP特征
可扩展(对扩展是开放的)
模块的行为功能可以被扩展,在应用需求改变
或需要满足新的应用需求时,我们可以让模块 以不同的方式工作 NhomakorabeaOOP 17

public class Hand1 { public Door1 door; void act() { if (door.isOpen()) door.close(); else door.open(); } }
OOP 18
主程序
public class Main1 { public static void main(String[] args) { Hand1 myHand = new Hand1(); myHand.door = new Door1(); myHand.act(); } }
知固而不知革,物 失其则 知革而不知固,物 失其均
固:close for modification 革:open for extension
OOP
12
太玄经
一个系统对修改关闭,就是”固” 而一个系统对扩展开放,就是”革” 一个系统不可拓展,就会“物则失则”, 或者说系统无法发展 而一个系统动则需要修改,便会“物失其 均”,也就是失去其重心
可扩展性 灵活性 可插入性
-Peter Code [CODE99]
OOP 3
设计目标
可扩展性(Extensibility)
容易添加新的功能
灵活性(Flexibility)
代码修改平稳地发生
可插入性(Pluggability)
容易将一个类抽出去,同时将另一个有
同样接口的类加入进来
OOP
13
OCP的关键
OCP的关键是
抽象!
由抽象可以预见所有可能的扩展(闭):模块可以 操作一个抽象体,由于模块依赖于一个固定的抽 象体,因此它对修改是封闭的(closed for modification) 由抽象可以随时导出新的类(开):同时,通过从 这个抽象体派生,又可扩展此模块的行为和功能 (open for extension)
不可更改(对更改是封闭的)
这些模块的源代码是不可改动的 任何人都不许修改模块的源代码
自相矛盾?
OOP 10
老子论不武
士:软件工程师 武:对系统的大规 模修改 道:软件复用 戎马:代码高手
天下有道,却走马 擅为士 以粪。天下无道, 者不武 戎马生于郊。
OOP
11
太玄经
OOP 19
新的问题
需要手去开关抽屉,冰箱……?
我们只好去修改程序……
OOP
20
抽屉
public class Drawer1 { private boolean _isOpen=false; public boolean isOpen(){ return _isOpen; } public void open(){ _isOpen = true; } public void close(){ _isOpen = false; } }
第5章 面向对象的设计原则
软件设计中存在的问题
过于僵硬(Rigidity)
很难加入新功能
过于脆弱(Fragility)
很难修改
复用率低(Immobility)
高层模块无法重用
黏度过高(Viscosity)
OOP
破坏原始设计框架
2
什么是好的设计? 一个好的系统设计应该有如下性 质:
OOP 4
面向对象的设计原则
OCP:开-闭原则:
对可变性封装
SRP:单一职责原则
如何划分职责
LSP:里氏代换原则
如何进行继承
DIP:依赖倒转原则
针对接口编程
ISP:接口隔离原则
恰当的划分角色和接口
CRP:合成复用原则
尽量使用合成/聚合而不使用继承复用

public class Door1 { private boolean _isOpen=false; public boolean isOpen(){ return _isOpen; } public void open(){ _isOpen = true; } public void close(){ _isOpen = false; } }
LoD:迪米特原则
不要跟陌生人说话
OOP
其他设计原则
5
目标与原则的关系
可扩展性(Extensibility)
“开-闭”原则、里氏替换原则、依赖
倒转原则、合成/聚合复用原则
灵活性(Flexibility)
“开-闭”原则、Demeter法则、接口
隔离原则
可插入性(Pluggability)
相关文档
最新文档