SOLID软件设计原则之LSP与DIP

SOLID软件设计原则之SRP

SOLID软件设计原则之OCP原则

人们常常高估了一天能做的事情,却低估了一年能得到的成就。时间倏忽而过,转眼五一小长假只剩下最后一天,放假前列出的清单还有两三件没有完成,无论如何,依然按照计划在最后一天看看书,梳理一下思路,准备迎接5月的紧张工作。

软件设计五大原则之前简单整理了两个:单一指责原则(SRP)和开放/封闭原则(OCP),文章链接见本文开头。今天剩一点时间,把里氏替换原则(LSP)和依赖倒转原则(DIP)也略作整理。

1. 里氏替换原则(LSP)

里氏替换原则(Liskov Substitution Principle, LSP)是Barbara Liskov女士于1988年提出,描述如下:

“一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。”

简而言之,LSP原则就是:子类型必须能够替换掉它们的父类型。

LSP原则使得继承复用成为可能。只有子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,子类也可以在父类的基础上增加新的行为。有了里氏替换原则,才使得开放-封闭原则成为可能,这是因为,子类型的可替换性使得使用父类型的模块在无需修改的情况下就可以得到扩展。例如动物作为父类,有吃喝跑叫等行为,那么猫和狗作为其子类都可以替换掉父类。当我们需要“抓老鼠”这一行为时,用“猫类”替换掉“动物类”,使得“动物”这个父类得到行为上的扩展;而当我们需要“看家”这一属性时,则可用“狗类”替换掉“动物类”。

2. 依赖倒转原则(DIP)

依赖倒转原则(Dependence Inversion Principle, DIP)又称为依赖倒置原则。包含两层意思:

(1) 高层模块不应该依赖低层模块,两者都应该依赖于抽象。

(2) 抽象不应该依赖细节,细节应该依赖抽象。

也就是在要针对接口编程,而不是对实现编程。

在面向过程的开发时,为了使得常用的代码可以得到复用,通常会把这些代码封装成函数库,并提供给各个应用程序访问,比如对访问数据库的封装,这个时候存在高层依赖低层的逻辑。而如果在开发新项目时,高层逻辑是一样的,但低层实现不同,比如使用不同的数据库或者计算函数库,但如果此时高层模块是针对实现的编程,高层和低层耦合在一起,就很难实现高层模块的复用,这一定是非常糟糕的。而如果在软件设计时,无论高层和低层,都依赖于抽象,也就是针对接口或抽象类编程,那么只要接口稳定,任何一处更改都不会影响其他功能,这就使得高层模块和低层模块都能很容易被复用。当然,要达到这一点,就离不开上面讲的里氏替换原则了。

SOLID软件设计原则之LSP与DIP_第1张图片

依赖倒转原则可以说是面向对象的标志,与用哪种编程语言来写程序几乎无关,如果编程时考虑的是如何针对抽象编程,而不是针对细节编程,即程序中所有的依赖关系都终止于抽象类或者接口,就认为是面向对象的设计,不满足该条件,基本就是面向过程的设计了。

你可能感兴趣的:(设计模式)