gpt4 book ai didi

language-agnostic - 使用不可变对象(immutable对象)撤消/重做

转载 作者:行者123 更新时间:2023-12-02 18:34:58 24 4
gpt4 key购买 nike

我在 article 中读到了以下内容

Immutable objects are particularly handy for implementing certain common idioms such as undo/redo and abortable transactions. Take undo for example. A common technique for implementing undo is to keep a stack of objects that somehow know how to run each command in reverse (the so-called "Command Pattern"). However, figuring out how to run a command in reverse can be tricky. A simpler technique is to maintain a stack of immutable objects representing the state of the system between successive commands. Then, to undo a command, you simply revert back to the previous system state (and probably store the current state on the redo stack).

但是,本文没有展示如何使用不可变对象(immutable对象)来实现“撤消”操作的良好实际示例。例如...从 Gmail 收件箱中删除 10 封电子邮件。一旦你这样做了,它就会有一个撤消选项。不可变对象(immutable对象)在这方面有何帮助?

最佳答案

不可变对象(immutable对象)将保存系统的整个状态,因此在这种情况下,您将拥有包含原始收件箱的对象 A,然后是包含已删除十封电子邮件的收件箱的对象 B,并且(实际上) 一个从 B 返回到 A 的指针,表明如果您执行一次“撤消”操作,则您将停止使用 B 作为系统状态并开始使用 A。

但是,Gmail 收件箱太大,无法使用此技术。您可以在实际上可以存储在相当少量内存中的文档上使用它,这样您就可以保留其中的许多文档以进行多级撤消。

如果您想保留十级撤消,您可以通过仅保留两个不可变对象(immutable对象)(一个是当前对象,一个是十个“撤消”之前的对象)以及在之间应用的命令列表来节省内存。他们。

要执行“撤消”操作,您需要重新执行除最后一个 Command 对象之外的所有命令,将其用作新的当前对象,并删除最后一个 Command(或将其保存为“重做”对象)。每次执行新操作时,都会更新当前对象,将关联的命令添加到列表中,然后(如果列表超过十个命令长)从撤消列表的开头执行对象上的第一个命令并丢弃列表中的第一个命令。

您还可以创建各种其他检查点系统,涉及系统的可变数量的完整表示以及它们之间的可变数量的命令。但它离你引用的最初想法越来越远,变得越来越像一个典型的可变系统。然而,它确实避免了使命令始终可逆的问题;您只需要向前应用命令到对象,而不是向后应用命令。

SVN 和其他版本控制系统实际上是基于磁盘或网络的撤消和重做形式。

关于language-agnostic - 使用不可变对象(immutable对象)撤消/重做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1812978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com