Inversão de controle (IoC) usando Ruby
A inversão de controle (IoC, do inglês “Inversion of Control”) é um padrão de projeto que visa inverter a responsabilidade de criar e manter dependências entre objetos. Em vez de um objeto criar e manter suas próprias dependências, essas dependências são passadas para ele através de sua construção ou através de um método de configuração.
Aqui está um exemplo de como o padrão de inversão de controle pode ser implementado em Ruby:
class User
def initialize(name, email)
@name = name
@email = email
end
def send_email(message)
# O objeto User depende da classe EmailSender para enviar emails
EmailSender.new.send_email(@email, message)
end
end
class EmailSender
def send_email(email, message)
# Aqui estamos enviando o email de fato
end
end
Em vez de criarmos uma instância de EmailSender
dentro do objeto User
, podemos passar uma instância de EmailSender
para o objeto User
através de seu construtor ou através de um método de configuração, invertendo o controle da criação da dependência para o objeto que a utiliza.
user = User.new("João", "joao@example.com")
email_sender = EmailSender.new
user.send_email("Olá, como você está?", email_sender)
Neste exemplo, a classe User
depende da classe EmailSender
para enviar emails.
Em vez de criarmos uma instância de EmailSender
dentro da classe User
, passamos uma instância de EmailSender
para o objeto User
através de seu construtor ou através de um método de configuração.
class User
def initialize(name, email)
@name = name
@email = email
end
def send_email(message, email_sender)
email_sender.send_email(@email, message)
end
end
class EmailSender
def send_email(email, message)
# Aqui estamos enviando o email de fato
end
end
Invertendo o controle da criação da dependência para o objeto que a utiliza. Isso nos permite trocar facilmente a implementação da classe EmailSender
sem precisar alterar o código da classe User
.