【问题标题】:iOS VIPER: where to put the form validation code?iOS VIPER:表单验证码放在哪里?
【发布时间】:2017-04-11 20:27:19
【问题描述】:

看了很多关于干净iOS架构VIPER的文章,明白了主要目的:关注点分离。

我目前将它用于我的项目。我有模块,每个模块都由 Views、Interactors、Presenters、Entities 和 Routers 拆分(带有 Storyboard)。

我有一个模块:地址和一个子模块 Add 用于添加地址页面。

所以,我的协议视图由我的 UIViewController 实现。 视图控制器包含所有弱 IBOutlet 标签和文本字段(用于新地址表单)。

地址表单包含几个字段,例如:

  • 人名和姓氏
  • 邮政编码
  • 国家
  • 状态
  • 电话
  • 电子邮件
  • 等等……

在我的例子中,演示者只是将用户交互依赖于执行 API 调用的交互器。

但是,在执行 API 调用之前,我想预先验证表单以避免消耗无用的网络资源。

我需要检查例如:

  • 国家的内容,如果为空,则告诉视图该字段是必需的...
  • 电子邮件的格式并告诉视图该字段无效...

我的问题是,我可以将表单验证代码放在哪里?

应该使用哪个 VIPER 组件来完成这项工作?

提前谢谢你!

【问题讨论】:

    标签: ios architecture viper-architecture


    【解决方案1】:

    VIPER 的主要优势之一是关注点分离,因为信息被封装在适当的元素中。

    Interactor 处理“业务逻辑”,其中包括大部分验证问题(部分验证可能由实体本身完成)。因此,视图会将其数据传递给 Presenter,Presenter 会将其转介给 Interactor,Interactor 将检查其业务有效性并要求实体告知其数据的一致性。

    但是,使用库来加速您的开发可能会迫使您权衡封装以换取易用性。例如,SwiftValidator 提供了相当广泛的验证规则,但要求您将 UITextFields 传递给 Validator 组件。

    因此,您可以选择一个更好的封装架构,该架构依赖于一个 Interactor(可能被 Validators 之类的库所支持),或者一个更面向 MVVM 的工具,例如 SwiftValidator

    【讨论】:

      【解决方案2】:

      由于这与业务逻辑有关,我会说验证应该交给交互者。您甚至可以创建将被称为表单交互器的工作器 - 如果您的验证太大,但交互器是执行此操作的地方。使用委托,您可以在出现问题时通知用户,究竟是什么错误,错误消息等。

      我也会参考http://clean-swift.com/clean-swift-ios-architecture/

      【讨论】:

      • 小注:我认为clean-swift.com网站的作者还没有完全理解干净代码的基本思想。从我的角度来看,引入循环依赖(VC->I->P->VC)并不是一个好主意。视图控制器应该是愚蠢的,只知道它是演示者。所以我建议让它更像 (VC->P->I) - 将反向引用实现为委托。
      【解决方案3】:

      看来您应该考虑为此目的使用SOA architecture 方法。

      一般来说,使用 VIPER 模块的应用的干净架构可以分为以下几层:

      1. 组装

        这里有所有与创建 viper 模块组件相关的代码。

      2. 演示文稿

        您应该保留 Animator、LayoutPerformer、Presenter、View、ViewController、Router 等组件。

      3. 业务逻辑

        它是为交互器和一堆服务而设计的。理想情况下,每个服务都是无状态的,它使用来自核心组件层的类。例如,服务封装了一些网络客户端和请求,并产生一些模型作为输出。

      4. 核心组件

        这一层的目的与您的问题有关。这是放置响应验证器、对象映射器、网络客户端等内容的地方。 所以答案是放到核心组件层。

      5. 模型层

        这是应该保留所有实体的最深层。

      好的,听起来不错,但是在这种情况下我该如何构建项目呢?

      您可以使用例如下面的结构。

      --Modules
      ----Module
      ------Interactor
      ------Presenter
      ------Assembly
      ------Router
      ------View
      --Services
      --Core
      ----Validators
      ----Mappers
      --Models

      【讨论】:

        【解决方案4】:

        例如,您可以从这篇文章 (https://www.ckl.io/blog/best-practices-viper-architecture) 中查看此样板文件 (https://github.com/CheesecakeLabs/Boilerplate_iOS_VIPER)。

        Presenter 负责表单验证,但您不应将代码留在 Presenter ifself 上。相反,请为 Presenter 调用 FormValidationHelper()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-12
          • 1970-01-01
          • 2016-05-08
          • 1970-01-01
          • 1970-01-01
          • 2016-09-19
          • 2018-06-29
          • 1970-01-01
          相关资源
          最近更新 更多