清洁架构 - 罗伯特马丁 - 如何连接用例

Rod*_*uiz 12 architecture software-design ios

我正在尝试实施Robert Martin描述的清洁架构.更具体地说,我正在使用VIPER,这是一个iOS版本的Clean Architecture.

我遇到的问题如下:

用户开始查看带有位置(引脚)的地图.如果他点击一个按钮,则会丢弃一个引脚并将其带到另一个视图以创建(或编辑,如果它是对现有引脚的点击)该地点(或取消).在另一个视图中,用户可以编辑地点的信息,然后单击"返回"或"完成"(或"编辑").如果他单击"完成",PlaceDetailsViewController将向PlaceDetailsPresenter发送一条消息,其中包含位置信息,PlaceDetailsPresenter使用CreatePlaceInteractor创建该位置.此交互器返回用于标识场所的GUID.

如果用户在创建场所之前点击回来,他会回到地图并且掉落的针脚会上升和离开(因为它没有GUID,它是一个新的位置并消失).如果他在创建后单击后退,则引脚会保留在那里(因为它应该有一个GUID).

我该如何连接所有这些以及应该存储地点信息(包括GUID)的位置?澄清一点:

  1. 谁应该通知MapPresenter针脚留在那里还是消失?它是PlaceDetailsPresenter还是应该将此信息传递给PlaceDetailsWireframe - > MapWireframe - > MapPresenter - > MapView?
  2. 在返回之前,应该在PlaceDetailsPresenter或PlaceDetailsViewController中存储此GUID的位置?

现在,这就是我所拥有的: 在此输入图像描述

编辑:

基本上我认为问题在于VIPER来自罗伯特·马丁的清洁架构而且他来自Web(Rails)背景,所以他对状态没有太多考虑(或者在他的会谈中没有详细说明).

这主要是我的问题,应该在哪里存储状态,不同模块应该如何通信,如果是通过线框,或通过数据库,或通过交互者,或通过演示者彼此通信,如https:/ /github.com/objcio/issue-13-viper-swift.

小智 19

我对Viper了解不多,所以我无法对此发表评论.但是,系统的总状态应该保存在实体对象中并由交互者操纵.应通过控制器和演示者之间的特殊连接来管理GUI的详细状态(选择矩形等).

在您的情况下,有两个屏幕.地图和地方编辑器.单击地图会导致调用placePinController.它收集点击的位置和任何其他上下文数据,构造一个placePinRequest数据结构并将其传递给PlacePinInteractor,它检查引脚的位置,必要时验证它,创建一个Place实体来记录引脚,构造一个EditPlaceReponse对象并将其传递给EditPlacePresenter,它会调出场所编辑器屏幕.

如果在场所编辑器屏幕上单击完成按钮,它将调用EditPlaceController,它将编辑的数据收集到EditPlaceRequest数据结构中并将其传递给EditPlaceInteractor.等等..

您特别询问了该引脚的GUID.这将由Place实体创建并传递回editPlacePresenter PlacePinInteractor.

  • @RobertMartin假设点击地图会创建一个实体.您假设您应该只在创建过程完成时创建实体.两种解决方案都可以使用,但需要不同的通信渠道 Bob的方式更容易_如果您可以创建具有缺失值的实体而不违反业务规则_:如果单击后退按钮取消创建,则删除实体.如果这不起作用,请使用临时DTO传递.(NSDictionary可能会这样做,但我建议使用自定义值对象进行数据清理.) (2认同)