首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Swift高级分享-在Swift中提取视图控制器操作

视图控制器往往在为Apple平台构建的大多数应用程序中起着非常重要的作用。他们管理我们UI的关键方面,提供系统功能的桥梁,如设备方向和状态栏外观,并经常响应用户交互 - 如按钮点击和文本输入。

由于它们通常具有这样的关键作用,因此许多视图控制器最终遭受常见的大规模视图控制器问题并不奇怪- 当它们最终承担太多责任时,导致大量交织在一起的逻辑,通常与视图混合在一起和布局代码。

虽然我们已经探索了多种减轻和分解大视图控制器的方法 - 例如使用合成,将导航代码移动到专用类型,重用数据源和使用逻辑控制器- 本周,我们来看一下技术这让我们可以提取视图控制器的核心操作,而无需引入任何其他抽象或架构概念。

尴尬的意识

许多类型的架构和结构问题的一个非常常见的根本原因是某些类型只是意识到太多的域和细节。当给定类型的“意识领域”增长时,通常会履行其职责,并且 - 作为直接影响 - 它包含的代码量。

假设我们正在为消息传递应用程序构建一个作曲家视图,为了能够从用户的联系人中添加收件人并启用消息发送,我们目前允许我们的视图控制器直接访问我们的数据库和网络代码:

上面可能看起来不是什么大问题 - 我们使用依赖注入,并不像我们的视图控制器有大量依赖。然而,当我们的视图控制器还没有变成一个巨大的一个,只是还没有,它确实有它需要处理的动作相当多的数量-如添加收件人,取消和发送邮件-它目前正在对所有的它自己的:

让视图控制器执行自己的操作可能非常方便,对于更简单的视图控制器,它很可能不会导致任何问题 - 但正如我们只看到上面的摘录所看到的那样,它通常需要我们的视图控制器知道他们理想情况下不应过于关注的事情 - 例如网络,创建逻辑对象,以及对父母如何呈现它们做出假设。

由于大多数视图控制器已经非常忙于创建和管理视图,设置布局约束以及检测用户交互等内容 - 让我们看看我们是否可以提取上述操作,并使我们的视图控制器更简单(并且不太清楚)处理。

操作

动作通常有两种不同的变体 - 同步和异步。某些操作只需要我们快速处理或转换给定值,并直接返回,而其他操作则需要更多时间来执行。

为了对这两种动作进行建模,让我们创建一个通用枚举 - 实际上并没有任何情况 - 但是包含两个类型别名,一个用于同步动作,一个用于异步动作:

我们使用的原因,我们的包装上面,以防止它被实例化的类型,而不是只充当一个“抽象的命名空间”。

使用上面的类型别名,我们现在可以定义一个元组,其中包含我们可以执行的所有操作- 如下所示:

有了上述内容,我们现在可以开始大量简化我们的视图控制器 - 首先要删除它对我们的核心网络和数据库类型的认识,而只是让它知道传递给它的内容:

接下来,为了实际使用我们新的动作集合,让我们更新所有执行代码的动作,从现在开始,只需调用一个作为视图控制器初始化程序的一部分传递的预定义动作 - 如下所示:

值得注意的是,作为此重构的一部分,我们还改进了收件人添加到邮件的方式。我们不是让视图控制器本身执行其模型的变异,而是简单地返回一个新值作为其动作的结果。

上述方法的优点在于我们的视图控制器现在可以专注于视图控制器最擅长的 - 控制视图 - 并让创建它的上下文处理网络和呈现等细节。以下是我们现在可以在另一个视图控制器上呈现消息编写器的方法,例如在协调器或导航器中:

太可爱了!由于我们所有的视图控制器的操作现在都只是函数,因此我们的代码变得更加灵活,更容易测试 - 因为我们可以轻松地模拟行为并验证在各种情况下调用正确的操作。

可操作的概述

从私有方法和专用集合中提取操作的另一大好处是,可以更容易地了解给定视图控制器执行的操作类型 - 例如,这具有四个同步的非常清晰的列表和异步操作:

添加对新操作的支持通常也变得非常简单,因为我们不必为每个视图控制器注入新的依赖项并编写特定的实现,我们可以更轻松地利用共享逻辑并简单地向我们的元组添加新成员- 然后在调用时调用它发生了相应的用户交互。

最后,操作可以实现类型自定义和更简单的重构等功能,而无需通常需要的“仪式”来解锁此类功能 - 例如,在使用协议时,或切换到新的,更严格的架构设计模式时。

例如,假设我们想要从之前返回到我们,并添加对保存未完成消息草稿的支持。我们现在可以实现整个功能,甚至无需触及我们的实际视图控制器代码 - 我们所要做的就是更新其操作:

虽然上述类型的功能为我们提供了很大的灵活性,但我们还需要注意不要在免费闭包中放入过多复杂的逻辑,因为这会使代码库难以导航和调试。值得庆幸的是,一旦我们的逻辑与我们的UI和视图控制器分离,将其移动到专用类型(例如和- )通常非常简单。

结论

在处理复杂的视图控制器时,没有“银色子弹”- 特别是那些已经超出其原始意识和责任范围的控制器。像往常一样,拥有多种不同的技术 - 并在最合适的地方部署它们 - 通常是以高效和务实的方式创建真正强大的系统的关键。

虽然更复杂的技术(如使用逻辑控制器或视图模型,或使用协议分离关注点)非常适合我们想要在整个代码库中进行更加结构化的,根本性的更改 - 提取操作可以大大有助于我们的视图控制器更简单,不需要任何重大改变或新的抽象。

原文地址 https://www.swiftbysundell.com/posts/extracting-view-controller-actions-in-swift

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190829A033ZH00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券