1
resposta

Injeção de dependência por propriedade

Olá!

As injeções por construtor e interface expostas no artigo da atividade até consegui acompanhar e visualizar como aplicá-las, mas a última (injeção por propriedades) ficou mais abstrata aqui para mim...

Em que situações ela seria recomendada/aplicável? Como a faríamos em Python?

Agradeço também recomendações de leituras adicionais.

Muito obrigado!

1 resposta

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!