2011-04-25 2 views
4

사용중인 타사 API에 대한 라이브러리 작성에 관심이 있으며 조언이 필요합니다. 라이브러리의 평균 사용은 한 번의 요청으로 여러 api 호출을 포함합니다. 예를 들어 한 API 호출을 통해 제 3 자 서비스에서 사용자를 얻은 다음 해당 사용자가 자신의 사진을 가져올 다른 호출을 호출합니다. 각 API 호출은 오류/시간 초과를 처리하기위한 추가 논리가있는 고유 한 라이브러리 메소드 래퍼를 갖지만 가장 큰 문제는 라이브러리가 상태를 포함하는 싱글 톤으로 작성되어야하는지 일련의 클래스 메소드로 작성되어야하는지 여부입니다. 예를 들어라이브러리에 타사 서비스를 래핑하는 모범 사례

:

user_id = ThirdParty.get_user("[email protected]") 
photos = ThirdParty.get_photos(user_id) 

또는

thirdpartyservice = ThirdPartyService.new("[email protected]") 
photos = thirdpartyservice.get_photos 

다음은 라이브러리의 정확한 deseign 일 필요는 없지만, 난 그냥 각 방법의 장점/단점에 대해 혼란 스러워요. 어떤 도움이 굉장 할 것입니다!

Btw, 저는 루비를 사용하고 있습니다!

+1

라이브러리를 싱글 톤으로 만드는 것과 관련된 질문에 대해서는 라이브러리 클래스의 상태를 유지할 필요가 없음을 알고 있기 때문에 정적 메서드를 사용하여 정적 클래스로 만드는 것이 좋습니다. –

답변

4

나는 라이브러리가 사용자 측면의 코드 복잡성을 줄이기 때문에 상태를 포함하게됩니다 (API가하는 일로 단순성이 향상됩니다). 이 방법을 사용하면 라이브러리가 상태를 유지하므로 사용자는 user_id를 추적 할 필요가 없습니다.

사용자가 자신의 user_id (또는 라이브러리가 저장하는 다른 데이터)를 실제로 원한다면 라이브러리에 attr_reader을 만들어 해당 데이터를 노출 할 수 있습니다. 그가 그렇게 선택하는 경우 사용자가 사용자 ID를 지정할 수 있습니다, 그러나 그것은 그 유연성을 추가,

class ThirdPartyService 

    def get_photos([email protected]_stored_in_library) 
    # do work 
    end 

end 

저장된 ID가 기본값이 방법 :

당신이 뭔가를 할 수 있으며, get_photos 방법에 대한 fleixiblity을 추가하려면 .

0

get_set_ 대신 getters 및 setter를 사용하는 것이 좋습니다. 그것은 루비 표준 (확실하지 않지만 get_ 및 set_ 메소드는 루비 코드에서 한 번만 보았습니다)입니다.

요청간에 일부 상태를 저장할 필요가없는 경우 정적으로 설정하십시오. 그러나 그것은 많은 요소들에 달려 있습니다. 포장해야 할 API를 알려주시겠습니까?

2

하나의 싱글 톤 객체가 아닌 객체를 사용해야하므로 상태 (호스트, 기타) 및 해당 상태를 기반으로하는 동작이 필요합니다.

앞서 언급 한 것처럼 get_photos과 같은 메서드는 사용하지 말고 단지 photos과 같은 이름을 지정하면 안됩니다.

+0

나는 명명 표준에 동의한다. 호스트와 관련하여, 그 정보는 모두 일정합니다. 호스트 및 oauth 토큰 정보는 모든 호출에 대해 동일합니다. 아직도 싱글 톤을 사용하지 말아야한다고 생각하니? – Danny

+0

예. (약간의 패딩) –

1

특정 서비스 공급자에게 묶이지 않는 기능을 위해 공급자와 서비스를 사용하는 것이 가장 좋습니다. 단순히 라이브러리를 래핑하는 대신 조금 추상화하고 기본적으로 단일 서비스 제공자 만 허용 할 수 있습니다.

Ruby와 같은 동적/오리 유형 언어에서는 상속이 실제로 필요하지 않지만 이것이 '이유'를 구체적으로 나타낼 수 있습니다.사용자가 당신의 보석/라이브러리를 사랑하지만 메일 침프 지원을 할 때

config.mail_provider = SendGridService.new({ 
    username: ENV['SENDGRID_USERNAME'], 
    password: ENV['SENDGRID_PASSWORD'] 
}) 

config.mail_provider.send_mail({ subject: 'woot', message: 'Look ma, I did it!' }) 

그런 다음 6 개월 후 당신은 단순히 두 번째 서비스 '를 만들 수 있습니다

class MailProvider 

    def initialize(args); raise "Not Implemented"; end 

    def send_mail(args); raise "Not Implemented"; end 

end 

class SendGridService < MailProvider 

    def initialize(args) 
    # Use args here 
    end 

    def send_mail(args) 
    # Use SendGrid's API or Gem here 
    end 

end 

그런 다음 코드에서 당신이 뭔가를 할 수 있습니다 MailChimpService '를 사용하고 클라이언트가 새 공급자를 사용할 수있게합니다.