单一责任/职责原则(SRP):“一个模块应该只承担一个责任”。
示例:客户Customer类。
- generateInvoice:计算客户必须支付的金额。
- computeDiscount:为客户返回%折扣。
- save:将客户存储在数据库中。
- toString:将客户作为字符串返回,以便可以将其添加到报表中
这个类有多少职责?为了找出答案,我们应该问自己:
- 每种方法的受众是谁?
- 谁可能要求更改这些方法的系统用户(参与者)?
分析结果如下,有三种方向的职责:
- 业务专家或高管(定义业务规则)可以更改发票/折扣的计算方式。
- 建筑师(定义数据库)可能会更改数据库架构,从而影响“save”。
- 职员(与客户打交道)可能想要更改报告,从而影响“ toString”。
多种职责混合在一起的潜在问题:想一下,高管们改变了关于发票和折扣的政策。开发人员将不得不更改Customer类。如果他们引入了错误,那么架构师和文员(不要求更改)可能会受到影响。
一个问题:想一下,职员和架构师都要求更改。一个开发人员可以被分配执行职员更改的任务。另一位开发人员可能会处理架构师的更改。两者将在同一个模块上工作,互相踩脚趾。
总结:
- 单一责任就是仅为一名参与者提供服务的代码。
- 一个参与者代表着单一的变化源。
- 改变的原因之一就代表一项职责或责任。
单一职责的发现与分析思维有关:
你是整体思维还是分析思维?