Oop 干净的体系结构:为什么不使用实体作为用例(interactor)的请求模型
我已经阅读了PPP书籍和干净的代码,编码器和架构书籍 我知道:Oop 干净的体系结构:为什么不使用实体作为用例(interactor)的请求模型,oop,web-applications,architecture,clean-architecture,Oop,Web Applications,Architecture,Clean Architecture,我已经阅读了PPP书籍和干净的代码,编码器和架构书籍 我知道: 清洁体系结构是一种分层体系结构 开放式分层体系结构和封闭式分层体系结构是什么样的 清洁体系结构书籍建议,每一层都可以访问它的内层,而不仅仅是下一层 因此,我假设clean架构不强制进行紧密分层,它允许进行开放分层,这意味着,例如,框架层中的UI可以直接访问实体,中途跳过两层 我理解,如果干净的体系结构被强制进行紧密分层,我们不能直接从框架层实现存储库接口,我们应该在下一层实现它,而下一层应该在下一层实现它,等等 现在我的问题是,
- 清洁体系结构是一种分层体系结构
- 开放式分层体系结构和封闭式分层体系结构是什么样的
- 清洁体系结构书籍建议,每一层都可以访问它的内层,而不仅仅是下一层
实体
,因为没有违反访问规则
考虑这个例子,假设我们有:
JobView
JobController
JobUseCase(RequestModel):ResponseModel
JobEntity
JobView
想要调用JobController
,它应该传递RequestModel
。现在我们可以简单地介绍一下JobEntity
作为RequestModel
,如下所示:
JobView
JobController
JobUseCase(JobEntity)
JobEntity
我知道这样做会增加代码的脆弱性,因为如果我们改变
JobEntity
,那么JobView
就必须改变。但干净的建筑是否会迫使坚实的原则变得脆弱或僵化 我不太明白你问题背后的原因:
干净的建筑是强制执行坚实的原则,还是不脆弱或僵化
清洁的建筑怎么可能迫使僵化和脆弱?定义架构的全部内容是:如何广泛关注基本的OOP原则,如SOLID和其他
另一方面,以下示例肯定会改变Clean体系结构:
作业视图
作业控制器
作业用例(作业实体)
作业实体
这隐式地告诉我们,您很可能从控制器中检索到了实体,这完全忽略了交互程序(或用例)以及干净体系结构的要点
交互者封装应用程序业务规则,例如通过实体网关完成的与实体的交互和实体上的CRUD,而实体网关又封装了基础架构层
此外,在干净的体系结构上下文中,作为模型层一部分的实体应该与作为交付机制一部分的控制器无关,或者更准确地说,与作为HTTP请求消息求值器的控制器无关。以这种方式变性作为控制器的较低级别组件将对SRP(=>脆弱性增加)和组件之间的解耦程度(=>刚性增加)产生负面影响
你说:
我理解,如果干净的体系结构被强制进行紧密分层,我们不能直接从框架层实现存储库接口,我们应该在下一层实现它,而下一层应该在下一层实现它,等等
您的实体框架的RepositoryInterface
及其实现属于基础架构层,应该由实体网关进行包装和调整。在这里,当我们讨论业务模型的封闭层端口(EntityGatewayInterface
)的实现时,尊重这一点可能很重要
最后,出于上述原因,我怀疑以下假设是错误的,基于该假设的所有进一步假设也是错误的,从而导致您完全困惑:
因此,我假设clean架构不强制进行紧密分层,它允许进行开放分层,这意味着,例如,框架层中的UI可以直接访问实体,中途跳过两层
但无论是否强制封闭分层,Clean架构都明确具体地定义了自身(组件之间的关系),如下面的UML类图所示:
从该图中,我只能看到一个紧密分层的架构
在我看来,一个开放层是一个oxymore,它并不约束一个层本质上应该约束的东西,因为根据定义,一个层是一个隔离,一组简化到其端口的组件的抽象,旨在减少技术债务,如脆弱性等
额外资源
- Bob叔叔召开的会议恢复得很好为什么以及如何实施清洁体系结构:
为什么不使用实体作为用例的请求模型?
您自己已经回答了这个问题:即使您没有违反依赖性规则,它也会增加代码的脆弱性
为什么我们不能直接将实体作为USECASE或控制器的参数类型,以及为什么我们必须在中间层和BO中定义数据结构或DTOs