干净的架构——简单的视图逻辑应该在 Presenter 上还是在 View 上?

Clean Architecture - Should simple view logic be on Presenter or on View?

我有一个简单的例子:

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

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

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

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

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

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

对我来说,Presenter 应该只管理来自 View 的整体输入和输出事件,将全部责任留给 View 来决定如何绘制事物、使用哪些格式甚至如何检索输入,因此如果 UI 更改后,主屏幕 i/o 用例将在 Presenter 中保持有效。

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

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

就我个人而言,我会选择#3,它为演示者提供了最大的控制权,不允许在视图中使用条件逻辑,并且就像你说的那样,最大限度地将 UI 与演示者分离,允许交换 UI 并且演示者没有变化。

即两种方法

Presenter.showDateSelected(long dateTimeSelectedInMillis)

Presenter.showDateSelectedIsInvalid()

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

上面我选择了传递一个原语,但是传递一个 Date 对象也有争议,它只是与你的平台相关,或者你可以创建你自己的 View Domain Date 对象,同样你有多种选择Presenter 如何与 View 交互。

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