> For the complete documentation index, see [llms.txt](https://haoqinn.gitbook.io/handbook-of-design-pattern/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://haoqinn.gitbook.io/handbook-of-design-pattern/she-ji-mo-shi-yuan-ze/dan-yi-zhi-ze-yuan-ze.md).

# 单一职责原则

单一职原则 SRP「Single responsibility principle」：就一个类而言，应该仅有一个引起它变化的原因。修改代码总是一件危险的事情，特别是当两个职责耦合在一起的时候，一个职责发生变化可能会影响到其他职责的实现，造成意想不到的破坏。因此一个对象（方法）只做一件事情

## 何时应该分离职责

要明确的是，并不是所有的职责都应该一一分离

一方面，如果随着需求的变化，有两个职责总是同时变化，那就不必分离他们。比如在 ajax 请求的时候，创建 xhr 对象和发送 xhr 请求几乎总是在一起的，那么创建 xhr 对象的职责和发送 xhr 请求的职责就没有必要分开

另一方面，职责的变化轴线仅当它们确定会发生变化时才具有意义，即使两个职责已经被耦 合在一起，但它们还没有发生改变的征兆，那么也许没有必要主动分离它们，在代码需要重构的 时候再进行分离也不迟

## 优缺点

### 优点

降低了单个类或者对象的复杂度，按照职责把对象分解成更小的粒度，这有助于代码的复用，也有利于进行单元测试。当一个职责需要变更的时候，不会影响到其他的职责

### 缺点

明显的增加编写代码的复杂度。当我们按照职责把对象分解成更小的粒度后，实际上也增大了这些对象之间相互联系的难度。

jQuery 的 attr 是个非常庞大的方法，既负责赋值又负责取值，这对于 JQuery 的维护者来说，会带来一些困难，但对于 jQuery 的用户来说，却简化了用户的使用
