acoplamento e coesão
DESCRIPTION
Acoplamento e Coesão. Modelagem e Programação Orientada a Objetos Curso Superior de Tecnologia em Sistemas para Internet Prof. Cristiano Stüpp Nunes [email protected]. Acoplamento. - PowerPoint PPT PresentationTRANSCRIPT
Acoplamento e Coesão
Modelagem e Programação
Orientada a ObjetosCurso Superior de Tecnologia em Sistemas para Internet
Prof. Cristiano Stüpp Nunes
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
2
Acoplamento
Acoplamento é uma medida “inter” componentes, no caso de OO, uma medida entre o relacionamento de classes;
É o grau de dependência entre classes; Refere-se ao nível em que uma classe conhece ou
usa membros de uma outra classe; Os dois espectros dessa medida são:
» Baixo Acoplamento (ou Acoplamento Fraco)
» Alto Acoplamento (ou Acoplamento Forte )
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
3
Baixo Acoplamento
Se o único conhecimento que a classe A tem sobre a classe B, é que a classe B foi exposta através de sua interface, então as classes A e B tem um baixo acoplamento;
Baixo acoplamento é o estado desejável para classes bem encapsuladas que minimizam as referências umas às outras.
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
4
Alto Acoplamento
Se a classe A se baseia em partes da classe B que não fazem parte da interface de B, então elas são bastante acopladas;
Em outras palavras, se A sabe mais do que deveria sobre a forma como B foi implementada, então A e B estão bastante ligadas;
O alto acoplamento é o estado indesejável de se ter classes que desobedecem às regras do baixo acoplamento.
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
5
Problemas do Alto Acoplamento
Difícil entendimento:» A classe é mais difícil de se entender isoladamente;
» Exemplo: Ao tentar encontrar um erro no seu sistema, você começa a analisar uma determinada classe A e descobre que para entender essa classe A, precisa estudar a classe B que está ligada a ela, para também entender esta, precisa estudar a classe C, e assim por diante.
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
6
Problemas do Alto Acoplamento
Difícil reutilização:» A classe é mais difícil de ser reusada, já que
depende da presença de outras classes;
» Exemplo: Digamos que seja necessário retirar uma determinada parte do sistema, algo como um módulo de calcular folha de pagamento de um sistema financeiro, para ser levada e adequada a outro sistema financeiro, imagine que as classes responsáveis por isso, estejam ligadas ao módulo de RH, você vai levar o módulo de RH junto?
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
7
Problemas do Alto Acoplamento
Propagação de mudanças:» Mudanças em uma classe relacionada força
mudanças locais à classe;
» Exemplo: Imagine que seja necessário mudar uma classe do módulo de folha de pagamento, para isso, teria que mudar a classe que está no módulo de RH, e se você não for o responsável pelo módulo de RH? E se além de ter que mudar esta classe, também mudar várias outras que estão ligadas à primeira.
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
8
Exemplo de Alto Acoplamento
public class Contato {
//atributos não encapsuladosString nome;String endereco;String fone;
//construtor que depende do tipo e quantidade de atributospublic Contato(String n, String e, String f) {
nome = n;endereco = e;fone = f;
}
}
Dada um simples classe Contato (mal implementada):
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
9
Exemplo de Alto Acoplamento
public class DAO {
public String incluiContato(Contato contato) {
//como Contato não é encapsulado, //permite que esse metódo acesso os atributos diretamente
return "INSERT INTO TABLE contatos VALUES ('" + contato.nome + "', '" + contato.endereco + "', '" + contato.fone +"')";
}}
A classe DAO tem um considerável nível de dependência em relação a classe Contato
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
10
Exemplo de Alto Acoplamento
A classe Controlador tem dependência em relação a classe DAO e Contato
public class Controlador {
private DAO dao = new DAO();//uma alteração na implementação da classe Contato //pode exigir alterações na classe Controladorprivate Contato contato = new Contato("Angelina Jolie",
"Fifth Avenue, NY", "1-415-8273");
public void persistaDados() {//uma alteração na implementação da classe Contato //pode exigir alterações na classe DAOdao.incluiContato(contato);
}}
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
11
Herança versus Alto Acoplamento
“Herança é um tipo de acoplamento particularmente forte.”
A alteração da implementação de um método na superclasse vai afetar todas as subclasses dessa;
Design Patterns dão prioridade a Composição e aconselham utilizar Herança com muita prudência e em pouquíssimas situações;
Ao usar Composição tome cuidado para não deixar as classes fortemente dependentes, pois ainda assim corre-se o risco do alto acoplamento.
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
12
Como minimizar o Alto Acoplamento
Encapsulamento (sempre); Uso de Design Patterns (Padrões de Projeto); Classes Abstratas; Uso de Interface; Evitar o uso malfeito de Herança;
“Program to an interface, not an implementation” (Erich Gamma)
“Programe voltado à interface e não à implementação”
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
13
Program to an interface, not an implementation
Não significa estritamente e somente usar a palavra reservada interface do Java;
Está também relacionado a encapsular os atributos e a implementação dos métodos e permitir o acesso a eles somente através dos getters e setters (interface);
Interface é um termo genérico nesse caso; Interface representa “o que” uma classe faz, mas
não “como” ela faz.
public interface Mamifero {public void
nascer();public void
mamar();public void
morrer();}
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
14
Coesão
Coesão é uma medida “intra” componentes, isto é, procura medir um componente individualmente;
Refere-se ao nível em que uma classe tem um único e bem definido papel ou responsabilidade;
Os dois espectros dessa medida são:» Baixa Coesão (Coesão Fraca)
» Alta Coesão (Coesão Forte)
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
15
Baixa Coesão
Baixa coesão é o estado indesejável de uma classe cujos membros dão suporte a vários papéis ou responsabilidades não focados;
Uma classe com baixa coesão faz muitas coisas não relacionadas e leva aos seguintes problemas:» Difícil de entender
» Difícil de reusar
» Difícil de manter
» E é “delicada“ – constantemente afetada por outras mudanças
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
16
Exemplo de Baixa Coesãopublic class Angu {
public String funcionario;private float perimetro;public float nota_bimestral;private float valor_mensal;
public static int calculaDiametro(float raio) {// ...
}
public static int calcularMedia(Vector numeros) {// ...
}
public static outputStream abreArquivo(String nomeArquivo) {// ...
}}
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
17
Alta Coesão
Alta coesão é o estado desejável de uma classe cujos membros dão suporte a um único e bem definido papel ou responsabilidade;
Também conhecida como Coesão Funcional; O principal benefício da alta coesão é que
normalmente tais classes são mais fáceis de manter (e menos freqüentemente alteradas) do que as classes com baixa coesão;
Quanto maior for a coesão, menor será o nível de acoplamento de um módulo.
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
18
Exemplo de Alta Coesão
A implementação de um JavaBean (ou entity bean – bean de entidade) é um exemplo claro de altíssima coesão:
public class Contato {
private String nome;private String fone;
public Contato() { }
public String getNome() { return nome; }public void setNome(String nome) { this.nome = nome; }public String getFone() { return fone; }public void setFone(String fone) { this.fone = fone; }
}
Modelagem e Programação Orientada a ObjetosCurso Superior em Tecnologia de Sistemas para Internet
19
Implementação Ideal
“Alta coesão e baixo acoplamento.”
Não é simples e nem fácil de se alcançar; Mas podemos tentar chegar próximo do ideal.