Programando visando só a interface?

4 respostas
J

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!!

4 Respostas

J

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
   }
}
Aí tenho esse codigo:
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

J

Cara!! Valeu mesmo!! Foi bem explicado!!
Fique com Deus!!

J

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!!

J

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…

Criado 15 de setembro de 2006
Ultima resposta 15 de set. de 2006
Respostas 4
Participantes 2