没有C的MVC:什么会改变应用程序体系结构中的SwiftUI?

MVC是用于编写iOS应用程序的设计模式的长期标准。 之前创建的iOS应用程序的结构基于一个基本组件,该组件随处可见,称为ControllerWWDC19中引入了SwiftUI ,它没有这样的组件。

所谓的大规模视图控制器的问题应在SwiftUI中解决。 因此,您需要找到一种新方法来正确分解代码。 让我们看一下平台的当前状态,并考虑在为iOS13及更高版本进行开发时可以使用哪些范例。

图片

单向和双向架构


大型公司使用的大多数体系结构解决方案都是双向的。 这意味着您可以将它们视为彼此之上的层,并且它们可以相互通信,上下传输数据。 诸如MVC,Model-View-ViewModel之类的模式,甚至带有协调器的MVVM模式的许多实现也是双向体系结构。

当前在iOS平台上广泛使用的单向数据流的一个示例是Clean Swift或Viper架构中的VIP(演示-交互-演示)循环。 这些架构并非纯粹是单向的。 路由器和可执行文件在两个方向上与VIP循环通信。

我们可以观察到的另一件事是,MVC模式和其他基于其构建的模式更多地基于并且位于一个屏幕上。 通常,没有清晰的结构来编写与应用程序各个部分交互的服务,模块等。

SwiftUI中的数据流


根据WWDC的介绍,SwiftUI中连接视图和模型/状态的元素是与BindableObject协议相对应的某个Store类。 我们只能希望我们不会在应用程序中拥有庞大的存储空间,其中包含应用程序的所有逻辑以及所有状态而没有任何清晰的结构。 我认为iOS社区相当先进,可以朝这个方向做得更好。

如果我们将MVC和SwiftUI放在视图和存储旁边,我们可以看到几乎相同的模板,这会导致与视图控制器类似的问题,但是没有VC的任何标准代码自然。

图片
如果将MVC放在图表中,它们可能看起来像这样。

乍一看,Combine似乎是SwiftUI中使用的架构模式。 但是Combine只是随时间处理值的工具。 同样,使用RxSwift的MVVM仍然是MVVM,只是层之间的链接,可以通过多种方式实现。

声明性用户界面的声明性体系结构


可以用几句话来概括SwiftUI,例如声明性用户界面 。 我相信,如果您跳出框框思考并专注于“ 声明性 ”一词,可以实现更多目标。 在前端应用程序开发中可以找到最高级的声明性体系结构示例。 ELM,Redux和Flux等概念可以轻松地与SwiftUI和Combine基础结构一起使用。 Swift已经有一些重新实现,例如ReSwift ,但是仍然有必要在Combine中组合这些实现。

图片
WWDC19中SwiftUI中的数据流略作修改

我想从一开始就没有任何依赖地使用SwiftUI,并且我目前正在使用ELM架构的简单实现在Swift中进行实验。 这种架构与Apple在WWDC上显示的图更好地匹配。

我们可以通过以下架构模式来描述应用程序:

  • 操作是描述应用程序中可能发生的所有事件的一种类型。 (在一个简单的应用程序中,这可以是一个具有某些关联值的枚举;在一个大型应用程序中,可以使用许多与操作协议相对应的结构。)
  • Update (或Redux中的reducer)是一个简单的clean函数,它采用当前状态和提交的操作并返回新的更改状态。 (这些功能不会产生副作用,可以轻松组合。)
  • 状态是描述应用程序状态的一种类型。 (简单的任务列表可以使用数组。)

所有这三个元素都是声明性的,每个元素都是拼图中一个可测试且可重用的小部分,它们共同构成了整个应用程序。 状态存储在商店中,并且可以从中计算视图。

图片
状态,操作和更新,用于简单的Swift应用程序。

对于异步操作,我们可以在Redux中引入中间件对象或在ELM中引入命令。

结论


我们可以使用我们已知的任何架构,当我们逐步将SwiftUI添加到现有应用程序时,这将是一种可靠且安全的方法。 如果仅使用SwiftUI实现新应用程序,则可以使用更开放的方法并尝试其他方法。

如果您考虑在不久的将来使用SwiftUI开发应用程序,建议您注意以下几点:

  • Apple没有提供有关应用程序体系结构的详细指南,这意味着作为程序员社区,我们有许多创新和实施新方法的机会。
  • 我们肯定会看到各种代码库的规模要大得多,因为必须填充视图控制器之后留下的漏洞。
  • 保持开放,不要害怕从头开始。

我的实验可以在Swift 操场上找到(作为比较,它展示了UIKit和SwiftUI的实现和使用,即同一应用程序)。

后续步骤


我们可以利用很多方法,但是我强烈希望最终尝试一种功能更强大的方法来进行应用程序开发。 因此,您可以从社区中看到一些有趣的解决方案,并且在日常工作中可以使用SwiftUI的时间仍然很多,因此仍然有大量的实验时间,也没有压力。

我计划写更多有关单向和功能体系结构的实现的信息。 我希望很快我可以在一些小型实际项目中使用此方法,因此我可以向您详细介绍这种方法在大型项目中如何可行并存在性能问题。

Source: https://habr.com/ru/post/zh-CN466591/


All Articles