软件就是现实世界的抽象,最近经过一些重构不断的认识到封装变化,接口隔离,开闭原则,针对接口编程,能使用组合尽量不使用继承的设计原则。
关于OOD六大原则
- 开闭原则,这个是比较具有理想主义色彩的,可以说面向对象设计的终极目标就是对扩展开放对修改关闭的,其他的设计模式也是在追求这个目标而存在的。开闭原则的目的就是为了完成良好的设计,对修改的关闭保持了对已有设计的保持,对扩展开放保持了系统功能上的灵活性,这样的规则设计出来的系统就是已给比较规范的面相对象系统。有必要谈一下,面相对象三大特性封装继承多态,继承是破坏了OOD的开闭原则,因为如果继承原有的类的话会暴露父类的方法。这样如果覆盖的方法就破坏了类的对修改关闭这条原则,虽然不能说继承是一种不好的聚合方式,但是大量的实践还是证明我们应该尽可能的使用组合关联去聚合对象。
- 接口隔离,接口隔离有点类似于设计原则当中单一职责,但是还是有差别的,接口这个概念在面相对象中就是定义规则(之前的架构师一直强调的)。定义规则的类。从面相对象的抽象层次上来讲接口是最抽象的一个层次,因为只定义规则方法,不去实现,具体的实现交给子类去完成。抽象类是更低层次的一种抽象过程,实现了部分的细节。接口定义规则后需要实现该接口的类需要完成该接口的所有方法的实现,在java当中是可以实现多个接口的,弥补了多继承的这点不足。但是如果该接口包含很多的方法就会导致类十分的臃肿,因此理想情况下我们应该更多的将接口拆开成多个单一的接口去进行一一实现这样可以增加接口的灵活性。接口的用途应该尽可能的单一。
- 依赖倒置,在没有出现OOD之前的软件工程,我们更多是细节决定了架构,这样的软件是不稳定的,因为整个软件的架构依赖于细节。因此传统的软件要做出一个良好的设计是相当不容易的。面向对象设计的最好的思想就是细节依赖于抽象,这相比较非面向对象的软件开发是倒过来了,因此叫做依赖倒置,定义抽象层次之间的关系搭建起来一个良好的架构,再从架构着手去填充业务。接口的抽象是十分稳定的,因此尽量面向接口去编程将会使架构变得稳定(稳定和优秀是区别的,优秀是设计思想,稳定是设计效果)。更多依赖抽象层次间的关系去搭建架构。
- 单一职责,设计优秀软件模块最好是好复用好测试的,引起一个类变化的消息最好是单一的,高内聚低耦合是软件理想状态,实际情况下肯定会有类之间的联系,我们应该尽可能的控制类之间的关系能够让引起该类变化的原因变得比较单一,这样好去控制,尽量只完成该类可以做的事情而不去做多余的事情,函数的参数也应该不要太多,这样难以去控制逻辑。单一职责好去控制也容易测试,易维护。
- 最小知识法则,一个类对于另一个类应该知道尽可能少的东西,这样可以降低类之间的耦合,不要把一个类的内部细节太多的暴露给其他的类。
- 里氏代换原则,最开始学习这个原则时候我的理解是有误差的,我理解的是父类出现的地方子类也可以出现,这是OOP原生支持的语法规则为什么会当做设计原则呢。后来才理解到还有一句,父类出现的地方子类也可以出现并且不出现不一致的情况。这里强调的感觉就是继承机制的缺点控制。继承就是破坏了类的封装性,把细节暴露给了子类。如果某个地方调用了父类的方法,某子类重写了该方法,然后将该对象替换成该子类,那么会导致业务原来正常的方法出现错误,因此这个是违背里氏替换原则的,因此这还是强调尽量少使用继承多使用组合的方式去聚合类,避免出现重写导致业务混乱。