软件在开发的过程中,需求并不是一层不变的。我们开发软件目的就是满足客户的使用需求,但是客户的需求会随着场景的变化而变化,而且是随时都有可能变化。
对应而来的问题就是我们的软件在应对这样频繁的变化的过程中,会被不断的根据需求进行修改,不好的设计会在修改的过程中,代码会变得难以修改、难以使用、难以阅读。
其主要表现如下:
要想避免这些问题,我们设计代码的时候要遵循一些原则。
就一个类而言,应该仅有一个引起它变化的原因。
在SRP中,我们把职责定义为“变化的原因”。如果你能想到多于一个的动机去改变一个类,那么这个类就具有多于一个职责。我们要做的就是分离耦合的职责。
SRP是所有原则里面最简单的一种,但也是最难正确运用的一种。应为我们会自然而然的将职责结合在一起。软件设计真正要做的许多内容就是发现这些职责,并将这些职责相互分离。
软件实体应该是可以扩展的,但是不可修改的。
如果程序中的一处改动就会产生连锁反应,导致一系列相关模块的改动,那么设计就具有僵化的臭味。OCP原则建议我们要重构,以后对系统进行修改的时候,不会导致更多的修改。
遵循 开放-封闭原则的模块具有两个特征:
要满足上诉的两点,就必须使用面向对象编程中的抽象体。使用基类派生出的子类进行对具体行为的描述。如果要添加新的需求,只需要再添加一个派生类来具体描述新需求的具体行为即可。
OCP是面向对象设计的核心,这个原则体现出了面向对象技术的巨大好处:灵活性,可重用性及可维护性。要注意的是不能对程序中的每一部分都进行抽象,开发人员只需要对程序中频繁变化的那些部分进行抽象即可。