You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:01:27