新闻动态

游戏规则观察课:存档差分中的设置为零与删除字段——四项设置的十三条差分(练习11)

2026-10-28

差分记录只描述变化,比完整快照更紧凑,但删除字段与把数值改成零并不是同一件事。若读取端把二者混在一起,默认设置和明确设置就会产生歧义。

下面使用独立的一组输入,逐步记录规则如何产生结果。建议先自行推演,再寻找与记录第一次不同的位置;检查时间单位、端点归属和处理顺序。所有约定均限定在本例中,其他作品采用不同实现并不自动意味着出错。

本例约定与输入

本例记录整数属性映射,操作只有设置某字段或删除某字段。设置为零仍保留字段;删除后字段缺席,界面读取时才采用给定默认值。按记录顺序应用,不涉及加密或实际文件损坏恢复。

默认值{'亮度': 5, '音量': 4, '镜头速度': 3, '字幕大小': 2} 初始保存字段{'音量': 4, '镜头速度': 3} [['设置', '亮度', 0], ['删除', '亮度', None], ['删除', '亮度', None], ['设置', '音量', 6], ['设置', '镜头速度', 1], ['删除', '镜头速度', 7], ['设置', '音量', 3], ['设置', '亮度', 4], ['设置', '音量', 4], ['删除', '镜头速度', 8], ['删除', '音量', 2], ['删除', '亮度', 4], ['删除', '镜头速度', 3]]

过程与结果

操作1:设置亮度为0;实际保存字段{'音量': 4, '镜头速度': 3, '亮度': 0},读取后显示{'亮度': 0, '音量': 4, '镜头速度': 3, '字幕大小': 2}。

操作2:删除亮度;实际保存字段{'音量': 4, '镜头速度': 3},读取后显示{'亮度': 5, '音量': 4, '镜头速度': 3, '字幕大小': 2}。

操作3:删除亮度;实际保存字段{'音量': 4, '镜头速度': 3},读取后显示{'亮度': 5, '音量': 4, '镜头速度': 3, '字幕大小': 2}。

操作4:设置音量为6;实际保存字段{'音量': 6, '镜头速度': 3},读取后显示{'亮度': 5, '音量': 6, '镜头速度': 3, '字幕大小': 2}。

操作5:设置镜头速度为1;实际保存字段{'音量': 6, '镜头速度': 1},读取后显示{'亮度': 5, '音量': 6, '镜头速度': 1, '字幕大小': 2}。

操作6:删除镜头速度;实际保存字段{'音量': 6},读取后显示{'亮度': 5, '音量': 6, '镜头速度': 3, '字幕大小': 2}。

操作7:设置音量为3;实际保存字段{'音量': 3},读取后显示{'亮度': 5, '音量': 3, '镜头速度': 3, '字幕大小': 2}。

操作8:设置亮度为4;实际保存字段{'音量': 3, '亮度': 4},读取后显示{'亮度': 4, '音量': 3, '镜头速度': 3, '字幕大小': 2}。

操作9:设置音量为4;实际保存字段{'音量': 4, '亮度': 4},读取后显示{'亮度': 4, '音量': 4, '镜头速度': 3, '字幕大小': 2}。

操作10:删除镜头速度;实际保存字段{'音量': 4, '亮度': 4},读取后显示{'亮度': 4, '音量': 4, '镜头速度': 3, '字幕大小': 2}。

操作11:删除音量;实际保存字段{'亮度': 4},读取后显示{'亮度': 4, '音量': 4, '镜头速度': 3, '字幕大小': 2}。

操作12:删除亮度;实际保存字段{},读取后显示{'亮度': 5, '音量': 4, '镜头速度': 3, '字幕大小': 2}。

操作13:删除镜头速度;实际保存字段{},读取后显示{'亮度': 5, '音量': 4, '镜头速度': 3, '字幕大小': 2}。

最后实际字段为{},缺席字段通过默认值读取,但并未重新写入保存映射。

如何独立复核

对每个字段寻找截至当前最后一次操作;最后为删除就应缺席,最后为设置就应取该值,没有操作则保留初始值。分别核对字段是否存在与显示值,避免只比较数值。

删除请求指向不存在的字段时,本例视为无变化;设置同一个值多次也不会叠加。若改成加减数值的差分操作,重复处理就可能改变结果,因此操作类型必须随记录一起保存。

测试时保留原始数据与中间状态,再只改变一个条件作比较。先检查空状态、相等边界、重复输入和最后一步,再比较整体结果;不要为了让最后的数字相同而跳过前面已经出现的差异。明确规则后,复核才有可以重复的依据。

准备好开始吧,它既快速又简单。