问题标签 [clean-architecture]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
951 浏览

java - 清洁架构、数据请求协调器、演示者或用例/交互器?

谁应该从 ui中编排/映射数据?例如,登录,我有username并且password

1.) 我应该在我的演示者上接受LoginParamas参数,然后从 UI,创建LoginParam对象然后提供它吗?或者

2.) 只接受username然后passwordpresenter创建LoginParam要传递的use case?或者

3.) 最后,将usernameand passwordfrom传递presenterusecase然后会为 API 调用usecase创建对象吗?LoginParam

然后在用例上:

如果是这样,那为什么?(请说明你的答案,并指出错误的解决方案会出现的问题)

从我读过的东西来看,我没有找到任何关于我的问题的具体答案。(或者也许我错过了/不明白一些事情,哈哈)

0 投票
1 回答
587 浏览

android - 如何在 gradle 中为 Clean 架构设置项目?

所以我在 android 中经历了干净的架构,真的很喜欢人们甚至为域、数据和表示层创建单独的项目。我尝试为干净的架构创建自己的项目,但无法为域、数据和表示层设置不同的项目。

我怎样才能完成这种项目架构? https://github.com/android10/Android-CleanArchitecture

0 投票
1 回答
26 浏览

android - 在哪里添加全局所需数据(通过 API 传递)?

清洁架构问题

我有许多表单activities,其中包含 1 个必须在提交期间附加的公共数据,我的问题是,逻辑必须放在哪里?

域还是表示层?

演示文稿:

我将创建一个BaseFormActivity具有将所需数据插入到其form子级的方法的方法,该子级BaseForm包含全局所需的数据。

BaseForm:(被所有形式扩展)

BaseFormPresenter:

BaseFormActivity:(由处理表单的所有活动扩展)

SpecificFormActivity:(扩展 BaseFormActivity)

对于域:

SubmitSpecificFormInteractor:(对不起编码,这只是我想做什么的表示)

我正在考虑将它放在域层上(您可以看到它非常孤立,但我必须在所有表单提交上都这样做,这是冗余),但我仍然只想让我的决定更加可靠重构是耗时的。希望您在这里理解我的观点,特别是关于我的类似伪代码的编码。如果有难以理解的内容,请随时发表评论。谢谢你。

0 投票
1 回答
64 浏览

swift - 何时进行 API 调用

我目前正在使用 VIP 架构,我想知道何时应该进行 API 调用。

例如,我有两种观点。指向列表视图的连接视图。该列表需要用户连接才能加载。

我的问题是,我应该在哪里进行 API 调用以获取第二个视图的数据?

  • 我是否应该在连接成功后立即发出请求,然后在获得此请求的数据后启动第二个视图。

或者

  • 我应该先启动第二个视图,然后再请求这个视图吗?

第一个解决方案似乎稍微快一些,但第二个解决方案感觉更干净。你怎么看 ?

0 投票
3 回答
5903 浏览

c# - 使用 C# 的清洁架构:在值对象中执行验证的更好设计

我正在创建一个应用程序,其架构基于鲍勃叔叔的清洁架构概念和DDD。请注意,它基于DDD,所以我给了自己与严格 DDD 不同的自由。

为了创建这个应用程序,我使用 C# 和 .Net Standard 2.0

DDD 的原则之一与值对象有关。根据Wikipedia ,值对象的定义如下:

值对象

包含属性但没有概念标识的对象。它们应该被视为不可变的。

示例:人们在交换名片时,一般不会区分每张唯一的名片;他们只关心印在卡片上的信息。在这种情况下,名片是价值对象

现在,如果某些验证不成功,我希望我的值对象不允许创建它们。当它发生时,实例化过程中会抛出异常。我真的打算在那里抛出一个异常,因为架构的核心确实不希望任何无效数据到达那个点。

在进一步讨论这个问题之前,为了给你们更多的背景知识,是我的架构(注意:仍然不完整):

我的清洁架构提案

我在这个架构中遵循的规则是:

  1. 一个层只能知道其最内层邻居层的接口
  2. 一个层不能知道任何最外层的任何信息
  3. 层之间的所有通信都必须通过接口完成
  4. 每一层都必须是可独立部署的
  5. 每一层都必须是可独立开发的

为了更好地理解此图中的箭头,我建议阅读 Stack Exchanges 的问题:

UML 箭头的解释

https://softwareengineering.stackexchange.com/questions/61376/aggregation-vs-composition

现在,我现在面临的挑战是找到一种使用验证器的好方法。在这一点上,我对我的架构并不满意。问题如下:

由于我可以在给定时间实例化数千个值对象,因此我不希望值对象的每个实例都有一个实例方法来执行验证。我希望验证方法是静态的,因为每个实例的逻辑都是相同的。此外,我希望架构的上层可以使用验证逻辑来​​执行验证,而无需尝试实例化值对象,从而导致抛出昂贵的异常。

问题是:C# DOES NOT ALLOW polymorphism with static methods,所以我不能做类似的事情:

如何在不依赖静态方法多态性的情况下实现此功能,同时又不浪费内存?

0 投票
2 回答
504 浏览

unit-testing - 测试在 Clean 架构中做不止一件事的交互器方法

我一直在阅读有关单元测试和清洁架构的内容,并尝试实现涉及这两件事的东西。

据我了解,Clean 架构的结构是为了对 Interactor 对象的方法进行单元测试。

但是当用例类似于“创建一个文件,其内容是从某种格式的某些数据中计算出来的”时,我会感到困惑,因为它不是单一的(文件内容的计算和文件的创建,两者都是用例中)

这是一些说明我的情况的伪代码:

我的问题如下:

  1. Interactor 中定义的方法必须是单一的吗?(如,只做一件事)
  2. 必须对 Interactor 中定义的方法进行单元测试吗?(我看到一个函数,无论是否单一,作为可测试单元,如果不正确,请纠正我)
  3. 哪个类必须在 Clean 架构中进行 fileContent 的计算?
0 投票
1 回答
651 浏览

ios - CleanSwift - 演示者可以直接调用路由器功能吗?

我正在研究 CleanSwift 架构。我在图中看到演示者和关联的场景路由器之间没有直接通信,

在此处输入图像描述

但通常在某些情况下,演示者只需要路由到另一个视图控制器。我想知道是否允许演示者直接调用路由器 routeToOtherView() 函数,而不是在视图控制器中调用一个额外的函数来简单地重定向。

0 投票
1 回答
421 浏览

android - 使用 DisposableObserver 测试 Presenter

我正在开发一个 Android 应用程序,试图遵循 Clean Architecture / MVP 指南。

我目前正在为我的演示者编写单元测试,但我坚持调用以 DisposableObserver 作为参数的 Interactor/UseCase。

我想测试的是,当交互器调用 OnNext 或 OnError 例如(隐藏/显示加载指示器...)时,会调用正确的行为。

我不知道如何在我的用例中“模拟” Observable 的行为,因为它是在调用 execute() 方法时使用受保护的方法构建的。

以下是部分代码:

主持人

交互者/用例

基本用例

0 投票
1 回答
980 浏览

android - 使用 Room 时如何解耦模型

作为序言,我对 Android 开发还很陌生,目前我正在尝试通过构建应用程序来学习,同时遵循 Clean Architecture。

我目前有一个名为“Card”的模型和用于存储所有“Card”数据的 Room 库。但是,我发现在我的应用程序中实现 Room 库的唯一方法是将“卡”模型指定为我的实体,该实体位于我的应用程序的域层中。据我了解,这违反了层的解耦,因为域层应该独立于框架。

我尝试将模型子类化为装饰器,但无法让注释在子类上工作。有没有更好的方法,这是我应该关注的吗?

另外我不确定您需要多少信息来回答我的问题,但如果您需要更多信息,请告诉我!谢谢!

0 投票
2 回答
286 浏览

architecture - 难以理解干净的架构

我对干净架构的架构概念比较陌生。不幸的是,我有一些理解问题:

我理解这个概念,你应该遵循规则,没有内层可以知道外层的任何信息,你只能通过边界接口调用外层。

现在让我们做一个简单的思想实验,其中用户输入持久存储的数据:您有一个 UI(Webform、Console 等)并且用户输入数据。在一个事件(例如提交)之后,控制器调用一个用例(比如“PersistentStoreData”),我们向下工作到实体级别。我有点理解这一点。但是假设我们要将数据存储到数据库中。解耦规则说,内层的任何实体、用例或任何东西都不能知道外层的任何信息。只能通过接口进行调用。但是有一次必须有一个实例化的对象,它具有处理数据库请求的业务逻辑,并且您肯定不能实例化接口。哪个组件实例化了这个“数据库对象”?由于依赖规则,不是内层。唯一的其他组件是 UI,但这对我来说毫无意义。为什么 UI 应该知道有关数据库的任何信息?

也许是一个愚蠢的问题,但我无法理解这个问题。