An Interest In:
Web News this Week
- April 27, 2024
- April 26, 2024
- April 25, 2024
- April 24, 2024
- April 23, 2024
- April 22, 2024
- April 21, 2024
SOLID - DIP
Princpio da inverso de dependncia
Mdulos de alto nvel no devem depender de mdulos de baixo nvel. Ambos devem depender de abstraes; Abstraes no devem depender de detalhes. Detalhes devem depender de abstraes.
Dependa de uma abstrao e no de uma implementao.
Por exemplo:
Temos uma classe Petshop que recebe no seu construtor um PetRepositorioMySQL e possui o mtodo CadastrarOuAtualizarPet() que verifica se o Pet informado j existe e o atualiza e caso contrrio, cria um novo cadastro.
public class Petshop { private readonly PetRepositorioMySQL _petRepositorioMySQL; public Petshop() { _petRepositorioMySQL = new PetRepositorioMySQL(); } public void _CadastrarOuAtualizarPet(string nome) { var pet = _petRepositorioMySQL.Get(nome); if (pet == null) _petRepositorioMySQL.Insert(pet); else _petRepositorioMySQL.Update(pet); } }
O problema que se um dia ns resolvssemos usar uma PetRepositorioSQLServer no lugar da PetRepositorioMySQL, mesmo as duas possuindo os mesmos metdos, precisaramos mudar a nossa classe Petshop. Nossa classe no deveria ter que saber como se instancia este repositrio ou como que ele se comporta internamente. S precisamos saber o que ele recebe e o que retorna.
Devido a isso, estamos quebrando o princpio da inverso de dependncia.
Soluo:
Criamos a interface IRepositorioGenerico e fazemos com que nossa classe PetRepositorioMySQL implementa-a.
public class PetRepositorioMySQL : IRepositorioGenerico { public Pet Get(string nome) { throw new NotImplementedException(); } public void Insert(Pet pet) { throw new NotImplementedException(); } public void Update(Pet pet) { throw new NotImplementedException(); } }
Dentro da classe Petshop, ns injetamos nossa classe PetRepositorioMySQL representada pela sua interface IRepositorioGenerico.
public class Petshop { private readonly IRepositorioGenerico _repositorio; public Petshop(IRepositorioGenerico repositorio) { _repositorio = repositorio; } public void _CadastrarOuAtualizarPet(string nome) { var pet = _repositorio.Get(nome); if (pet == null) _repositorio.Insert(pet); else _repositorio.Update(pet); } }
Assim a Petshop no obrigada a instanciar o repositrio, pois quem consumir esta classe deve passar as instncias j criadas no construtor dela. E se caso um dia precisemos mudar o repositrio, no precisaremos alterar a classe PetShop, desde que o novo repositrio implemente a mesma interface. Desta forma, invertemos o controle.
Original Link: https://dev.to/gbarbosa/solid-dip-1138
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To