具有两种方法执行同一操作的用例

2023-12-29

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

例如:

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

标题:创造地方 基本流程:
1. 用户在地图上“长按”。
2. 应用程序放置临时图钉并显示地点编辑视图。
3. 用户编辑地点信息并按保存按钮。
4. 应用程序创建地点并保存。

标题:创造地方 基本流程:
1. 用户按下加号按钮。
2. 应用程序显示相机视图。
3. 用户拍照。
4. 应用程序使用当前位置和图片创建地点。

根据与巴维克交换的意见进行更新。

问题2:(基于巴维克的回答)
因此,我并不需要一名演示者对应一名交互者,我可以有 1 个交互者和 3 个演示者/视图。

  1. 就我而言,我应该为地图设置一个演示者/视图,这就是地图的开始位置,
  2. 那么我应该有一个摄像头演示者/视图,以防用户点击摄像头按钮
  3. 以及一个用于编辑视图的演示者/视图,以防用户“长按”或在用户从相机演示者/视图中选择照片并重定向到相同的编辑视图之后。

那是对的吗?

问题3:我的交互器边界方法是否应该始终返回 void?
在巴维克的例子中,他们返回了一些东西,但是在毒蛇博客 http://www.objc.io/issue-13/viper.html and 鲍勃叔叔的视频 http://youtube.com/watch?v=WpkDN78P884它们总是返回 void,结果以交互器在呈现器/控制器上调用的另一个边界方法的形式出现。

问题4:VIPER方式不使用控制器,仅使用演示者与交互者对话,而鲍勃叔叔的视频使用控制器和演示者与交互者进行不同的交互。我应该采取哪种方法?

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


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

在 VIPER 设计中,您可以在同一个 Interactor 中创建两种适合每个主要用例和备用用例的方法。


问题2:(基于巴维克的回答) 因此,我并不需要一名演示者对应一名交互者,我可以有 1 个交互者和 3 个演示者/视图。

根据我们的讨论和您的更新,我想我更好地理解了。

  • Presenter/View 的交互不应超过 Interactor。
  • 演示者/视图可能根本不与任何交互器交互,如CameraView.
  • 它们是《威世智》中的中间视图。
  • 多个 Presenter/View 可以与单个 Interactor 进行交互。
  • Interactor 不绑定任何 Presenter。
  • 单个交互器负责单个用例及其所有备用流程。 1-1关系。

所以,你应该有单身EditPlacePresenter/View for EditPlaceInteractor传递数据 放置带或不带照片的数据。


问题3:我的交互器边界方法是否应该始终返回 void?

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

我认为您指的是下面的 Presenter 方法,该方法从 Interactor 接收结果。

- (void)foundUpcomingItems:(NSArray*)upcomingItems

为了使上述工作正常进行,交互器将具有委托实例,演示者/控制器将通过这些委托实例来查找结果或数据。这意味着 Presenter/Controller 与 Interactor 绑定在一起,或者它们的引用或返回函数指针在每个 Interactor 方法调用中传递。这是设计使然吗?

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

  • 如果成功,它应该包括保存的数据,例如地点 ID。
  • 如果失败,应包括失败原因。

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

博客中的参考资料:

  • Presenter 包含用于准备显示内容的视图逻辑收到时来自交互器。
  • 由 Presenter 来获取数据由交互器返回并将其格式化以供演示。
  • 主持人收到结果来自交互器并将结果转换为可以有效地在视图中显示的形式。

问题4:VIPER方式不使用控制器,仅使用演示者与交互者对话,而鲍勃叔叔的视频使用控制器和演示者与交互者进行不同的交互。我应该采取哪种方法?

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

  • 相机按钮:导航自MapView to CameraView(使用地点)
  • 长按:导航自MapView to EditPlaceView(使用坐标)
  • 拍摄照片:导航自CameraView to EditPlaceView
  • 保存地点:根据具体情况向交互者发送带/不带照片的保存地点请求,然后跳回MapView如果成功的话
  • 后退按钮:基于导航堆栈返回到上一个视图

根据 VIPER 博客,视图控制器和导航控制器由演示者和线框使用。

VIPER Wireframe 处理导航并使视图控制器成为精益、平均的视图控制机器。

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

线框

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

主持人

  • 使用线框执行导航
  • 为了保持视图控制器的精简,VIPER 需要为视图控制器提供一种在用户执行某些操作时通知相关方的方法 - 演示者来这里!
  • 视图控制器不应该根据这些操作做出决定,但它应该将这些事件传递给可以的东西 - 演示者应该做出决定!

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

不需要。作为用例一部分的导航可能不需要交互器。这只是过渡。目标Presenter可能需要一个Interactor。例如,CameraView/Presenter不需要Interactor,但是EditPlaceView需要保存这个地方。


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

架构模式在其想要分解的内容方面受到限制。我们必须明白,架构模式不会分解或隔离一切。此外,如果一种架构模式将某些职责委托给某个部分,则其他模式可能根本不会这样做,或者将多个职责分配给单个部分。

我们可以扩展或限制隔离和分解,只要它能证明原因是合理的,并且不会强加超出成本的不必要的关注点分离。您可以选择使用导航控制器,并且您的演示者可以依赖它们,而无需定义线框路由。这些控制器将负责屏幕之间的导航。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有两种方法执行同一操作的用例 的相关文章

  • 从xcode上触摸屏的坐标获取ImageView的像素数据?

    单击视图并从视图内的图像获取正确的像素数据似乎存在问题 func handleTap gestureRecognizer UIGestureRecognizer print You tapped at gestureRecognizer l
  • NSCalendar 返回明年第一周上周一的错误日期

    我使用下面的代码使用随机日期来计算上周一 哪个工作文件但我的代码在明年日期中断 下面是相同的代码 NSDate date NSDate dateWithTimeIntervalSince1970 1483620311 228 NSLog c
  • Swift 3:如何访问48字节CFData中matrix_float3x3的值?

    我正在尝试访问内在矩阵answer https stackoverflow com a 48159895 9296667 通过运行下面的命令 我能够得到一个 48 字节的任意对象 https developer apple com docu
  • 如何在 Swift 中使用indexesOfObjectsPassingTest:

    IndexOfObjectsPassingTest 的声明在 Swift 中看起来像这样 func indexesOfObjectsPassingTest predicate AnyObject Int CMutablePointer
  • Admob 广告无法快速显示

    您好 我正在尝试将 admob 广告添加到已使用 swift 上传到应用商店的应用程序中 我在 admob 中制作了一个应用程序并复制了 appid 和广告 id 并显示了各自的横幅广告和插页式广告 这里的问题是当我写这行时 request
  • iOS Safari Mobile 禁用上一个和下一个选择输入

    上周五我发现了关于此问题的类似问题 但似乎无法再次找到它 如果有人能指出我正确的方向 那就太好了 本质上我在一个页面上有多个选择菜单 第一个在加载时填充 第二个在第一个选择时填充 够简单的 但是 在 iOS 设备中 当您点击选择元素时 它会
  • AFNetworking XML 请求问题

    我在用着AFNetworking 2使用 JSON 响应 它工作正常 现在我必须将其转换为 XML 而不是使用 JSON 因为服务器响应是 XML 格式的 在我搜索之后 我找到了这段代码 但它不起作用 与 Charles 我发现请求是错误的
  • 如何找到键盘未覆盖的视图部分(UIModalPresenationStyleFormSheet)?

    我有一个视图控制器 显示带有 UITextView 的视图 并且我想在键盘出现时调整视图的大小 以便 UITextView 不会被键盘覆盖 我几乎在所有情况下都可以正常工作 据我所知 仅当视图控制器以 ModalPresentationSt
  • Swift SpriteKit edgeLoopF​​romRect 问题

    下面的代码可以识别底部和顶部边缘场景和球按预期弹开 但是 那左边缘和右边缘现场的情况一直被破坏 如果施加足够的力 球会离开屏幕 然后最终返回 就好像场景的边缘超出了 iPhone 模拟器窗口的边缘 import SpriteKit clas
  • 如何保护 iOS 应用程序免受任何操作系统攻击(在越狱设备上)

    我希望保护我的应用程序数据 以防任何操作系统攻击或越狱 iOS 设备上的未经授权的访问 在这种情况下 有什么方法可以检测此类威胁并保护应用程序数据 虽然我同意 jrturton 的说法 但如果您有想要保护的关键数据免受流氓应用程序 而不是用
  • CALayer边框奇怪问题

    我正在向 CALayer 添加边框 但有一些奇怪的行为 在我应用的边框之后出现模糊边框 参见屏幕截图 这是我的代码 void configureLabel self hidden YES self textAlignment NSTextA
  • dyld:无法加载插入的库

    当我尝试运行 UI 和单元测试时 出现异常 dyld 无法加载插入的库 private var containers Bundle Application AutoTestingApp app Frameworks IDEBundleInj
  • iOS:生成pdf时绘制文本时如何设置字体?

    我在ios应用程序中使用drawpdf函数生成pdf 同时调用nsobject类中的drawtext函数 它根据我指定的框架和字符串清楚地绘制文本 我的代码是 void drawText NSString textToDraw inFram
  • Swift,以编程方式更改 UICollectionViewCell 和 UILabel(单元格内)的宽度

    我已将单元格 UICollectionViewCell 的宽度设置为等于 UICollectionView 的宽度 并且我尝试对该单元格中包含的 UILabel 执行完全相同的操作 我认为下面的代码准确地解释了我想要实现的目标 所以我在这里
  • 为什么 iOS 启动屏幕很慢?

    我的 iOS 应用程序启动屏幕大约需要 3 5 秒 我有一张将在启动屏幕后加载的地图 我的用户必须等待启动屏幕加载 然后再等待 3 秒才能加载地图 有没有办法最大限度地减少启动屏幕时间 基本上这种延迟意味着you在启动过程中做了一些非常错误
  • 如何让UITextView背景线与文字对齐?

    我正在尝试绘制 UITextView 的背景线 这是我用来画这些线的代码 CGContextBeginPath context CGContextSetStrokeColorWithColor context self horizontal
  • 在实例化对象之前是否可以检查故事板中是否存在标识符?

    在我的代码中我有这一行 但我想知道是否有办法检查是否 一些控制器 在我将它与 一起使用之前就存在实例化ViewControllerWithIdentifier 方法 如果标识符不存在 则应用程序崩溃 如果没有好的方法 这并不是一个大问题 我
  • Objective-C 中发送给对象的消息可以被监听或者打印出来吗? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C 中拦截方法调用 https stackoverflow com questions 1618474 intercept method call in objective c 如
  • UIView 圆角 - Swift 2.0?

    我会尝试将一些项目更新到 Swift 2 0 我有一个视图 左上角有一个圆角 在 Swift 没有警告 没有错误 只是没有圆角 这就是它在 Swift let maskPath UIBezierPath roundedRect conten
  • iOS:如何知道 reloadData() 已完成其任务?

    我想滚动到给定索引 self boldRowPath 但是当我调试时scrollToRow之前执行reloadData 如何知道reloadData已完成 func getAllTimeEvent self arrAllTimeEvent

随机推荐

  • 在java中查找字符串中字符频率的有效方法:O(n)

    在最近的一次采访中 我被要求编写以下程序 找出给定字符串中频率最小的字符 因此 我尝试使用 charAt 迭代字符串 并将字符存储为 HashMap 中的键 并将出现次数作为其值 现在我必须再次迭代 Map 才能找到最低的元素 有没有一种更
  • 如何创建具有基本身份验证的 ASP.NET 网页

    我想创建 ASP NET 网页 该网页将提示我弹出基本身份验证窗口 我将在其中输入凭据 我尝试在 PreInit 和 PreLoad 事件处理程序中添加以下代码行 但它仍然没有显示基本身份验证弹出窗口 protected override
  • SQLNonTransientConnectionException 在 Eclipse 中连接 MySQL

    我正在尝试编写代码 使用 Eclipse MySQL Workbench 和 JDBC 8 0 11 将文本文件的数据导入数据库 它给了我一个 ClassNotFoundException 我已经查看了多个其他问题 并且通过将 java c
  • MassTransit Consumer 中的异常冒泡导致 Windows 服务崩溃

    我使用 AutoFac 设置了一个包含 2 个消费者的 Windows 服务 在一条快乐的道路上 这确实非常有效 我的印象是大众交通为我处理了例外情况 正如文档所述 http docs masstransit project com en
  • 使用报表查看器在运行时将未知数量的图像插入到报表中

    我正在使用reportviewer 我想在运行时向报告中添加未知数量的图像 用户应该选择一些图像 在另一个地方 这些图像应该一个接一个地显示在报告中 您知道如何使用报表查看器来做到这一点吗 谢谢 奥菲尔 有很多方法可以做到这一点 这是一种可
  • 头文件在代码块中工作吗?

    延迟函数为dos h头文件在代码块中不起作用 它表明延迟函数未声明 以下链接包含以下程序 link http www programmingsimplified com c dos h delay int main printf This
  • 寻找有界子图之间的最小割集

    如果游戏地图被划分为子图 如何最小化子图之间的边 我有一个问题 我试图通过基于网格的游戏 如 pacman 或 sokoban 进行 A 搜索 但我需要找到 外壳 外壳是什么意思 子图尽可能少切边 http en wikipedia org
  • 查找嵌入式 Linux 系统中的延迟问题(停顿)

    我有一个在 Atmel AT91SAM9260EK 板上运行的嵌入式 Linux 系统 其中有两个进程以实时优先级运行 管理器进程使用 POSIX 消息队列定期 ping 工作进程 以检查工作进程的运行状况 通常 往返 ping 需要大约
  • 可以使用 Java 程序的退出代码来检测磁盘空间不足的异常吗?

    我的 Java 程序是从 Windows 脚本调用的 是否可以使用 Java 退出代码来确定 Java 程序是否因磁盘空间不足而提前终止 同时它仍在从 JAR 文件加载类文件 我尝试了内存不足异常 它返回退出代码 1 但磁盘空间不足返回退出
  • 如何使 C++ 指针为空 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 在声明所有 C 指针时 所有指针都应
  • Azure 流分析将行旋转为列

    我有一个类似的数据 deviceid d1 parameter p1 value 1 timestamp 2018 03 22T12 33 00 deviceid d1 parameter p2 value 2 timestamp 2018
  • 如何使用在其他地方创建的预聚类数据在 R 中创建树状图?

    我有用 Java 编写的集群代码 我可以从中创建嵌套树结构 例如下面显示了树的一小部分 其中两个 isRetired 对象在第一次迭代中聚集在一起 并且该组在第五次迭代中与 setIsRequired 聚集在一起 簇中对象之间的距离显示在括
  • 有没有办法确定 Linux 上的库使用的线程本地存储模型

    有没有办法在Linux上查询共享库的TLS模型 例如使用 ldd 或其他一些工具 我在使用 initial exec 模型加载太多库时遇到麻烦 并且想确定哪些第三方库使用此模型 这样我可以通过静态链接来释放一些插槽 这会导致错误 dlope
  • 标题中徽标和菜单项垂直居中的最佳实践[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我经常发现自己必须将徽标和主菜单垂直居中在全角标题中 有没有一种被广泛接受的方法来处理这个问题 header box s
  • Android:如何使用处理程序handleMessage并访问对MainActivity的引用

    我有一个服务 它接收来自互联网的命令并启动后台线程 该线程从服务传递一个处理程序 该服务是有界的并传递该处理程序 并向该处理程序发送一条消息以拍照 我被困在处理程序的实现上 static Handler handler new Handle
  • 如果不是 apache 目录,请删除尾部斜杠

    我有以下重写规则 remove the www RewriteCond HTTP HOST www website co uk NC RewriteRule http local website co uk 1 R 301 L this r
  • Gitlab webhook 不会触发 jenkins 上的构建

    我有一组使用以下 groovy 脚本生成的多分支管道作业 repo1 repo2 each service gt multibranchPipelineJob service displayName service branchSource
  • 以编程方式从配置数据库 IIS6 中删除 etag 后缀(更改编号)

    IIS 6 0 以 hash changenumber 格式生成 eTag 值 每次 IIS 重置时 更改编号都会增加 因此您的 eTag 仅在 IIS 进程的生命周期内有效 重启 number上升 hash changenumber ha
  • RecyclerView - 如何在滚动期间突出显示中心可见项目

    我需要一个像这样的 RecyclerView 它应该做 每次显示 7 项 DONE 将 RecyclerView 置于中央可见项目的中心 DONE 当我向右 向左滚动时 中心项目将 突出显示 选择按钮 gt 蓝色 需要帮忙 当我单击按钮时
  • 具有两种方法执行同一操作的用例

    问题一 使用两种方法执行相同操作来构建一个 或多个 用例的正确方法是什么 例如 我的 iOS 应用程序有 3 个屏幕 1 地图视图 可以 长按 并有一个拍照按钮 2 相机视图 当用户点击地图视图中的相机按钮时显示 3 位置 图钉编辑视图 如