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

gra*_*hez 10 java domain-driven-design single-responsibility-principle anemic-domain-model

目前正在对从另一个团队接管的内容进行一些代码审查,并对应用SRP及其与贫血或富域模型(由Martin Fowler定义)的关系存在疑问.丰富的域模型概念是拥有智能对象,不仅可以设置/获取其属性,还可以执行更复杂的业务逻辑.我喜欢它如何融入SRP?

假设我的模型类有一些属性可以暴露这些道具并提供一些简单的计算.下一个要求是有可能将此对象数据存储在一些不受我控制的存储对象中,如下所示:

class MyObject {
    // get set
    // parse sth

}
Run Code Online (Sandbox Code Playgroud)

存储方法存储

   storage.store(key, object);
Run Code Online (Sandbox Code Playgroud)

如果MyObject具有这样的存储方法,它是否违反了SRP

public void store(Storage storage) {
    storage.store('keyOne', fieldOne);
    storage.store('keyTwo', fieldTwo);
}
Run Code Online (Sandbox Code Playgroud)

从这个对象的pov来看,能够存储其状态是一个很好的想法.其他方式可能是在这里介绍一种服务,并这样做:

public StorageService {
    private Storage;
    // constructor here
    ....
    public void store(MyObject myobj);
}
Run Code Online (Sandbox Code Playgroud)

你能指点一下我能读到的关于这个问题的链接吗?我在这里找到了一个关于SO的帖子,但它并没有完全回答我的问题.

如何在DDD中解决?根据定义,DDD中的模型很丰富,可以看作有太多的责任.

Gar*_*all 7

富域模型(RDM)意味着管理模型行为逻辑属于模型,而不是像使用getter/setter一样处理模型.但这并不意味着一切,包括持久性,安全性,如何显示在GUI中模型等需要在模型中.

RDM和SRP齐头并进,它们不会相互冲突.

违反SRP/RDM:

Car {
   // possibly violates SRP
   storeInDatabase();  
   // smells like anemic domain model
   getEngineState();   
}
Run Code Online (Sandbox Code Playgroud)

遵循SRP/RDM:

// usings aspects to remove cross-cutting concerns from the model and follow SRP
@DatabaseSerializable 
Car {
   // rich domain model encapsulates engine state and exposes behavior
   drive();            
}
Run Code Online (Sandbox Code Playgroud)