Olá, tudo bem com você?
Peço desculpas pela demora no retorno.
Em injeção de dependências (ID) temos que: se objeto A
depende de um objeto B
, o objeto A não deve criar importação do objeto B diretamente. Em vez disso, o objeto A deve fornecer uma maneira de injetar o objeto B. A responsabilidade de criação de objetos e injeção de dependências é delegada ao código externo e não ao código interno da classe.
Alguns dos benefícios dessa abordagem são:
- Baixo acoplamento de código
- Facilidade em testes unitários
- Flexibilidade a mudanças
- Eliminação de dependências desnecessárias, uma vez que fica explícito para quem consome a classe quais as dependências da mesma
Quando temos a injeção de dependências por propriedade através dos métodos getters e setters devemos passar a classe por parâmetro no método setter. Já o getter será para retornar um objeto dessa classe. Em resumo, um método setter tem a finalidade de atribuir um valor a um atributo, já o getter, tem a finalidade de retornar o valor daquele atributo.
Suponha que temos inicialmente duas classes: Pessoa
e Endereco
, essas duas classes possuem métodos simples que apenas retornam um nome e um endereço:
class Pessoa:
def nome_pessoa(self):
return "Rafael"
class Endereco:
def endereco_pessoa(self):
return "São Paulo"
Posterior a isso, temos a classe Cliente
, que depende tanto de Pessoa
, quanto de Endereco
. Por termos essa dependência, podemos usar a Injeção de dependências para estruturar um código mais enxuto e adepto a boas práticas. Inicialmente, vamos criar os métodos setters e getters seguindo a ID para a classe pessoa dentro da classe Cliente
:
class Cliente:
def set_pessoa(self, pessoa: Pessoa):
self.pessoa = pessoa
def get_pessoa(self):
return self.pessoa
No código acima, nosso método set_pessoa
que recebe como parâmetro um objeto do tipo Pessoa
(denotado pelo Typing Hint “:Pessoa”). E no método get_pessoa
, retorna o objeto da classe Pessoa
.
Seguindo isso, abaixo temos a implementação do setter e getter para o objeto da classe Endereco
:
class Cliente:
def set_pessoa(self, pessoa: Pessoa):
self.pessoa = pessoa
def get_pessoa(self):
return self.pessoa
def set_endereco(self, endereco: Endereco):
self.endereco = endereco
def get_endereco(self):
return self.endereco
Fora isso, caso fosse necessário usar algum método das classes Pessoa
e Endereco
, também poderíamos realizar, como mostro abaixo no método dados_do_cliente
:
class Cliente:
def set_pessoa(self, pessoa: Pessoa):
self.pessoa = pessoa
def get_pessoa(self):
return self.pessoa
def set_endereco(self, endereco: Endereco):
self.endereco = endereco
def get_endereco(self):
return self.endereco
def dados_do_cliente(self):
print(f"Nome do Cliente: {self.pessoa.nome_pessoa()} - Endereço: {self.endereco.endereco_pessoa()}")
Com a nossa classe pronta, precisamos instanciá-la e definir de fato a injeção de dependências, onde passaremos os objetos da classe Pessoa
e Endereco
através do método setter
:
# Criação dos objetos
obj_pessoa = Pessoa()
obj_endereco = Endereco()
obj_cliente = Cliente()
# Injetando as Dependências
obj_cliente.set_pessoa(obj_pessoa)
obj_cliente.set_endereco(obj_endereco)
# Usando os dados injetados
obj_cliente.dados_do_cliente()
Resultado:
Nome do Cliente: Rafael - Endereço: São Paulo
Como recomendação de leitura, deixo abaixo os artigos que tratam sobre o tema de injeção de dependências:
Os artigos acima estão em inglês, caso tenha dificuldade com o idioma, recomendo o uso do tradutor do navegador.
Fico à disposição em caso de dúvidas.
Abraços e bons estudos.
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!