设计原则
面向对象”是专指在程序设计中采用封装、继承、多态等设计方法,达到高内聚、低耦合的效果。一个好的系统设计应该具备以下几个性质:灵活性,可扩展性,可插入性。才能让软件具有可维护性和可复用性。
常用的面向对象设计原则包括7个,这些原则并不是孤立存在的,它们相互依赖,相互补充。
1.单一职责原则:
类的职责要单一。无论是类的属性还是类的方法。承担的职责越多,它被复用的可能性越小,而且如果一个类承担的职责过多,可能引起这个类变化的原因就越多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的变化。举个例子来说,软件为什么要分层,而不把一个功能的所有代码全写在一个页面,就是这个道理。
2.开闭原则:
一个软件实体应当对扩展开放,对修改关闭。也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。抽象化是开闭原则的关键。里氏代换原则和依赖倒转原则都是开闭原则的实现方式。
3.里氏代换原则:
在软件中如果能够使用基类对象,那么一定能够使用其子类对象。里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。
4.依赖倒转原则
代码要依赖于抽象的类,而不要依赖于具体的类;要针对接口或抽象类编程,而不是针对具体类编程。Spring的注入就是依赖倒转的体现。
5.接口隔离原则
一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。意思是使用多个专门的接口,而不使用单一的总接口。和设计模式的门面模式的思想恰好相反。
6.合成复用原则
尽量使用对象组合,而不是继承来达到复用的目的。在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用其已有功能的目的。简言之:要尽量使用组合/聚合关系,少用继承。下面比较两个复用方式。
继承复用:实现简单,易于扩展。破坏系统的封装性;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;只能在有限的环境中使用。(“白箱”复用 )
组合/聚合复用:耦合度相对较低,选择性地调用成员对象的操作;可以在运行时动态进行。(“黑箱”复用 )
7.迪米特法则
一个软件实体应当尽可能少的与其他实体发生相互作用。如果两个类之间不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。