相关文章:
面向对象的六大原则是我们可以写出高扩展性,可读性强,易于维护的代码的基础。
面向对象的六大原则如下:
- 单一职责原则
- 开闭原则
- 里氏替换原则
- 依赖倒置原则
- 接口隔离原则
- 迪米特原则
单一职责原则
定义:对一个类而言,应该仅有一个引起它变化的原因。
说明:一个类应该是相关性很高的封装,类只实现一个功能。
补充:对于单一职责,定义类的职责是最大的问题,如何判定某个职责属于某个类呢?我们可以通过另一个GRASP中的来去间接说明职责分配的问题。那就是GRASP中的信息专家,
* 信息专家(Information Expert)
* 问题:给对象分配职责的基本原则是什么?
* 解决方案:把职责分配给具有完成职责所需信息的类。
开闭原则
定义:软件中的对象应该对于扩展是开放的,对于修改是关闭的。
说明:当软件需要变化时,我们尽可能的通过扩展的方式来实现变化,比如通过继承,通过装饰者模式来增加新的功能,而不是通过修改已有的接口来实现,一旦修改接口,上层调用的地方均需要修改。
补充:在我们设计的时候也要多多考虑如何避免这种变异。在GRASP中有个是防止变异
防止变异(Protected Variations)
问题:如何设计对象,子系统和系统,使其内部的变化或不稳定性不会对其他元素产生不良影响?
解决方案:识别变化或不稳定的地方,分配职责用以在变化地方创建稳定的接口。
里氏替换原则
定义:所有引用基类的地方都能替换为其子类的对象。
说明:也就说父类出现的地方,可以无条件地替换为子类。
补充:这里设计到了多态,通过多态来让行为可以替换.
多态性(Polymorphism)
问题:如何处理基于类型的选择?如何创建可插拔的软件构件?
解决方案:当相关选择或行为随类型有所不同时,使用多态操作为变化的行为分配职责。
依赖倒置原则
定义:高层次的模块不依赖低层次模块的具体细节,而应该依赖抽象。
说明:
- 高层次模块不应该依赖低层次的模块,二者都应该依赖其抽象
- 抽象不应该依赖细节
- 细节应该依赖抽象。
*这里涉及了GRASP中的低耦合,高内聚。
接口隔离原则
定义:类的依赖关系应该建立最小的接口上。不应该依赖不需要的接口。
说明:比如我们期望关闭FileInputStream时,我们应该依赖Closeable,而不应该依赖FileInputStream。
补充:GRASP中的低耦合。
迪米特原则
定义:此原则又叫作最少知识原则,就是说一个对象应当对其他对象有尽可能少的了解,尽可能不暴露具体的实现细节。
说明:比如直接访问类里面的属性。
补充:不和陌生人说话。GRASP中低耦合。