回应模式 - No.59544379


No.59544379 - 技术宅


无标题无名氏No.59544379 只看PO

2023-09-17(日)14:58:18 ID:TPWHppd 回应

关于撤销功能做法,肥哥们有什么建议吗?

小肥我只会这么做:

1.在事件A结束前将A进行的操作信息a放入堆栈里

2.在撤销时读取堆栈里的操作信息a,调用对应的反事件A-

3.反事件A-使用a中的信息来将事件A进行的操作还原

肥哥,请指导我(つд⊂)

无标题无名氏No.59544421

2023-09-17(日)15:02:40 ID: 8hxlYPV

撤销就是栈
后入先出

无标题无名氏No.59544517

2023-09-17(日)15:12:06 ID: KSfAYM3

每操作一次就保存一份|∀゚

无标题无名氏No.59545541

2023-09-17(日)16:49:35 ID: TPWHppd (PO主)

>>No.59544421
这种基础小肥还是有的,主要是想知道有没有比较新颖的实现方法和思路,网上搜出来的都是原理解析之类,我希望能得到一些更具体更高效的做法(つд⊂)

无标题无名氏No.59545588

2023-09-17(日)16:53:13 ID: TPWHppd (PO主)

>>No.59544517
( ゚∀。)b好思路,如果能被撤销的事件过多或者过于复杂的话,做反函数也是很麻烦的一件事

( ゚∀。)7小肥还是大学生没有实际工作经验,不是很了解这方面,这种方法是否是常用的呢?如果保存做得够好,对空间占用够小的话,这个说不定更实用呢(`ε´ )

无标题无名氏No.59549869

2023-09-17(日)22:40:36 ID: rAqxtB9

双向链表队列也许会更好,尾部存储头部删除,每个节点各有指向前后的指针,再封装一下只保留头尾指针访问接口。

无标题无名氏No.59550256

2023-09-17(日)23:07:07 ID: TPWHppd (PO主)

>>No.59549869
这样是为了"重做redo"更便捷吗?只看"撤销"的话,小肥有点不理解这样的结构的优势,还请肥哥不吝赐教(つд⊂)

另外,其实我想的是有没有除了:do→undo,之外的撤销方法,因为写反函数和相关的调用判定真的好麻烦哦( ;`д´; )
都2023年了,还没有一种开创性的简便算法来做这件事吗( `ᵂ´)

无标题无名氏No.59554353

2023-09-18(一)10:55:00 ID: rAqxtB9

>>No.59550256
栈存入的信息从“操作”改为“状态”,每次执行完成后记录当前全局的信息并作为“状态”存储,撤销时读取上一个“状态”。

无标题无名氏No.59558566

2023-09-18(一)17:37:25 ID: Flni6rg

不要用 反 函数
应该根据操作队列从头执行一遍生成数据。
撤销就把队尾移除然后执行一遍数据。
你还可以把移除的数据存入另外一个栈,实现“撤销”的“撤销”,既前进功能

无标题无名氏No.59558873

2023-09-18(一)18:02:05 ID: uBidyMI

我一般用链表储存操作,然后用“指针”指向当前操作,撤销就是把“指针”往前移,回退就重新把指针移回去