2013-02-25 1 views
0

다음 자원을 얻었습니다 : Users, Projects 등등. 이러한 객체의 초기화는 거의 동일합니다. 해시 또는 문자열을받습니다.재사용 성을 향상시키기위한 리팩토링 클래스

  • 문자열이있는 경우 일치하는 JSON을 가져온 다음 getter 메서드를 만드는 과정을 API에 요청해야합니다.
  • 해시를 얻은 경우 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

문제를 이해하는 데 문제가있는 경우 여기에 설명을 추가하십시오. 질문을하면 더 자세한 내용을 제공하는 질문을 개선 할 수 있습니다. –

답변

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 
관련 문제