面向对象的六大设计原则
(1)单一职责原则——SRP
(2)开闭原则——OCP
(3)里式替换原则——LSP
(4)依赖倒置原则——DIP
(5)接口隔离原则——ISP
(6)迪米特原则——LOD
——————————————————————————————
单一职责原则
一个类,只有一个引起它变化的原因,只有一个职责。
如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心就是解耦和增强内聚性。
(1)可以降低类的复杂度(2)提高类的可读性,和系统的维护性(3)当发生变化的时候,能将变化的影响降到最小,因为只会在这个类中做出修改。
开闭原则
开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。该特性在产品化的环境中是特别有价值的,在这种环境中,改变源代码需要代码审查,单元测试以及诸如此类的用以确保产品使用质量的过程。遵循这种原则的代码在扩展时并不发生改变,因此无需上述的过程。
当需求发生改变的时候,我们需要对代码进行修改,这个时候我们应该尽量去扩展原来的代码,而不是去修改原来的代码,用抽象去构建框架,用实现扩展细节。这样当发生修改的时候,我们就直接用抽象了派生一个具体类去实现修改。
里氏替换原则
在面向对象的程序设计中,里氏替换原则是对子类型的特别定义。“派生类(子类)对象可以在程式中代替其基类(超类)对象。”子类可以去扩展父类的功能,但是不能改变父类原有的功能。【里氏替换原则和开闭原则往往是相互依存的。】
1)子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。
2)子类可以增加自己独有的方法。
3)当子类的方法重载父类的方法时候,方法的形参要比父类的方法的输入参数更加宽松。
4)当子类的方法实现父类的抽象方法时,方法的返回值要比父类更严格。
依赖倒置原则
是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。依赖于抽象,不要依赖于具体。
接口隔离原则
客户端应该不依赖于它不使用的方法。使用多个隔离的接口,比使用单个接口要好。目的是系统解开耦合,从而容易重构,更改和重新部署。在面向对象设计中,接口(interface)提供了便于代码在概念上解释的抽象层,并创建了避免依赖的一个屏障。
建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。
△接口隔离原则使用注意:
1)接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
2)为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
3)提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
迪米特原则
一个对象应该对其他对象保持最少的了解。因为类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大,所以这也是我们提倡的软件编程的总的原则:低耦合,高内聚。一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。