ART - 一个用于构建 Swift(UI) 应用的极简工具包

要点速览

最小化的模块化单入口架构,允许基于反馈循环和观察来操作应用程序和系统状态。使用 Swift 编写,并以宽松的 MIT 许可证授权。该架构深受基于 redux 模式的应用程序架构方法的影响,特别是 The Composable Architecture (TCA)。它肯定比 TCA 更为精简,但可能对某些人来说仍然有用。

免责声明

此仓库正在开发中,可能会随时将包含重大更改的提交添加到任何分支。由于这是一个个人项目,目前不会发出任何警告。建议不要依赖此仓库中的代码进行任何非业余爱好的项目。

简介

从非常高的概念层面来看,软件应用程序很简单。它们由可变状态组成,可以使用适当的操作进行修改。可以区分应用程序完全可见和控制的状态,以及应用程序不可见或仅部分可见和控制的状态。前者通常称为应用程序状态,而后者可以称为系统状态。明确区分这两个概念,并定义明确的边界,不仅仅是理论上的练习,对于状态持久化和加载、可测试性、降低认知负荷以及——最重要的是——每个工程师最好的朋友,即简单性,都非常重要。

在编写非平凡的软件应用程序时,依赖于一种自然地能够清晰分离关注点、易于理解和使用,并满足关键标准的应用程序架构(例如支持彻底的测试、高性能和第三方服务的直接集成)至关重要(通常)。

认识 ART

ART 试图通过为 Swift 开发者提供一个最小的架构工具包来帮助您满足这些约束,从而允许统一的方法来编写应用程序。在 ART 中,应用程序状态根据所谓的更新请求进行更新,而系统状态由副作用进行操作。请求副作用都被假定为不可变的值对象。系统状态的可读部分可以通过共效应来访问。请求副作用的实际执行由所谓的逻辑模块执行(其内部将这些任务委托给各个对象,请求的情况下是模型副作用的情况下是副作用执行器)。为了方便起见,ART 允许将请求副作用组合成所谓的可执行对象

由于根据定义,应用程序状态对整个应用程序的状态进行建模,因此应用程序 UI 只是所述状态的一个函数,因此,仅需将初始状态和状态的后续更改告知负责 UI 的组件即可。这些 UI 更新在 ART 中通过观察应用程序状态来实现。

应用程序的逻辑在各种情况下执行

a) 用户与 UI 的交互,导致应用程序和/或系统状态的更新

b) 应用程序状态的更改

c) 系统状态的更改

d) 通过其他方式(如 API)与应用程序的交互

ART 中,场景 (a) 在概念上由一个所谓的 UI 逻辑模块处理,该模块对于传入的用户交互,会将适当的请求和/或副作用发送到逻辑模块,如果需要,会考虑到当前的应用程序和系统状态。场景 (b) 由添加到逻辑模块的观察者处理。场景 (c) 应由应用程序依赖于适当的回调或观察功能来处理,然后通过向逻辑模块发送请求和/或副作用来做出反应。场景 (d) 可以以与场景 (c) 相同的方式解决。

ART 中主要组件的概述

Overview of the main components in ART

问答

何时考虑使用 ART

ART 是一个用于构建 Swift(UI) 应用程序的最小且相当精简的工具包。它试图尽可能地独立于其他库。虽然到目前为止我只在个人使用的中型应用程序上使用过它,但应该没有什么能阻止您用它构建复杂的应用程序。但是,正如 ART 所使用的许可协议中所述,该软件按“原样”提供,不提供任何形式的保证,因此请确保了解您在做什么。

何时不使用 ART

ART 所依赖的概念并非完全简单,因此如果您只是想构建一个快速而简陋的原型或一个没有太多逻辑的非常简单的单屏幕应用程序,ART 可能会过于复杂。如果您不同意它的任何概念,特别是基于值对象的副作用建模,您可能也不应该使用它。

此外,请记住,与诸如令人难以置信的 TCA 之类的架构不同,ART 背后没有社区,并且完全不清楚 ART 将在未来维护到什么程度。

从哪里开始?

熟悉基于 ART 的应用程序的基本设置的最佳位置是 UsageExampleSpec

如何集成 ART

在 Swift 包中,将 ART 添加到 Package.swift

dependencies: [
  .package(url: "https://github.com/CodeBaseCamp/swift-architecture-toolkit", branch: "master"),
],
targets: [
  .target(
    dependencies: [
      .product(name: "ART", package: "swift-architecture-toolkit"),
    ],
  )
]

否则,在 Xcode 中将 ART 添加为包依赖项

为什么 ART 使用值对象来表示副作用?

值对象的使用确实增加了一个额外的抽象层,这可能是一个优点或一个缺点,具体取决于情况。以下几个方面通常被认为是优点

为什么 ART 中的观察者是 class 而不是 struct

ART 中,观察者的释放被用作停止和移除观察的便捷方式。