2013-02-25 64 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