不可变或可变数据模型,应该用于设计谷歌表单、谷歌文档等软件?

Man*_*wal 2 immutability dart flutter

我们正在开发一种软​​件,该软件将在 Flutter 中写入大量内存并占用大量内存。它还将支持撤消和重做功能。目前我们在不可变数据结构方面的经验为零。在研究flutter的过程中,我想到了freezeed包,不可变数据模型的代码生成器,这促使我去理解不可变数据集。但是使用不可变数据模型会带来各种挑战,例如 -

  1. 更新数据模型的深层嵌套子项
  2. 即使在任何嵌套数据模型中进行微小更改(如 google 文档中的字母更改),对整个数据的深度复制也会使我们的应用程序变慢。
  3. 我们计划保留同一模型的多个副本以支持撤消或重做,但这会占用最终用户的大量内存空间。

Rém*_*let 5

更新数据模型的深层嵌套子项

由于您使用的是Freezed,这应该不是问题。 Freezed提供了一种用于更新深层嵌套变量的内置机制

https://github.com/rrousselGit/freezed#deep-copy

例如,假设您有:

@freezed
abstract class Company with _$Company {
  factory Company({String name, Director director}) = _Company;
}

@freezed
abstract class Director with _$Director {
  factory Director({String name, Assistant assistant}) = _Director;
}

@freezed
abstract class Assistant with _$Assistant {
  factory Assistant({String name, int age}) = _Assistant;
}
Run Code Online (Sandbox Code Playgroud)

然后,而不是:

Company company;

Company newCompany = company.copyWith(
  director: company.director.copyWith(
    assistant: company.director.assistant.copyWith(
      name: 'John Smith',
    ),
  ),
);
Run Code Online (Sandbox Code Playgroud)

你可以写:

Company company;

Company newCompany = company.copyWith.director.assistant(name: 'John Smith');
Run Code Online (Sandbox Code Playgroud)

即使在任何嵌套数据模型中进行微小更改(如 google 文档中的字母更改),对整个数据的深度复制也会使我们的应用程序变慢。

使用不变性时,很少有理由进行“深度复制”。相反,它是执行的浅拷贝。

继续这个Company例子,假设你有:

var company = Company(
  name: 'Google',
  director: Director(
    name: 'John',
  ),
)
Run Code Online (Sandbox Code Playgroud)

然后当您想更改公司名称时,您只需要执行以下操作:

company = company.copyWith(name: 'Facebook');
Run Code Online (Sandbox Code Playgroud)

这样做时,Director不会重新创建 。只有Companyis,效率更高。

这很好,因为它Director是不可变的。我们无法更改任何内容Director,因此即使两个对象使用相同的Director.

我们计划保留同一模型的多个副本以支持撤消或重做,但这会占用最终用户的大量内存空间。

继续上一点,您将存储的不是深拷贝,而是浅拷贝。

所以最终对内存的影响减少了很多。

正如您提到的撤消-重做,即使您没有使用不可变数据,您仍有可能使用该内存。