干净的架构。主持人的工作是啥?
Posted
技术标签:
【中文标题】干净的架构。主持人的工作是啥?【英文标题】:Clean architecture. What are the jobs of presenter?干净的架构。主持人的工作是什么? 【发布时间】:2018-03-12 15:23:33 【问题描述】:我一直在阅读一些关于clean architecture 的文章,以及如何在android 中实现它。我看到了sample app,它显示了它的 Android 实现。另外,我经历了一个不错的talk on Clean architecture on Android
所以,我有点理解大部分概念,但我想对某些事情进行一些澄清。
根据我的理解,
View 层是处理 UI 的外层,并且 框架相关的东西 演示者是视图的直接通信者,它接受用户输入,并通过将其传递给用例层或交互器层来执行基于此的某些用例。 Interactor 执行用例,将其返回给 Presenter 发送的回调, Presenter 再次将此结果转换为视图可理解的数据结构(ViewModel)并将其传递回视图。我没有列出关于存储库等内层的更多详细信息,因为我的问题与上述步骤有关
这里,演示者的唯一工作是充当 UseCases 和 UI 之间的中介,作为数据调度员吗?
是否只做视图模型到用例模型的转换,反之亦然?
输入验证逻辑依赖于哪一层?它可以在演示者内部吗?例如,如果我们采用一个注册过程的小用例,
一旦用户输入详细信息并点击注册按钮,数据发送给演示者,是这样的
Presenter 验证输入值是否存在任何错误通知 视图 如果值正确,将其转换为用例模型,然后执行 某些用例,一旦交互者给出结果, 再次转换为视图模型,将其发送到视图。第二个问题是,谁控制导航? View 还是 Presenter 还是 UseCase?
谁来决定下一步去哪里?
例如 - 考虑一个登录过程的用例,用户将在其中输入凭据并单击“确定”。
登录成功后,
如果用户电子邮件未验证,请转到电子邮件验证屏幕 如果用户配置文件未完成,请设置配置文件,然后仅转到主屏幕 如果用户是新用户,则显示新优惠屏幕,否则直接转到主屏幕那么,谁负责在接下来的哪个屏幕上做出这些决定?是演示者,它相应地决定和导航视图吗?还是用例处理程序负责通知演示者下一个状态是什么?
抱歉,问题太长了,但我只是想详细说明一下我目前的理解。提前致谢
【问题讨论】:
【参考方案1】:这里,主持人的唯一工作是充当调解人吗? 在 UseCases 和 UI 之间,作为数据调度器?
是的
输入验证逻辑依赖于哪一层?可以在里面吗 主持人?
验证应该依赖于业务层而不是演示,它可以在演示者内部吗?当然可以,但是如果您有多个屏幕接受类似的输入,您是否必须在每个演示者中重复您的验证逻辑!你可以争辩说你可以做一个基础演示者,但这不是完美的解决方案,因为演示者应该有一个目的。
第二个问题是,谁控制导航?视图或 Presenter 还是 UseCase?
您认为导航是域的一部分还是表示层或数据层的一部分,它可能与表示层有关,但您可以在表示层内制作一个小组件,一般控制整个导航,所以您可以在您决定确实需要其他平台并放弃您的活动时使用此组件。您可以在您提到的示例中找到这种方法。
编辑:0
如何在具有不同模型的模块之间传递数据?
您只是使用映射器,原因是让每个模块都有自己的模型或实体,因此很容易单独测试每个模块。
关于演示者和视图,假设您要显示错误消息,演示者决定显示的原因,视图决定如何显示。
我认为理解 Android 的干净代码表示层的问题是,Activity 和 Fragment 不仅是视图,它们也是代码将存在的过程和生命周期,干净的代码随之而来这些活动和片段上的意大利面条代码。
编辑:1 添加到最后一点,现在很明显,Google 和那里的支持团队通过引入一组出色的库“Architecture components”努力使活动和片段虚拟视图成为可能。我鼓励任何人检查它们,即使您使用 MVP,您也会发现很大的好处。
【讨论】:
关于导航,从示例中我可以看到Navigator
是BaseActivity 的一部分,这意味着它在视图层中并且演示者不知道它。现在以我在问题中的第二个示例为例,登录后用户必须导航到许多可能的屏幕中的任何一个。
会不会是这样,presenter 只是通知视图类似onLoginSuccess
,然后视图执行 if..else 语句来决定去哪里,在 @ 中调用适当的路由方法987654325@?或者演示者自己会执行此if else
,并调用相应的视图方法,如gotoHome
或gotoEmailVerify
?
另外,模块之间传递的数据是如何处理的?导航器是否还保存要提供的额外数据以启动新屏幕(或新功能或模块)?例如,一个支付模块可能会通过保存前一个屏幕的购买信息来启动,那么导航器是否将其从购买模块传输到支付模块?
关于presenter和view,假设你要显示错误信息,presenter决定为什么显示,view决定如何显示
This one 给出了更清晰的理解以上是关于干净的架构。主持人的工作是啥?的主要内容,如果未能解决你的问题,请参考以下文章