Man*_*wal 2 immutability dart flutter
我们正在开发一种软件,该软件将在 Flutter 中写入大量内存并占用大量内存。它还将支持撤消和重做功能。目前我们在不可变数据结构方面的经验为零。在研究flutter的过程中,我想到了freezeed包,不可变数据模型的代码生成器,这促使我去理解不可变数据集。但是使用不可变数据模型会带来各种挑战,例如 -
更新数据模型的深层嵌套子项
由于您使用的是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.
我们计划保留同一模型的多个副本以支持撤消或重做,但这会占用最终用户的大量内存空间。
继续上一点,您将存储的不是深拷贝,而是浅拷贝。
所以最终对内存的影响减少了很多。
正如您提到的撤消-重做,即使您没有使用不可变数据,您仍有可能使用该内存。
| 归档时间: |
|
| 查看次数: |
555 次 |
| 最近记录: |