有没有一种简单的方法来为一组不相关的对象定义一个公共接口?

时间:2010-07-31 06:36:59

标签: ruby hexagonal-architecture

我有一个序列化数据的类。我可能想将这些数据序列化为JSON,或者也许是YAML。在这种情况下,我可以干净地交换YAML for JSON对象吗?我希望我可以做类似以下的事情。这是一个梦想吗?

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

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

2 个答案:

答案 0 :(得分:2)

如果类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

答案 1 :(得分:0)

如果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