Dae galera!! Eu li algo a algum tempo falando que deve-se programar através de interfaces!!! Que isso evitaria acoplamento e coisas do gênero!! Alguém pode comentar isso ou esclarecer como pode-se evitar acoplamento utilizando esse recurso?
Valeu!!
Programando visando só a interface?
4 Respostas
Basicamente se você usar como tipo uma interface inves de uma classe concreta você não depende de uma classe concreta especifica e sim de qualquer uma que implemente aquela interface, se você decidir mudar a classe concreta não haverá nenhum impacto no uso dela, pois ela está sendo acessada atraves de uma interface.
ex.:
ArrayList lista = new ArrayList();
lista.add("obj1");
lista.add("obj2");
Nesse caso eu sou dependente da classe concreta ArrayList e minha classe tem uma forte ligação com ela.
List lista = new ArrayList();
lista.add("obj1");
lista.add("obj2");
Já nesse caso eu não dependo de uma classe concreta especifica e sim da interface List, e posso usar qualquer classe que implemente essa interface no lugar de ArrayList sem ter nenhum impacto sobre o restante do codigo. veja:
List lista = new LikedList();
lista.add("obj1");
lista.add("obj2");
Veja um exemplo mais intuitivo do beneficio:
Suponhamos que eu tenha uma classe de acesso a dados via JDBC e use ela assim:
public class UsuarioDaoJdbc{
public Usuario obter(int i){
//obtem do banco de dados
}
}
UsuarioDaoJdbc dao = new UsuarioDaoJdbc();
Usuario usu = dao.obter(1);
Eu teria uma dor de cabeça enorme se de repente eu decidisse alterar de JDBC para XML por exemplo.
Já se você usar interfaces para tipificar, a mudaça é muito simples:
public interface UsuarioDao{
public Usuario obter(int i);
}
public class UsuarioDaoJdbc implements UsuarioDao{
public Usuario obter(int i){
//obtem do banco de dados
}
}
public class UsuarioDaoXml implements UsuarioDao{
public Usuario obter(int i){
//obtem do xml
}
}
UsuarioDao dao = new UsuarioDaoJdbc();
Usuario usu = dao.obter(1);
Se eu quiser mudar é só fazer isso:
UsuarioDao dao = new UsuarioDaoXml();
Usuario usu = dao.obter(1);
Há uma serie de Design Patterns que podem te ajudar a implementar essa ligação fraca melhor, como o Factory, Strategy, etc...
Eu recomendo o livro "Head First: Design Patterns" pra você conhecer mais.
http://en.wikipedia.org/wiki/Factory_method_pattern
http://en.wikipedia.org/wiki/Strategy_pattern
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html
Cara!! Valeu mesmo!! Foi bem explicado!!
Fique com Deus!!
Ah!! Não sendo chato!! Quais outras situações normamente se usa essa técnica, você sitou o DAO, terias outros exemplos? E também alguma situação em que não deve ser aplicado essa técnica!!
Valeu!!
Qualquer situação, o ideal é manter o minimo de acoplamento… não necessariamente usando esses patterns que eu citei em todos os casos, mas o acoplamento o ideal é manter o minimo, pra você não ter que alterar muito o codigo no caso de uma mudança… e possivelmente inserindo um erro novo nele…