CS3SL3——面向对象七大原则
CS3SL3——面向对象七大原则
为什么要有七大原则
七大原则总体要实现的目标是:高内聚、低耦合
使程序模块的可重用性、移植性增强
何为高内聚低耦合
- 从类角度来看:高内聚低耦合要减少类内部,对其他类的调用
- 从功能块来看:高内聚低耦合要减少模块之间的交互复杂度
面向对象七大原则
注意
初学程序阶段,不要过多的纠结于七大原则,
先用最适合自己的方法把需求实现了,再使用七大原则去优化
不要想着一步到位,要循序渐进,面向对象编程能力提升是需要经验积累的
-
单一职责原则
即:一个类只处理自己应该处理的内容,不应该什么都写在一起
SRP (Single Responsibility Principle),类被修改的几率很大,因此应该专注于单一的功能。
如果把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能。举例:假设程序、策划、美术三个工种是三个类,他们应该各司其职,在程序世界中只应该做自己应该做的事情。
-
开闭原则
OCP (Open-Closed Principle),即:对拓展开放,对修改关闭,新加功能尽可能是增加方法而不是改源代码
- 拓展开放:模块的行为可以被拓展从而满足新的需求
- 修改关闭:不允许修改模块的源代码(或者尽量使修改最小化)
举例:继承就是最典型的开闭原则的体现,可以通过添加新的子类和重写父类的方法来实现
-
里氏替换原则
LSP (Liskov Substitution Principle),任何父类出现的地方,子类都可以替代,即父类装子类
举例:用父类容器装载子类对象,因为子类对象包含了父类的所有内容
-
依赖倒转原则
DIP (Dependence Inversion Principle),要依赖于抽象,不要依赖于具体的实现,要依赖抽象(接口)
例如:把函数的参数改为接口,而不是具体的类型,这样拥有这种接口行为的类对象都可以传入
-
迪米特法则
LoP (Law of Demeter),又称最少知识原则,一个类要尽量减少对别的类的了解,尽量少用别的类和自己关联
一个对象应当对其它对象尽可能少的了解不要和陌生人说话
举例:一个对象中的成员,要尽可能少的直接和其它类建立关系目的是降低耦合性
-
接口隔离原则
ISP (Interface Segregation Principle),不应该强迫别人依赖他们不需要使用的方法,一个接口一个行为,不要一个接口n个行为
一个接口不需要提供太多的行为,一个接口应该尽量只提供一个对外的功能,
让别人去选择需要实现什么样的行为,而不是把所有的行为都封装到一个接口当中举例:飞行接口、走路接口、跑步接口等等,虽然都是移动的行为
但是我们应该把他们分为一个一个单独的接口,让别人去选择使用笔者注:不妨多尝试基于行为抽象,也就是多抽象接口,将不同行为抽象成不同接口,一个类有哪些行为就继承哪些接口,达成一种组合
例如,怪物基类提供攻击行为、生命增加减少行为和死亡行为,但有些具有攻击行为的怪物对象可能是无敌的,这时生命和死亡行为就会成为不必要的耦合
把攻击行为,生命增加减少行为,死亡行为使用接口抽象,并剔除出怪物基类,让需要对应行为的类继承,就可以减少耦合 -
合成复用原则
CRP (Composite Reuse Principle),除非设计上需要继承,否则尽量使用对象组合,
不使用继承来达到复用的目的,继承关系是强耦合,组合关系是低耦合
举例:脸应该是眼镜、鼻子、嘴巴、耳朵的组合,而不是依次的继承角色和装备也应该是组合,而不是继承
注意:不能盲目的使用合成复用原则,要在遵循迪米特原则的前提下
如何使用这些原则
在开始做项目之前,整理UML类图时先按自己的想法把需要的类整理出来,
再把七大原则截图放在旁边,基于七大原则去优化整理自己的设计,
整体目标就是:高内聚,低耦合