最近我一直在研究软件架构的一些想法。我所看到的是,他们中的很多人都将用例/交互器(干净架构)或应用服务(DDD)作为我们应用程序的切入点。在交互器/使用案例/应用服务中违反德米特法律
我真的很喜欢这个想法,但有些事情一直困扰着我。
用户注入存储库的两种方式,您用它来获取域实体并对其执行操作。就像这样:
class Interactor
def initialize(repository)
@repository = repository
end
def call(entity_id)
entity = @repository.find(entity_id)
entity.do_something
end
end
如果我想在隔离测试这一点,我需要从@repository.find
返回模拟,这已经是一个模拟。这不好,并告诉我,我违反了德米特法(这是案件)。
此外,这是过程性,这困扰我。
有没有更好的方法来做到这一点?
我想补充一点,从目前的例子中你已经显示,你只是违反[单一责任原则](https://en.wikipedia.org/wiki/Single_responsibility_principle)通过让这个类做多个事情。我也会借此机会将这个类重写为Query,并且有一个可以调用'do_something()'函数的其他命令,所以您遵守[Command-Query Separation](https:// en .wikipedia.org/wiki/ Command%E2%80%93query_separation)模式和两个SRP。后来你可以将其他装饰器组合成这个实现.. – kayess
..但它实际上只是在黑暗中拍摄而没有看到更多细节。 – kayess
我读过一次,这并不违反SRP,因为此类更改的原因只是业务规则的更改。我其实同意这一点。我故意留下了足够的例子摘要,因为这发生了很多次。 – Thiago