问题标签 [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 回答
36 浏览

android - 如何通过复选框知道在 recyclerview 中选择了哪些项目?

我有一个与此相关的问题recyclerview,我想知道如何识别从recyclerview每个项目都有一个复选框的项目中选择了哪个元素。

我正在使用干净的架构,我的一个布局有一个微调器,我可以在其中选择一个城市,然后我发出一个http帖子请求,响应是这个城市的所有办公室。我把所有这些办公室都插入到我的布局中,但所有这些项目都有一个复选框,我必须识别我选择了哪个办公室,我只能选择其中一个。

我如何识别选择了哪个项目以及如何强制用户只选择其中一个?

0 投票
4 回答
2589 浏览

architecture - 包含演示者或返回数据的用例?

考虑到清洁架构的定义,尤其是描述控制器、用例交互器和演示者之间关系的小流程图,我不确定我是否正确理解了“用例输出端口”应该是什么。

清洁架构,如端口/适配器架构,区分主端口(方法)和辅助端口(由适配器实现的接口)。按照通信流程,我希望“用例输入端口”是一个主要端口(因此,只是一个方法),而“用例输出端口”是一个要实现的接口,也许是一个构造函数参数,采用实际的适配器,以便交互者可以使用它。

做一个代码示例,这可能是控制器代码:

演示者界面:

最后,交互器本身:

上述图表本身似乎证实了这种解释,其中控制器和输入端口之间的关系由带有“尖”头的实心箭头表示(UML 为“关联”,意思是“有一个”,其中控制器“有”用例),而演示者和输出端口之间的关系由带有“白色”头部的实心箭头表示(UML 表示“继承”,不是“实现”,但可能就是这样反正意思)。

但是,我对这种方法的问题是用例必须处理演示本身。现在,我看到Presenter接口的目的是足够抽象以表示几种不同类型的演示者(GUI、Web、CLI 等),并且它实际上只是意味着“输出”,这是用例可能的含义很好,但我仍然对它并不完全有信心。

现在,在网上寻找干净架构的应用程序,我似乎只发现人们将输出端口解释为返回一些 DTO 的方法。这将是这样的:

这很有吸引力,因为我们正在将“调用”表示的责任从用例中移出,因此用例不再关心知道如何处理数据,而只是提供数据。此外,在这种情况下,我们仍然没有打破依赖规则,因为用例仍然不知道外层的任何信息。

但是,用例不再控制执行实际演示的时刻(这可能很有用,例如在那一刻做额外的事情,比如记录,或者在必要时完全中止它)。另外,请注意我们丢失了用例输入端口,因为现在控制器只使用getData()方法(这是我们的新输出端口)。此外,在我看来,我们在这里打破了“告诉,不问”的原则,因为我们要求交互者提供一些数据来处理它,而不是告诉它在第一名。

那么,这两种选择中的任何一种都是根据清洁架构对用例输出端口的“正确”解释吗?它们都可行吗?

对另一个问题的回答中,Robert Martin 准确地描述了交互者根据读取请求调用演示者的用例。没有提到MVC,MVVC等,所以我猜Clean Architecture一般不能很好地与MVC配合使用?

单击地图会导致调用 placePinController。它收集点击的位置和任何其他上下文数据,构造一个 placePinRequest 数据结构并将其传递给 PlacePinInteractor,后者检查 pin 的位置,在必要时对其进行验证,创建一个 Place 实体来记录 pin,构造一个 EditPlaceReponse对象并将其传递给 EditPlacePresenter,它会显示位置编辑器屏幕。

一种可能的解释是,传统上会进入控制器的应用程序逻辑在这里被移动到交互器,因为我们不希望任何应用程序逻辑泄漏到应用程序层之外。因此,这里的模型不是调用演示者,因为交互者不是模型,而是控制器的实际实现。模型只是被传递的数据结构。这似乎得到了证实:

该层中的软件是一组适配器,可将数据从最适合用例和实体的格式转换为最适合某些外部机构(如数据库或 Web)的格式。

从原始文章中,谈论接口适配器。由于控制器必须只是将一种数据格式转换为另一种数据格式的瘦适配器,因此它不能包含任何应用程序逻辑,因此将其移至交互器。

0 投票
2 回答
226 浏览

android - 如何尊重 Android 清洁架构

我刚刚阅读了应用架构指南。在本篇中,谷歌展示了使用新的 Android 架构组件构建健壮的 Android 应用程序的基本指南。正如 今年的 Google I/O所示,一个应用应该有 4 层:

在此处输入图像描述

依赖关系从上到下流动,更高层只知道它们正下方的组件,例如。UI Controller只知道ViewModelViewModel只知道Repository等。

所以我观看了视频,完成了相应的代码实验室,然后我研究了该指南,在粗略了解之后,我开始编写本指南中讨论的用例。

该指南的目的是实现一个应用程序,该应用程序只需从后端获取一个用户对象并将其显示给用户,所有这些都与干净的架构有关。

当我开始编写这个用例时,我的问题就出现了。整个应用程序都依赖于这个User Pojo。Repository 从后端获取它,然后使用Room将其持久化到 DataSource 中,并在LiveData的帮助下通知 ViewModel 和 UI。所以**我的数据模型的定义应该在哪一层——在这个用例中是User Pojo——**。或者每一层都应该有一个用户 Pojo,该用户 Pojo 将从来自较低层的用户 Pojo 映射?

0 投票
1 回答
2461 浏览

android - 使用 RxJava2 和 Retrofit2 时如何访问响应头?

前提

我正在开发一个简单的应用程序,我想在 RecyclerView 中列出用户的 GitHub 存储库。我在构建它时使用作为我的端点。

问题

我面临的问题是 GitHub API 一次只返回 30 个 repos。per_page=100要获得更多信息,我可以在查询字符串中附加一个(最大为 100);但是,对于拥有超过 100 个 repos 的用户,我们该怎么办?

API文档next;提供的解决方案是从“链接”响应标头中获取url 以进行第二次 API 调用。

怎么办?谢谢!

0 投票
1 回答
217 浏览

java - 结合模型或实体?

在分离关注点时,我有一个 SOLID 问题。在典型的三层架构(模型、视图、演示者)中,我们正在按照清洁架构方法(鲍勃叔叔)解决问题,模型/数据的组合方式是什么?这是一个典型的例子。表 Pencil 不保存是否已共享的信息,该信息存储在另一个表中 - 例如 PencilProperties。然后,当我创建域模型 - PencilModel - 设置依赖于此 PencilProperties 表的“isShared”字段的正确方法是什么?

我使用的存储库只是通过数据映射器类在 PencilDatabaseObject 和 PencilModel 之间映射数据。

另一个例子是,我们有两个对象:

此时我需要在 Plant 和 Tree 之间进行映射,以便 Tree 从 Plant 实体中获取属性?此时访问数据映射器中的数据库对于 SOLID 似乎是错误的。

提前致谢。

0 投票
1 回答
5613 浏览

android - 干净的架构。主持人的工作是什么?

我一直在阅读一些关于干净架构的文章,以及如何在 android 中实现它。我看到了显示其 Android 实现的示例应用程序。此外,我还进行了一次关于 Android 上的清洁架构的精彩演讲

所以,我有点理解大多数概念,但我想对某些事情进行一些澄清。

根据我的理解,

  • View 层是处理 UI 和框架相关内容的外层
  • 演示者是视图的直接通信者,它接受用户输入,并通过将其传递给用例层或交互器层来执行基于此的某些用例。
  • 交互者执行用例,将其返回给演示者发送的回调,
  • Presenter 再次将此结果转换为视图可理解的数据结构(ViewModel)并将其传递回视图。

我没有列出有关存储库等内层的更多详细信息,因为我的问题与上述步骤有关

在这里,presenter 的唯一工作是充当 UseCases 和 UI 之间的中介,作为数据调度员吗?

它是否只对视图模型进行用例模型转换,反之亦然?

输入验证逻辑依赖于哪一层?它可以在演示者内部吗?例如,如果我们采用一个注册过程的小用例,

一旦用户输入详细信息并单击注册按钮,数据发送给演示者,是不是像

  • 如果存在任何错误,Presenter 会验证输入值并通知视图
  • 如果值正确,则将其转换为用例模型,并执行某些用例,一旦交互器给出结果,再次转换为视图模型,将其发送到视图。

第二个问题是,谁控制导航?视图还是演示者还是用例?

谁决定下一步去哪里?

例如 - 考虑一个登录过程的用例,用户将在其中输入凭据并单击确定。

登录成功后,

  • 如果用户电子邮件未通过验证,请转到电子邮件验证屏幕
  • 如果用户配置文件未完成,请设置配置文件,然后仅转到主屏幕
  • 如果用户是新用户,则显示新优惠屏幕,否则直接转到主屏幕

那么,谁负责在接下来的屏幕上做出这些决定呢?是演示者,它相应地决定和导航视图吗?还是用例处理程序负责通知演示者下一个状态是什么?

对不起,问题太长了,但我只是想详细说明我目前的理解。提前致谢

0 投票
1 回答
546 浏览

android - Android Dagger 2 和干净的架构实现,范围错误

我试图弄清楚如何使用 dagger 2 处理依赖注入并在 Android 中使用干净的架构。我想要实现的是当我单击一个按钮时,一条消息将保存到 Firebase 数据库。并向用户显示成功消息。当我构建我的项目时,我收到了这个错误:

错误:(10, 1) 错误:com.example.mvpsample.home.HomeComponent(无作用域)可能不引用作用域绑定:@Provides @Singleton com.google.firebase.database.FirebaseDatabase com.example.mvpsample.data.DataModule。提供FirebaseDatabase()

这是我的应用程序类:


家活动


主页模块


主页组件


数据模块


基础合约


主持人


我遵循示例项目和教程,但不明白我在这里做错了什么。不是在寻找工作项目,但我想了解什么是最佳实践以及如何管理和使用模块和组件。

0 投票
2 回答
1501 浏览

android - 在带有 RxJava 的 android 上使用干净的 MVP:如何在仍然观察 UI 线程的同时让演示者不了解任何 android 知识?

为了使用 mvp 模式在 android 上实现“干净”架构,建议将 android 框架视为插件,并且不要将任何 android 感知依赖项泄漏到 Presenter 层。使用 rxjava,如果我有一个设计为将数据“推送”到视图层的演示器,我可能想要这样的逻辑:

但是,通过观察“AndroidSchedulers.mainThread()”,这会强制依赖:

在这一点上,我的演示者现在知道了 android 并与之绑定;我想避免。

处理此问题的建议方法是什么,以便保证将结果传递到 android 的 UI(主)线程上的 ViewLayer,而演示者不依赖于任何与 android 相关的东西?

0 投票
2 回答
9834 浏览

android - Bob大叔的干净架构方法——推荐的包结构是什么?

我想知道我是否以正确的方式使用干净的架构。我试图把它像这张图一样:

在此处输入图像描述

我读过包结构应该按用例排列,但我很难理解如何做到这一点。

先看一下我的包结构:

在此处输入图像描述 请注意,我不知道将活动真正放在 UI 文件夹中的哪个位置,您能推荐一下吗?有关系吗?

在数据文件夹中,我有用于存储库设计模式的存储库。 我的改造网络调用与 UI 文件夹处于同一级别。对于我的依赖注入框架也是如此。

阅读此出版物后,我开始担心我现在想知道我的包结构是否正确?

0 投票
1 回答
2308 浏览

java - 将数据模型映射到域模型的简单方法

我正在遵循Clean Architecture我们拥有 3 层 ( Presentation, Domain, Data) 的模式。

每个层都应该有自己的模型,并且这些模型应该在使用映射器传递到另一个层时进行转换。

我想知道是否有一种简单的方法(库?)将 a 映射data model到 adomain model而无需创建 a mapper,特别是如果 mydata model有很多字段(如 40-50)。

编辑

我已经尝试过ModelMapperDozerMapper但显然它们在 Android 上运行不佳(ModelMapper 问题DozerMapper 问题)。

提前致谢。