HeaiKun Learnning

敏捷设计


前言

软件在开发的过程中,需求并不是一层不变的。我们开发软件目的就是满足客户的使用需求,但是客户的需求会随着场景的变化而变化,而且是随时都有可能变化。

对应而来的问题就是我们的软件在应对这样频繁的变化的过程中,会被不断的根据需求进行修改,不好的设计会在修改的过程中,代码会变得难以修改、难以使用、难以阅读。

其主要表现如下:

  1. 僵化性:很难对系统进行改动,每改动一点,都需要对系统的其他地方也要修改。
  2. 脆弱性:对系统的一点修改有可能会导致其他系统出现问题。
  3. 牢固性:很难解开系统的纠结,是之成为其他系统中重用的组件。
  4. 粘滞性:做正确的事情比做错误的事情要困难。
  5. 不必要的复杂性:系统中包含不具有任何直接好处的基础结构。
  6. 不必要的重复:系统中包含重复的结构,而该重复的结构不能使用单一的抽象进行统一。
  7. 晦涩性:很难阅读、理解,没有很好的表现出意图。

要想避免这些问题,我们设计代码的时候要遵循一些原则。

单一职责原则(SRP)

就一个类而言,应该仅有一个引起它变化的原因。

在SRP中,我们把职责定义为“变化的原因”。如果你能想到多于一个的动机去改变一个类,那么这个类就具有多于一个职责。我们要做的就是分离耦合的职责。

SRP是所有原则里面最简单的一种,但也是最难正确运用的一种。应为我们会自然而然的将职责结合在一起。软件设计真正要做的许多内容就是发现这些职责,并将这些职责相互分离。

开放-封闭原则(OCP)

软件实体应该是可以扩展的,但是不可修改的。

如果程序中的一处改动就会产生连锁反应,导致一系列相关模块的改动,那么设计就具有僵化的臭味。OCP原则建议我们要重构,以后对系统进行修改的时候,不会导致更多的修改。

遵循 开放-封闭原则的模块具有两个特征:

  1. “对扩展是开放的”,模块是可以扩展的,也就是我们可以增加模块的新功能来满足新的需求。
  2. “对更改是封闭的”,对于模块进行扩展的时候,不能对源代码进行修改,无论是链接库还是二进制可执行文件,都不能修改。

要满足上诉的两点,就必须使用面向对象编程中的抽象体。使用基类派生出的子类进行对具体行为的描述。如果要添加新的需求,只需要再添加一个派生类来具体描述新需求的具体行为即可。

OCP是面向对象设计的核心,这个原则体现出了面向对象技术的巨大好处:灵活性,可重用性及可维护性。要注意的是不能对程序中的每一部分都进行抽象,开发人员只需要对程序中频繁变化的那些部分进行抽象即可。