单一责任SRP设计举例 - macerub


单一责任/职责原则(SRP):“一个模块应该只承担一个责任”。
 
示例:客户Customer类。

  • generateInvoice:计算客户必须支付的金额。
  •  computeDiscount:为客户返回%折扣。
  •  save:将客户存储在数据库中。
  •  toString:将客户作为字符串返回,以便可以将其添加到报表中


这个类有多少职责?为了找出答案,我们应该问自己:

  • 每种方法的受众是谁?
  • 谁可能要求更改这些方法的系统用户(参与者)?

分析结果如下,有三种方向的职责:
  1. 业务专家或高管(定义业务规则)可以更改发票/折扣的计算方式。
  2. 建筑师(定义数据库)可能会更改数据库架构,从而影响“save”。
  3. 职员(与客户打交道)可能想要更改报告,从而影响“ toString”。


多种职责混合在一起的潜在问题:想一下,高管们改变了关于发票和折扣的政策。开发人员将不得不更改Customer类。如果他们引入了错误,那么架构师和文员(不要求更改)可能会受到影响。
一个问题:想一下,职员和架构师都要求更改。一个开发人员可以被分配执行职员更改的任务。另一位开发人员可能会处理架构师的更改。两者将在同一个模块上工作,互相踩脚趾。
 
总结
  • 单一责任就是仅为一名参与者提供服务的代码。
  • 一个参与者代表着单一的变化源。
  • 改变的原因之一就代表一项职责或责任。

单一职责的发现与分析思维有关:
你是整体思维还是分析思维?