使用RxSwift重构为MVVM

当您查看代码并几乎不了解它应该做什么或它需要这么多行时,每个开发人员都会意识到这一点。 这并不意味着您必须完全从头开始,但是对重构代码的一部分开放很重要。 重构的目的是使您的代码更易于理解,测试和/或更新。

这是许多文章的第一篇,我将分享我的应用程序We To Too的重构过程,以及沿途学习的模式,库和工具。


四年前,当我第一次开始学习iOS开发时,我学到的设计模式是MVC,它代表Model View Controller。 下图以MVC模式显示了用户交互:

如果您正在学习iOS并依赖Apple的文档,您会注意到它们遵循MVC模式。 随着时间的推移,随着应用程序的增长,很容易将应用程序的所有逻辑写入视图控制器,从而导致难以测试和理解的超大型类(通常称为Massive View Controller)。

MVVM是最近流行的另一种设计模式,它代表Model-View-ViewModel。 视图模型允许业务逻辑与视图控制器分离。 这样,我们的视图控制器就变得很小,只专注于UI。 视图模型通常不导入UIKit,并且不了解视图或视图控制器。 这使视图模型可以进行单元测试。 该模型通常是表示数据的结构或简单类。

遵循MVVM模式并不意味着您的代码将是完美的。 正如您可以拥有大量的视图控制器一样,您也可以拥有大量的视图模型。 您不必在整个应用程序中使用一种设计模式,这取决于哪种功能最适合您要实现的功能。

在上面的MVVM图中,有诸如“数据和用户操作绑定”,“更新”和“通知”之类的术语。 您如何实际在MVVM中实现这些关系?

许多开发人员通过反应式编程为这些关系建模。 响应式编程是软件开发中已经存在了数十年的范例,它使开发人员可以编写专注于异步数据流的声明性代码。 查看Andre Staltz撰写的这份出色的文档,其中有更多解释。 响应式扩展(Rx)是响应式编程如何特别是在移动开发中普及的方式。

为什么我要学习Rx? 用户期望现代应用程序能够响应。 将所有内容都视为带有输入和输出的流,可以确保始终对发生的任何更改(无论是用户操作还是网络请求)做出反应。 响应式编程使用观察者设计模式,订户“侦听”流(可观察)。 有关反应式编程和RxSwift的更多信息,请观看Shai Mishali的精彩演讲或阅读文档。

我之前写过关于可测试视图模型的信息,但是我们将如何测试它们呢?

我决定使用John Shore创建的Red green重构方法。 这样可以确保在编写代码时遵循TDD思维方式。 在逻辑完成之前编写测试, 然后编写逻辑以符合测试要求。 测试通过后,您将找到无需破坏测试即可改进代码的方法。 Kickstarter在其代码库中遵循此方法,您可以观看此视频以了解其工作原理。 他们使用ReactiveSwift并编写了自己的测试助手。 我正在使用RxSwift,发现了一个非常有用的Cocoapods库,称为RxExpect。

现在,我们已经为理解MVVM和反应式编程的基础奠定了基础,让我们开始重构我的应用程序We Read Too的重构,该应用程序全部用Swift编写。

我们也阅读是一款具有以下功能的图书目录应用程序:

  • 集合视图显示按年龄类别过滤的书籍
  • 按作者,标题或描述搜索
  • 详细信息视图,显示书的详细信息以及从Goodreads提取的数据,并允许用户共享书或在Safari / Goodreads上查看
  • 一个建议视图,允许用户发送应该添加到目录的标题建议

该数据库(最近移至Firebase)包含所有书籍,可以随时使用新数据或现有数据的更改进行更新。

对于重构,我从建议视图开始,因为它最简单,并且可以通过以响应方式在MVVM中编写代码来帮助我提高舒适度。 在以后的文章中,我将介绍如何重构应用程序的其他部分以及如何随着时间的推移改进代码。


要完成有关我的重构过程的阅读,请转到我的博客。