干净的体系结构-用例类太多


15

我将进入Clean Architecture,将Android的级别从MVC提升到MVP,使用Dagger 2引入DI,使用RxJava 2引入反应性,当然还使用Java 8。

MVP干净架构中,实体(在数据存储区中)应访问它们的演示者之间存在一层。该层是“用例”。用例最好是一个接口,它对一个实体执行一个操作。

我还知道,Clear Architecture 是“尖叫中的 ”,就其项目而言,由于它们中的类很多,因此其可读性很高。

现在,在我的项目中,我有大约6个不同的实体,当然,每个实体存储库都有至少4种方法(通常是get,add,delete,update)来访问它们。. 因此,6 * 4 = 24

如果我到目前为止对Clean Architecture的了解,我将有24个UseCase。

如果与MVC中的6个控制器相比,这是很多类

我真的需要制作24个用例吗?

我真的很感谢有人成功使用它所做的澄清。

谢谢,杰克


1
您可以在示例代码的详细描述这些用例的页面上发布链接吗?
罗伯特·哈维

我已经用Google搜索了很多,但是主要是:这个应用程序示例和相关文章:github.com/jshvarts/OfflineSampleApp ; 本文:proandroiddev.com/…proandroiddev.com/…;演讲内容:youtube.com/watch?v=TvsOsgd0--c&feature=youtu.be ; 而这也是文章:adityaladwa.wordpress.com/2016/10/25/...
成龙Degl'Innocenti

1
您引用的示例应用程序或文章似乎都与“干净架构”没有任何关系。但是,他们确实谈论了很多有关反应式编程的知识。
罗伯特·哈维

该示例应用程序肯定是使用Clean Architecture范式制作的。其他文章大部分..您希望看到@RobertHarvey吗?
Jackie Degl'Innocenti

请在下面阅读我的答案并回复。
罗伯特·哈维

Answers:


24

我真的需要制作24个用例吗?

仅当您编写的所有内容都是CRUD时

请参考下图:

在此处输入图片说明

您的断言是,您将有六个不同的实体,并且每个实体有4个方法(创建,读取,更新和删除)。但这仅在图中间的黄色圆圈(实体层)中正确。在用例层中创建24个仅通过CRUD调用传递给实体层的方法是没有意义的。

用例不是“添加客户记录”。用例更像是“向客户出售项目”(涉及客户,产品和库存实体)或“打印发票”(涉及相同实体,除了发票标题和发票行项目) )。

创建用例时,您应该考虑的是业务交易,而不是CRUD方法。

扩展阅读
汇总-域对象的群集,可以将其视为一个单元


2
您花太多时间在思考模式,实践和体系结构,而没有足够的时间在思考基本软件设计。正如我在答复中所述,您所需要的只是体现业务实践的方法。
罗伯特·哈维

1
这不是选择架构的问题。我个人的观点:裸露的CRUD操作应该直接与实体层对话。当然,这可能违反了Clean Architecture。
罗伯特·哈维

1
您有点漏了点。架构只是组织代码的一种手段。您可以通过编写代码来解决问题而不用为体系结构费力。
罗伯特·哈维

1
嘿罗伯特,你以为我不写代码并不是很好。我回答的主题是关于体系结构,而不是SO。真诚的,我发现您的最后评论确实令人误解和充耳不闻。问题是有关Clean Arch。中的UseCase,而不是编写代码。如果您想传达一些信息,请更好地解释,因为我错过了您的评论要点。恕我直言,在开发软件时无法避免考虑架构问题,或者至少,好的开发人员不只是编写代码。此外,我在评论中问了一个非常具体的问题,您能回答吗?谢谢
Jackie Degl'Innocenti '17

2
您提出的问题的解决方案(首先是离线应用)与Clean Architecture并没有多大关系。您不会在Clean Architecture图中找到解决该问题的解决方案。
罗伯特·哈维

2

如果在一个UseCase中翻译了每个CRUD操作,那是对的。但是UseCase也可能包含多个CRUD操作。

UseCase是一个分离的模型,它收集来自不同数据源的信息并准备与数据接收器的通信。可能涉及多个CRUD操作。

因此,请考虑用例,其中为客户创建发票并还创建客户本身,因为他/她在系统中不存在。您有一个UseCase,它在一个事务中导致至少两个Create-Operations。


那么,对于具有许多实体的CRUD示例,您会建议采用哪种模式?
Jackie Degl'Innocenti

我对此的个人看法是:只要没有违反SRP(单一责任原则),我就有很多课程。但是我大多数时候都会将用例“创建一个实体”,“更新一个实体”,“删除一个实体”和“更新一个实体”重新定义为简单的“类型为X的管理实体”。通常,您提供一个UI来管理一个实体。但这正是UseCase应该定义的:处理业务的有益工作的方式。
oopexpert

好的,因此拥有一个管理各种不同操作的用例似乎并没有违反SRP,因为它似乎只是在同一UseCase中“聚合”更多不同的方法(和流程),而没有任何一个流程处理一个以上的响应性。 ..但是以此方式我们不只是创建一个控制器来代替UseCase吗?..想法..也许必须将用例简单地视为一个层,并且该层只需要尊重SRP,但也可以实现许多方法。我想知道关于此的消息来源或文章
Jackie Degl'Innocenti

1
用例IS是控制器。唯一的区别是,用例来自业务角度,而控制器则是其上的技术视图。用例的重点是产生业务价值的要素。因此,用例是业务价值驱动的控制器实现。
oopexpert

1
同意,HTTP控制器是一种管理I / O的方式,也可以有控制台命令,事件响应等。所有这些I / O通道都调用相同的用例。用例是业务逻辑的控制器,它不知道调用它的I / O通道,但知道如何编排域实体来完成此工作。
德米特里·列

1

您对用例的定义是错误的,用例是一个实现业务规则的类,它不需要是CRUD操作,它可以是复杂的多步操作


当您实际上需要实施各种各样的类似于Crud的操作时,您的句子并不意味着一种解决方案,即使您的考虑也可能与以下事实有关:用例应遵循一种我们可以访问复杂操作的模式,甚至多步。
Jackie Degl'Innocenti
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.