Tag: srp

理解单一责任原则

我很困惑如何确定单个方法是否有一个责任,就像清洁代码一书中的以下代码一样 public Money calculatePay(Employee e) throws InvalidEmployeeType { switch (e.type) { case COMMISSIONED: return calculateCommissionedPay(e); case HOURLY: return calculateHourlyPay(e); case SALARIED: return calculateSalariedPay(e); default: throw new InvalidEmployeeType(e.type); } } 正如作者在这段代码中所说:“…… 显然不止一件事。第三,它违反了单一责任原则(SRP),因为改变它的原因不止一个。 ” 乍一看我的代码我在想这个方法如何违反SRP,因为如果代码发生了变化,那么只有当有一个添加的员工类型但是我试图理解方法时才会成为switch语句我进一步想出了为什么它违反了上述原则。 我的假设是,由于方法的名称是calculatePay(Employee e) ,因此该方法的唯一责任是支付计算,因为方法的名称建议但是因为在方法内部有一个filter过滤Employee的类型这个过滤现在是一个不同的或另一个责任,因此违反了SRP。 我不知道我是否做对了。

单一责任原则如何与贫富/富域模型相关联?

目前正在对从另一个团队接管的内容进行一些代码审查,并对使用SRP及其与贫血或富域模型(由Martin Fowler定义)的关系存在疑问。 丰富的域模型概念是拥有智能对象,不仅可以设置/获取其属性,还可以执行更复杂的业务逻辑。 我喜欢它如何融入SRP? 假设我的模型类有一些属性可以暴露这些道具并提供一些简单的计算。 下一个要求是有可能将此对象数据存储在一些不受我控制的存储对象中,如下所示: class MyObject { // get set // parse sth } 存储方法存储 storage.store(key, object); 如果MyObject具有这样的存储方法,它是否违反了SRP public void store(Storage storage) { storage.store(‘keyOne’, fieldOne); storage.store(‘keyTwo’, fieldTwo); } 从这个对象的pov来看,能够存储其状态是一个很好的想法。 其他方式可能是在这里介绍一种服务,并这样做: public StorageService { private Storage; // constructor here …. public void store(MyObject myobj); } 你能指点一下我能读到的关于这个问题的链接吗? 我在这里找到了一个关于SO的post,但它没有完全回答我的问题。 如何在DDD中解决? 根据定义,DDD中的模型很丰富,可以看作具有太多责任。