2013-02-25 65 views
0

我收到以下资源:Users,Projects等等。这些对象的初始化几乎是一样的:我接收一个散列或一个字符串。重构类提高可重用性

  • 如果我得到一个字符串,我应该向API发出请求以获取匹配的JSON,然后处理创建的getter方法。
  • 如果我得到了散列,我只需要处理创建的getter方法。

问题是API的url对于每个资源都是不同的。所以我最终做如下:

一个base模块的常用方法:

module Base 
    def initialize_resource_from_hash(resource, attributes) 
    resource.each_with_object(attributes) do |(k, v), attrs| 
     create_getter_method(k, v) if attrs.include?(k) 
    end 
    end 

    def initialize_resource_from_url(resource, attributes) 
    response = API.get(resource) 
    response.each_with_object(attributes) do |(k, v), attrs| 
     create_getter_method(k, v) if attrs.include?(k) 
    end 
    end 
end 

class User 
    include Base 
    ATTRIBUTES = %w(id name login password) 
    def initialize(resource) 
    case resource 
    when Hash 
     initialize_resource_from_hash(resource, ATTRIBUTES) 
    when String 
     initialize_resource_from_url(resource, ATTRIBUTES) 
    end 
    end 
end 

,然后将每个资源includeBase并调用这些初始化方法之一。有没有解决这个初始化问题的设计模式或好的做法,还是我解决得很好的方法?

+0

评论这里如果你有问题要了解这个问题。如果提问,我可以改进提供更多细节的问题。 – 2013-02-25 02:20:15

回答

0
class User 
    ATTRIBUTES = %w(id name login password) 
    def initialize(resource) 
    resource = API.get(resource) unless resource.kind_of?(Hash) 
    ATTRIBUTES.each{|k| create_getter_method(k, resource[k]) if resource.key?(k)} 
    end 
end