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]
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 Objetos
Curso 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 Objetos
Curso 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 Objetos
Curso 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 Objetos
Curso 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 Objetos
Curso 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 Objetos
Curso Superior em Tecnologia de Sistemas para Internet
8
Exemplo de Alto Acoplamento
 Dada um simples classe Contato (mal
implementada):
public class Contato {
//atributos não encapsulados
String nome;
String endereco;
String fone;
//construtor que depende do tipo e quantidade de atributos
public Contato(String n, String e, String f) {
nome = n;
endereco = e;
fone = f;
}
}
Modelagem e Programação Orientada a Objetos
Curso 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 Objetos
Curso Superior em Tecnologia de Sistemas para Internet
10
Exemplo de Alto Acoplamento
public class Controlador {
private DAO dao = new DAO();
//uma alteração na implementação da classe Contato
//pode exigir alterações na classe Controlador
private 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 DAO
dao.incluiContato(contato);
}
}
 A classe Controlador tem dependência em
relação a classe DAO e Contato
Modelagem e Programação Orientada a Objetos
Curso 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 Objetos
Curso 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 Objetos
Curso 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;
public interface Mamifero {
public void nascer();
public void mamar();
public void morrer();
}
 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.
Modelagem e Programação Orientada a Objetos
Curso 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 Objetos
Curso 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 Objetos
Curso Superior em Tecnologia de Sistemas para Internet
16
Exemplo de Baixa Coesão
public 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 Objetos
Curso 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 Objetos
Curso 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
public
public
public
}
String getNome() { return
void setNome(String nome)
String getFone() { return
void setFone(String fone)
nome; }
{ this.nome = nome; }
fone; }
{ this.fone = fone; }
}
Modelagem e Programação Orientada a Objetos
Curso 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.
Modelagem e Programação Orientada a Objetos
Curso Superior em Tecnologia de Sistemas para Internet
Download

Acoplamento - Modelagem e Programação Orientada a Objetos