清洁架构 – Robert Martin – 如何连接用例

我正在尝试实施Robert Martin所描述的清洁架构 。 更具体地说,我使用的是干净架构的iOS版本的VIPER 。

我有这个问题如下:

用户开始查看带有地点(地图)的地图。 如果他点击一个button,一个别针被丢弃,并被带到另一个视图来创build(或编辑,如果它是一个现有的针脚点击)的地方(或取消)。 在另一个视图中,用户可以编辑地点的信息,然后点击“返回”或“完成”(或“编辑”)。 如果他点击“完成”,则PlaceDetailsViewController向PlaceDetailsPresenter发送一条消息,其中包含地点信息,PlaceDetailsPresenter使用CreatePlaceInteractor创build该地点。 这个交互者返回用​​于标识地点的GUID。

如果用户在创build地点之前点击回来,他会回到地图上,并且丢弃的针脚上升(因为它没有GUID,这是一个新的地方,并消失)。 如果他在创build之后再次点击,则该引脚停留在那里(因为它应该有一个GUID)。

我应该如何连接所有的地方信息(包括GUID)在哪里存储? 澄清一点点:

  1. 谁应该通知MapPresenter销钉停留在那里或者消失? 它是PlaceDetailsPresenter还是应该将这些信息传递给PlaceDetailsWireframe – > MapWireframe – > MapPresenter – > MapView?
  2. 在返回之前,这个GUID应该存储在PlaceDetailsPresenter还是PlaceDetailsViewController中?

现在这就是我所拥有的: 在这里输入图像说明

编辑:

基本上我认为问题在于,VIPER来自Robert Martin的Clean Architecture,他来自Web(Rails)背景,所以他对于状态没有太多的了解(或者在谈话中没有说明)。

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

我对Viper不太了解,所以我不能评论这个。 然而,系统的总体状态应该保存在实体对象中,并由交互者操纵。 GUI(select矩形等)的详细状态应由控制器和演示者之间的特殊连接来pipe理。

在你的情况下有两个屏幕。 地图和地点编辑器。 点击地图会导致placePinController被调用。 它收集点击的位置以及任何其他上下文数据,构造一个placePinRequest数据结构,并将其传递给PlacePinInteractor,它检查引脚的位置,在必要时validation它,创build一个Place实体来logging引脚,构造一个EditPlaceReponse对象并将其传递给EditPlacePresenter,它将调出地点编辑器屏幕。

如果在地点编辑器屏幕上单击完成button,它将调用EditPlaceController,将EditPlaceRequest数据结构中的编辑数据收集起来并传递给EditPlaceInteractor。 等等..

您特别询问了引脚的GUID。 这将由Place实体创build并传回到editPlacePresenter PlacePinInteractor。