回应模式 - 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进行的操作还原

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

Tips无名氏No.9999999

2099-01-01 00:00:01 ID: Tips

♡性♡感♡红♡名♡在♡线♡要♡饭♡
(〃∀〃) https://afdian.com/a/nmbxd

无标题无名氏No.59578392

2023-09-20(三)10:22:45 ID: TPWHppd (PO主)

>>No.59554353
这是好的,但是如果全局信息过于冗杂庞大,举个例子:有一亿个巨型对象分布在页面上,想要保存这样的信息可能就有点麻烦了

当然上面的话纯属抬杠( ゚∀。),99.999999%的情况都不会有这种鬼东西出现的,我这边想了想还是打算这么做了,毕竟反函数真的搓着有点反人类了(;´ヮ`)7

无标题无名氏No.59578413

2023-09-20(三)10:25:53 ID: TPWHppd (PO主)

>>No.59558566
小肥学的不多,sql的数据日志是不是就是这样的原理呀( ´∀`)

但是这种操作依赖于每个子操作独立化,对c++这种以函数模块为主要工作对象的程式语言来说很难做到吧?当然这只是小肥摸摸脑袋想出来的,肥哥能深入讲一下吗(つд⊂)

无标题无名氏No.59578422

2023-09-20(三)10:27:33 ID: TPWHppd (PO主)

>>No.59558873
比堆栈好很多呢!小肥我的猪脑袋想的全是先进后出,所以直接搓了两个堆栈一个放撤销一个放前进( ゚∀。)7肥哥说得有理,我这就去改掉(`ε´ (つ*⊂)

无标题无名氏No.59682606

2023-09-29(五)10:43:39 ID: uAT3F7D

>>No.59544379
可以看看设计模式里的命令模式 Command Pattern,也许能有所参考

无标题无名氏No.59952964

2023-10-25(三)14:40:02 ID: jbXXCqS

我不是很确定你到底要撤销什么,但我建议你了解一下可持久化数据结构

无标题无名氏No.60076803

2023-11-05(日)21:51:14 ID: QVtDlGV

取决于你要操作的数据是什么样的,常见的有硬盘文件的按页写时复制和数据库的操作日志

无标题无名氏No.62034082

2024-04-15(一)01:29:57 ID: TPWHppd (PO主)

>>No.59558873
>>No.59558566
>>No.59554353

谢谢这几位肥哥的建议,我最后结合了实际需求做了双向链表,内容则是操作前的单位状态

也就是在操作进行前,将进行操作的单位的状态保存下来,撤销/重做时恢复到对应的状态

要是按照一开始的反函数的思路来做( ゚∀。)7
后果不堪设想啊( ;`д´; )

无标题无名氏No.62066040

2024-04-17(三)16:25:37 ID: HC7XV0n

我在写go是这样做的,在不同操作间传递一个context,如果哪一步寄了就rollback

不知道有没有更好的办法