一、单一职责原则
单一职责的定义是:就一个类而言,应该仅有一个引起它变化的原因。简单来说,一个类中应该是一组相关性很高的函数、数据的封装。
单一职责的划分界限并不总是那么清晰,很多时候需要依靠个人经验来界定。而最大的问题是对职责的定义,什么是类的职责,以及怎么划分类的职责。
虽然单一职责的划分比较模糊,但是它也有一些基本的指导原则,例如,两个完全不一样的功能就不应该放在一个类中,一个类应该是一组相关性很高的函数、数据的封装。
二、开闭原则
开闭原则的定义是:软件中的对象(类、模块函数等)应该对于扩展是开放的,但是,对于修改是封闭的。遵循开闭原则最重要的手段是通过抽象。
在开发过程中,对原有代码进行修改,可能会引入新问题。因此,当软件需要变化时,我们应该尽量通过扩展的方式来实现变化,而不是通过修改已有的代码来实现。
当然,只通过继承来实现升级维护是理想化的,在实际工作中,修改原有代码、扩展代码往往是同时存在的。
三、里氏替换原则
里氏替换原则的定义是:所有引用基类的地方必须能透明地使用子类的对象。反过来却不行,有子类出现的地方,父类未必能适应。
里氏替换原则的核心原理是抽象,抽象又依赖于继承这个特性。继承的优缺点相当明显,优点有以下几点: 1、代码重用,减少创建类的成本,每个子类都拥有父类的方法和属性; 2、子类与父类基本相似,但又与父类有所区别; 3、提高代码的可扩展性; 继承的缺点: 1、继承是侵入性的,只要继承就必须拥有父类的所有属性和方法; 2、可能造成子类代码冗余、灵活性降低,因为子类必须拥有父类的属性和方法。
开闭原则和里氏替换原则往往是生死相依、不离不弃的,通过里氏替换来达到对扩展开放,对修改关闭的效果。然而,这两个原则都同时强调了一个OOP的重要特性——抽象,因此,在开发过程中运用抽象是走向代码优化的重要一步。