Я полагаю, что наилучшей практикой является использование провайдера и сервисов, чтобы не быть привязанными к конкретному провайдеру услуг. Вместо того, чтобы просто обернуть библиотеку, вы можете немного абстрагировать ее и по умолчанию разрешить только одного поставщика услуг.
Хотя наследование на самом деле не требуется в языке динамической / утиной типизации, таком как Ruby, это может помочь конкретизировать «почему».
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
Тогда в вашем коде вы можете получить что-то вроде этого:
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!' })
Затем шесть месяцев спустя, когда ваши пользователи любят вашу Gem / библиотеку, но хотят поддержки MailChimp, вы можете просто создать вторую службу «MailChimpService» и позволить своим клиентам использовать нового провайдера.