Ruby游戏状态JSON序列化与反序列化优化方案咨询
优化游戏状态序列化/反序列化的方案
你当前的代码直接操作对象内部属性,导致耦合度高且冗余。可以通过让各职责类自行管理序列化逻辑来优化,符合单一职责原则,同时降低代码重复。
步骤1:让Game/Guess类负责自身的序列化
把Game类(Guess的父类)的属性序列化逻辑封装到自身内部,避免Main类直接操作其私有/内部属性:
class Game # 将当前实例状态转为可序列化的Hash def to_save_hash { secret_word: secret_word, running_guess: running_guess, not_in_word: not_in_word } end # 从序列化Hash恢复实例状态 def load_from_hash(data) self.secret_word = data['secret_word'] self.running_guess = data['running_guess'] self.not_in_word = data['not_in_word'] end end # Guess类继承Game,无需额外修改(若有专属属性可重写上述方法扩展) class Guess < Game end
步骤2:简化Main类的序列化方法
利用Game类的封装方法,Main类只需处理自身属性,无需关心Game/Guess的内部结构:
def save_game(obj) saved_data = { score: obj.score, game_state: obj.new_guess.to_save_hash }.to_json save_file(saved_data) end def load_game(obj) saved_data = JSON.load_file('saved/saved_game.json') # 恢复Main自身属性 obj.score = saved_data['score'] # 调用Game的方法恢复游戏状态 obj.new_guess.load_from_hash(saved_data['game_state']) display_secret_hidden(obj.new_guess.running_guess) display_not_included_letters(obj.new_guess.not_in_word) play_rounds end
额外优化建议
- 提取常量:把保存文件路径抽成常量,避免硬编码:
SAVE_FILE_PATH = 'saved/saved_game.json' - 异常处理:加载文件时增加异常捕获,避免文件不存在/格式错误导致崩溃:
def load_game(obj) begin saved_data = JSON.load_file(SAVE_FILE_PATH) # ... 恢复逻辑 ... rescue Errno::ENOENT, JSON::ParserError => e puts "加载存档失败:#{e.message}" # 可添加默认初始化逻辑 end end - 封装Main自身序列化:如果Main类属性增多,也可以给Main添加类似
to_save_hash和load_from_hash的方法,进一步解耦。
内容的提问来源于stack exchange,提问作者JW Gim
相关产品推荐
相关产品推荐

