在 Rust 中为建模重叠变体数据的模式

在 Rust 中构建复杂系统时,开发者面临的基本挑战之一是如何组织数据结构,以保持类型安全、避免代码重复、保持 API 简洁并保持对变化的灵活性。本文以搜索引擎为例,探讨了六种不同的数据建模方法,并研究了每种方法之间的权衡:

  • 方法 1:按类型结构:将数据完全分离为每个搜索配置一种类型,初学者友好,简单易懂,但代码重复最多,维护负担重,没有共享接口。
  • 方法 2:共享核心结构:将公共功能提取到共享核心中,每个搜索类型位于顶层,限制了字段重复,但仍存在一些字段重复,访问核心字段需要通过“核心”字段,对未来仅在某些类型中共享的字段灵活性有限。
  • 方法 3:组合单个类型和不同变体:使用单个顶级类型和枚举来表示不同的搜索类型,限制了字段重复,但仍存在字段重复,模式匹配可能导致更多代码重复,刚性分离在 API 演变时难以适应新类型。
  • 方法 4:带有完整结构的枚举:将枚举放在顶层,每个变体包含一个完整的结构,在保持类型安全和灵活性方面表现良好,但存在大量字段重复,处理公共字段可能需要更多的重复代码。
  • 方法 5:带有类型的单体结构:保留单体结构,但引入“类型”字段来标识正在进行的搜索类型,零代码重复,易于字段访问,但编译时间大,需要运行时类型检查,API 可能会混淆。
  • 方法 6:基于特征的组合:不依赖于支持数据的结构,而是通过特征来获取支持数据,具有最大的灵活性,可以混合和匹配特征,但特征定义有大量的样板代码,运行时类型检查可能仍然需要。

没有一种适用于所有情况的解决方案,选择取决于具体的需求,如类型安全、灵活性、维护负担和 API 设计等。view-types crate 被创建来减少这些方法的样板代码。

阅读 9
0 条评论