在库中包装第三方服务的最佳实践

Dan*_*nny 5 ruby api design-patterns ruby-on-rails

我有兴趣为我正在使用的第三方API编写库,我需要一些建议.在一次请求中,库的平均使用将涉及几个api调用.例如,一个api呼叫从第三方服务中抓取用户,然后另一个呼叫使用该用户抓取他/她的照片.每个API调用都将获得自己的库方法包装器以及处理错误/超时的额外逻辑,但我最大的问题是库是应该作为包含状态的单例还是作为一系列类方法.

例如:

user_id = ThirdParty.get_user("abc@gmail.com")
photos = ThirdParty.get_photos(user_id)
Run Code Online (Sandbox Code Playgroud)

要么

thirdpartyservice = ThirdPartyService.new("abc@gmail.com")
photos = thirdpartyservice.get_photos
Run Code Online (Sandbox Code Playgroud)

这些不一定是图书馆的确切设计,但我对每种方法的优缺点感到困惑.任何帮助都会很棒!

顺便说一句,我用的是红宝石!

Mik*_*wis 4

我会让库包含状态,因为这会降低用户端代码的复杂性(这就是 API 应该做的,增加简单性)。通过这种方法,用户不必跟踪该 user_id,因为库会保留该状态。

如果用户确实想要他们的 user_id (或库存储的任何其他数据),您可以attr_reader在库中创建一个来公开该数据。

要为 get_photos 方法添加灵活性,您可以执行以下操作:

class ThirdPartyService

  def get_photos(user_id=@id_stored_in_library)
    # do work
  end

end
Run Code Online (Sandbox Code Playgroud)

这样,它默认为存储的 ID,但它增加了灵活性,因为用户可以选择指定用户 ID。