单一职责原则是六大面向对象原则的第一条。也是最不容易理解的一条,真正理解单一职责原则可能需要一定的编码或业务分析经验。
但,对于初学者来说,也并非无迹可寻。
首先单一职责,指的是类的职责。那么我们就可以明白是这条原则是创建类时所遵守的原则。所以我们思考单一职责的时候一定要脱离语言自带的类库、框架和第三方类库所提供的类(这些类已经被赋予职责了)。
还是创建类
回顾以前,我认为创建类是根据对象找出其的属性和方法。类中也可能关联其它的类(以全局变量或者局部变量存在)。
我们为什么会知道类中包含其它类呢?
通过 物的 整体和部分的关系来区分职责
这里将的整体是指事物存在的整体是由部分组成的,如电脑中的各种配件,公司的组织结构。我们会本能的将这些已经形成结构的对象分类。因为在现实存在的对象当中已经能很好的区分出对象的职责了。
要注意是还要使用关注点分离的技巧,来设定我们关注物的最小粒度,不要过度拆分。
通过 事的 过程中的控制关系来区分职责
拿洗衣服这件事来说:参与的对象有人、洗衣机、甩干机、烘干机、衣物。洗衣服这件事是一个目标导向的过程,目的是洗干净衣服。那么就会有衣物→洗衣机→甩干机→烘干机 这样的过程。
过程中的节点就是职责,完成这个职责的对象就是我们要抽象出的类。
通过 事的 记录组成关系来区分职责
拿单据这件事来说。单据是一个过程的记录(最终会走向一个过程的结果)。这个记录中有什么样的信息组成。这些信息对象就是我们要抽象出的类。
例如:采购入库单。有货品信息(包含采购单价、数量、金额)、供应商信息、负责人信息、时间信息。
物会变事也会变
软件并非一成不变的。当需求变更时,原来的事物就并非我们所定义的事物了。所以到那个时候我们就要重构使之符合单一职责的设计原则。