【问题标题】:Is there an easy way to define a common interface for a group of unrelated objects?有没有一种简单的方法可以为一组不相关的对象定义一个通用接口?
【发布时间】:2010-07-31 06:36:58
【问题描述】:

我有一个序列化数据的类。我可能想将此数据序列化为 JSON 或 YAML。在这种情况下,我可以干净地将 YAML 换成 JSON 对象吗?我希望我能做类似下面的事情。这是白日梦吗?

FORMATS = {
  :json => JSON,
  :yaml => YAML,
}

def serialize(data, format)
  FORMATS[format].serialize(data)
end

【问题讨论】:

    标签: ruby hexagonal-architecture


    【解决方案1】:

    只要类JSONYAML 都有名为serialize 的类方法,您编写的代码应该可以正常工作。但我认为实际存在的方法是#dump

    所以,你会:

    require 'json'
    require 'yaml'
    
    FORMATS = {
      :json => JSON,
      :yaml => YAML,
    }
    
    def serialize(data, format)
      FORMATS[format].dump(data)
    end
    
    hash = {:a => 2}
    puts serialize hash, :json
    #=> {"a":2}
    
    puts serialize hash, :yaml
    #=> --- 
    #=> :a: 2
    

    【讨论】:

    • 甜蜜。所以他们已经有了一个通用的序列化接口。现在,反序列化怎么样?
    【解决方案2】:

    如果JSONYAML是已经存在的类或模块,你可以这样写:

    FORMATS = { :json => "JSON", :yaml => "YAML" }
    
    def serialize(data, format)
        Kernel.const_get(FORMATS[format]).serialize(data) # 'serialize' is a class method in this case
    end
    

    【讨论】:

    • 实际上,您不需要将类与字符串相互转换,OP 发布的示例应该可以正常工作,因为类是 Ruby 中的对象。
    • 是的,但我认为在提供的示例中类名是字符串。我的错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2011-02-13
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多