具有2种方式的Use Case用于相同的操作

Rod*_*uiz 5 architecture design-patterns use-case ios

问题1:使用2种方法执行相同操作构建用例(或多个用例)的正确方法是什么?

例如:

我在iOS应用程序中有3个屏幕:
1.地图视图,可以"长按"并具有相机按钮.
2.摄像机视图,如果用户在地图视图中点击摄像机按钮,则会显示该视图.
3.位置/引脚编辑视图,如果用户"长按"地图视图,或在用户在摄像机视图中选择照片后显示.此编辑视图有一个保存按钮,用于实际创建带有照片和位置的位置(长按坐标或当前位置以防按下相机按钮).

标题:创建场所基本流程:
1.用户在地图上"长按".
2.应用程序删除临时图钉并显示场所编辑视图.
3.用户编辑地点信息并按下保存按钮.
4.应用创建场所并保存.

标题:创建场所基本流程:
1.用户按下加号按钮.
2. App显示摄像机视图.
3.用户拍照.
4.应用程序创建具有当前位置和图片的位置.

根据与bhavik交换的评论进行更新.

问题2 :(基于bhavik的答案)
因此,我不需要一个交互者的一个演示者,我可以有1个交互者和3个演示者/视图.

  1. 在我的情况下,我应该有一个地图的演示者/视图,这是它开始的地方,
  2. 然后我应该有一个摄像机的演示者/视图,以防用户点击相机按钮
  3. 如果用户"长按"或用户从摄像机演示者/视图中选择照片并被重定向到相同的编辑视图,则编辑视图的一个演示者/视图.

那是对的吗?

问题3:我的交互方的边界方法是否总是返回无效?
在bhavik的例子中,他们正在返回一些东西,但在VIPER博客叔叔Bob的视频中,他们总是返回void,结果以另一个边界方法的形式出现,交互者调用演示者/控制器.

问题4:当叔叔Bob的视频使用控制器和演示者与交互者进行不同的交互时,VIPER方式不使用控制器,只有演示者与交互者交谈.我应该采取哪种方法?

问题5:如果我的用例类似于"转到其他屏幕",它是否应该有一个交互器?由于当前视图将告诉其演示者按下了什么按钮(要查看的视图),并且此当前演示者将告诉其线框"更改为此另一个线框".

bha*_*hah 12

问题1:使用2种方法执行相同操作构建用例(或多个用例)的正确方法是什么?

在VIPER设计中,您可以在同一个Interactor中创建两个适用于用例的每个主要和替代的方法.


问题2 :(基于bhavik的答案)因此,我不需要一个交互者的一个演示者,我可以有1个交互者和3个演示者/视图.

根据我们的讨论和您的更新,我想我更了解它.

  • Presenter/View不应与Interactor上的内容进行交互.
  • 演示者/视图可能根本不与任何交互者交互CameraView.
  • 它们是奇才中间视图.
  • 多个Presenter/View可以与单个Interactor交互.
  • Interactor不会绑定到任何Presenter.
  • Single Interactor负责单个用例及其所有备用流程.1-1关系.

所以,你应该有一个EditPlacePresenter/ViewEditPlaceInteractor带或不带照片传递数据放置数据.


问题3:我的交互方的边界方法是否总是返回无效?

在bhavik的例子中,他们正在返回一些东西,但在VIPER博客和叔叔Bob的视频中,他们总是返回void,结果以另一个边界方法的形式出现,交互者调用演示者/控制器.

我想你指的是接收Interactor结果的下面的Presenter方法.

- (void)foundUpcomingItems:(NSArray*)upcomingItems
Run Code Online (Sandbox Code Playgroud)

为了使上述工作正常,交互者将拥有委托实例,这些实例将由Presenter/Controller进行连线/修补,以查找结果或数据.这意味着Presenter/Controller与Interactor绑定,或者在每个Interactor方法调用中传递它们的引用或返回函数指针.这是设计的吗?

我认为,Interactor应该根据用例返回数据.例如,Interactor应该返回EditPlaceResult成功或失败.

  • 如果成功,则应包括已保存的数据,例如地点ID.
  • 如果失败,应包括失败原因.

这应该是用例的一部分.如果没有,它不应该返回任何东西.它将返回void,Presenter将查询单独的Interactor以检查Map Place是否成功添加.

博客中的参考文献:

  • Presenter包含用于准备从交互器接收的显示内容的视图逻辑.
  • 它取决于Presenter获取Interactor返回的数据并将其格式化以进行演示.
  • Presenter 从Interactor 接收结果,并将结果转换为有效显示在View中的表单.

问题4:当叔叔Bob的视频使用控制器和演示者与交互者进行不同的交互时,VIPER方式不使用控制器,只有演示者与交互者交谈.我应该采取哪种方法?

您需要为以下导航定义VIPER路线:

  • 相机按钮:导航MapViewCameraView(使用位置)
  • 长按:导航MapViewEditPlaceView(使用坐标)
  • 拍摄照片:导航CameraViewEditPlaceView
  • 保存位置:根据具体情况向Interactor发送保存地点的请求,MapView如果成功则跳回
  • 后退按钮:基于导航堆栈返回上一个视图

根据VIPER博客,Presenters和Wireframes使用视图控制器和导航控制器.

VIPER线框处理导航并使视图控制器变得精简,平均,视图控制机器.

基本上,线框抽象出导航控制器,而是提供路线定义.

线框

  • 拥有UINavigationController和UIViewController
  • 负责创建View/ViewController并将其安装在窗口中
  • 路由在线框中定义,并包含导航逻辑,用于描述以哪种顺序显示哪些屏幕

主持人

  • 使用线框执行导航
  • 为了保持视图控制器的精益,VIPER需要为视图控制器提供一种方式,以便在用户采取某些操作时通知感兴趣的各方 - 演示者来到这里!
  • 视图控制器不应该基于这些操作做出决策,但它应该将这些事件传递给可以 - 演示者应该做出决定的事情!

问题5:如果我的用例类似于"转到其他屏幕",它是否应该有一个交互器?由于当前视图将告诉其演示者按下了什么按钮(要查看的视图),并且此当前演示者将告诉其线框"更改为此另一个线框".

不可以.导航作为用例的一部分可能不需要Interactor.它只是过渡.目标Presenter可能需要一个Interactor.例如,CameraView/Presenter不需要Interactor但EditPlaceView需要保存地点.


总体而言:架构模式背后的理念是将给定的软件应用程序划分为互连的部分,以便将信息的内部表示与向用户呈现或接受信息的方式分开.MVC,MVP,MVVM,VIPER都专注于以某种方式隔离视图,逻辑和导航.

建筑模式受限于他们打算分解的东西.我们必须明白,架构模式不会分解或隔离所有内容.此外,如果一个架构模式将某些职责委托给某个部分,则其他部分可能根本不会这样做,或者将多个职责分配给单个部分.

我们被允许延长或限制隔离和分解,以使其证明原因合理,并且不会对超出成本的关注点进行不必要的分离.您可以选择使用导航控制器,您的演示者可以在不定义线框路径的情况下依赖它们.然后,这些控制器将负责屏幕之间的导航.