首页 > 解决方案 > Clean Architecture - 简单的视图逻辑应该在 Presenter 上还是在 View 上?

问题描述

我有一个简单的例子:

用户从日历中选择一个日期,然后在标签中设置该日期。当没有日期或选择了无效日期时,必须放置一个占位符。

我的问题是,这些清洁架构方法中哪一种更好?

1) 从 Presenter -> View 发送一个 Date 对象,对象可以为空。View 决定 date 是否为空,放置占位符文本,如果不是,格式化它。
View 完全根据收到的 Date 决定如何绘制界面

2)Presenter将格式化后的Date字符串发送给View,但如果为null,View设置占位符。 Presenter 将值格式定义为业务规则,但 View 决定数据如何以图形方式显示,因此 View 决定占位符文本和将被更改的组件。假设接口可能更改为 fe 占位符放置在另一个标签中并且日期字段留空

3) Presenter 指示 View 设置日期文本和设置占位符文本(只有 View 知道,因为它是静态文本)。 视图接收具体做什么事情。Presenter 确切地知道 View 有哪些组件并控制它们。但是静态文本是一个界面组件,因此 Views 决定设置哪个占位符文本。

4) Presenter 完全定义了将在 UI 中绘制的内容, View 只是一个连接 UI 组件的层,Presenter 确切或大部分知道 View 是如何绘制的

对我来说,Presenter 应该只管理来自 View 的整体输入和输出事件,让 View 对如何绘制事物、使用哪些格式甚至如何检索输入负全部责任,这样如果 UI 发生变化,主屏幕 i/o 使用案例将在 Presenter 中保持有效。

然而,我已经看到了给演示者更多控制权的代码示例,而 UI 只是绘制元素和捕获用户输入的框架方式。

标签: androidarchitecturemvpclean-architectureviper-architecture

解决方案


你可以为这 4 个中的任何一个争论,一旦你选择了一个,你真正想要的是整个代码库的一致性。

就我个人而言,我会选择 #3 它为演示者提供了最多的控制权,不允许在视图中使用条件逻辑,并且就像您所说的那样,将 UI 与演示者分离最多,允许交换 UI 并且不更改主持人。

即两种方法

Presenter.showDateSelected(long dateTimeSelectedInMillis)

Presenter.showDateSelectedIsInvalid()

当您真正知道 null 的含义(无效日期)时,永远不要传递 null,因为当您总是想显式时,您是隐式的。

上面我选择了传递一个原语,但是传递一个 Date 对象也可能会被争论,它只是与你联系一个平台,或者你可以创建自己的 View Domain Date 对象,同样你可以选择 Presenter 如何与看法。

您上面的所有选择都是 CleanArchitecture 的一种风格,最干净的是您的决策选择的一致性和清晰度。


推荐阅读