我有一个简单的例子:
用户从日历中选择一个日期,然后在标签中设置该日期。如果没有日期或选择了无效的日期,则必须放置一个占位符。
我的问题是,哪种更好的清洁建筑方法?
1)从演示者->视图发送日期对象,该对象可以为null。 View决定date是否为空,以放置占位符文本,如果不是,则设置其格式。
视图完全根据收到的日期决定如何绘制界面
2)Presenter将格式化的Date字符串发送给View,但如果为null,则View设置占位符。 Presenter定义了值格式,因为它是业务规则,但是View决定如何以图形方式显示数据,因此View决定占位符文本和将要更改的组件。假设接口可能更改为f.e.占位符放置在另一个标签中,并且日期字段保留为空
3)Presenter指示View设置日期文本和设置占位符文本(由于它是静态文本,因此只有View知道)。 View专门接收要执行的操作。 Presenter确切知道View拥有哪些组件并对其进行控制。但是静态文本是界面的组成部分,因此Views可以确定要设置的占位符文本。
4)Presenter完全定义了将在UI中绘制的内容, 视图仅是连接到UI组件的一层,Presenter完全或大部分都知道如何绘制视图
对我来说,Presenter应该只管理View的整体输入和输出事件,而对View的绘制方式,使用的格式以及输入的检索方式完全由View负责,这样,如果UI更改,主屏幕/ o用例在Presenter中仍然有效。
但是,我看到的代码示例为演示者提供了更多控制权,而UI只是绘制元素和捕获用户输入的框架方式。
答案 0 :(得分:2)
对于这4种方法中的任何一种,您都可以争论不休,而您真正想要的是选择了整个代码库之后的一致性。
我个人会选择#3,它可以使演示者获得最大的控制权,不允许在View中使用条件逻辑,就像您说的那样,最大程度地将UI与Presenter分离,从而可以进行UI交换而无需更改为演示者。
即两种方法
Presenter.showDateSelected(long dateTimeSelectedInMillis)
Presenter.showDateSelectedIsInvalid()
当您真正想知道null的含义(无效的日期)时,永远不要传递null,因为当您始终希望明确时就隐含了。
以上,我选择传递一个原语,但是传递一个Date对象也可能会引起争议,它只是与您联系在一起的一个平台,或者您可以创建自己的View Domain Date对象,因此您还是可以选择多种方式演示者与View交互。
您在上述所有选择中都体现了CleanArchitecture的风格,最干净的是您在决策选择中的一致性和清晰度。