Beruflich Dokumente
Kultur Dokumente
discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/261026207
READS
116
1 AUTHOR:
Leandro Luque
Centro Paula Souza
23 PUBLICATIONS 1 CITATION
SEE PROFILE
Coeso e Acoplamento em
Sistemas Orientados a Objetos
Melhorando a qualidade de seus projetos.
Conhea os conceitos de coeso e acoplamento e como eles podem
influenciar no desenvolvimento de sistemas com maior qualidade.
Coeso
Estendendo a definio clssica de coeso para o paradigma orientado a objetos, podese definir coeso de um sistema de software como a relao existente entre as
responsabilidades de uma determinada classe e de cada um de seus mtodos. Uma
classe altamente coesa tem responsabilidades e propsitos claros e bem definidos,
enquanto uma classe com baixa coeso tem muitas responsabilidades diferentes e pouco
relacionadas.
Para se ter uma ideia de classes com nveis diferentes de coeso, vamos analisar dois
exemplos de classes retiradas de um sistema bancrio e de um sistema de locadora de
vdeos, representadas nas Figuras 1 e 2, respectivamente.
Por outro lado, a classe Cliente, do sistema de locadora (Figura 2), alm de possuir
atributos referentes a clientes, possui um mtodo para a realizao de aluguel de filmes.
Essa modelagem muito comum entre iniciantes e surge, na maioria das vezes, de um
entendimento incorreto do mapeamento do diagrama de casos de uso para o diagrama
de classes. Como no diagrama de casos de uso de uma locadora geralmente h uma
associao entre o ator Cliente e o caso de uso Alugar Filme, pode-se imaginar que
seja razovel definir um mtodo alugarFilme() na classe Cliente.
No entanto, esse tipo de definio faz com que a classe Cliente tenha baixa coeso (por
tratar de assuntos diferentes: clientes e aluguel de filmes). O problema dessa
modelagem que o reuso e o entendimento das classes, quando observadas
individualmente, ficam prejudicados.
Como exemplo ilustrativo do porqu de um baixo grau de coeso causar estes
problemas, vamos imaginar um cenrio bastante provvel de reuso da classe Cliente em
outros sistemas, como: Oficina Mecnica, Sistema Bancrio, entre outros.
Nestes sistemas, no faz sentido que um cliente alugue filmes (Figura 3). O mtodo
alugarFilme(), embora pudesse simplesmente no ser chamado nesses sistemas,
dificultaria o entendimento da classe Cliente, exigiria que a classe Filme tambm
estivesse disponvel e seria carregado como lixo, podendo inclusive causar algum tipo
de comportamento inesperado ou exceo, caso fosse executado.
Coeso de papel misto: ocorre quando classes do mesmo domnio, que podem
ser definidas de forma independente, mantm alguma dependncia. Este tipo de
coeso foi o mesmo existente no exemplo da Figura 2, no qual a classe Cliente
(domnio do negcio) apresentava uma dependncia desnecessria em relao
classe Filme (tambm do domnio do negcio). Os efeitos desse tipo de coeso j
foram citados no exemplo dado anteriormente.
Coeso de mtodos:
Coeso alternada: ocorre quando um mtodo agrega diversas etapas do
comportamento da classe, mas s realiza uma delas mediante especificao por
parmetro. Um exemplo deste tipo de coeso pode ser observado no mtodo
calcular() da classe Triangulo (Figura 7), que realiza o clculo da rea (quando o
parmetro area true) ou o permetro do tringulo (quando o parmetro area
false). Este tipo de coeso resulta em mtodos extensos, com muitas linhas de
cdigo, e de difcil manuteno. Este tipo de coeso pode ser percebido pela
existncia do conectivo OU no nome do mtodo;
Coeso mltipla: similar coeso alternada. A diferena que na coeso
mltipla, um mesmo mtodo realiza no s uma, mas diversas etapas do
comportamento da classe. O mtodo moverERedimensionarERotacionar() da
classe Triangulo (Figura 7) um exemplo de mtodo com esse tipo de coeso.
Este mtodo move um tringulo, o redimensiona e o rotaciona ao mesmo tempo
e, para isso, recebe como parmetros as novas posies x e y, as propores para
redimensionamento na horizontal (propH) e vertical (propV), e o ngulo para
rotao (ang). As mesmas observaes feitas sobre os mtodos com coeso
alternada so extensveis a esse tipo de coeso. Este tipo de coeso pode ser
percebido pela existncia do conectivo E no nome do mtodo;
Coeso funcional: ocorre quando um mtodo dedicado a uma nica etapa de
comportamento. Essa a coeso ideal para mtodos. Um exemplo desse tipo de
coeso pode ser observado no mtodo calcularArea() da classe Triangulo, que
realiza apenas o clculo da rea do tringulo e nada mais.
Figura 7. Exemplo de classe com mtodos com coeso alternada, mltipla e funcional.
Caso esta classe seja isolada do sistema para o qual ela est sendo
implementada, seria possvel entend-la?
o Em caso negativo, pode ser que as responsabilidades da classe no
estejam bem definidas.
Embora seja vlida a lio tirada de metodologias geis que diz que no produtivo
dispensar muito tempo procurando prever todos os cenrios de uso e reuso de uma
classe, a cautela na modelagem, sua verificao e validao, pelo menos em um nvel
superficial, podem ser de grande valia para a definio de um projeto coeso que
contribuir para a reduo do trabalho futuro com manuteno e facilitar o reuso.
Acoplamento
O outro dos conceitos abordados nesse artigo o acoplamento, que pode ser entendido
como a interdependncia existente entre diferentes classes. Quanto mais uma classe
conhece ou depende de outras classes, maior o grau de acoplamento entre elas.
Os conceitos de coeso e acoplamento so geralmente abordados juntos porque esto
correlacionados. Um baixo grau de coeso geralmente acarreta em um forte
acoplamento e vice-versa. Por outro lado, um alto grau de coeso geralmente resulta em
um fraco acoplamento e vice-versa.
Isto pode ser entendido pelo fato de que uma classe com baixa coeso possui
responsabilidades que deveriam ser de outras classes e, assim sendo, dever ser
acessada por essas outras classes para que essas possam cumprir suas tarefas,
fortalecendo assim o acoplamento.
Em sistemas com forte acoplamento, mudanas em uma classe foram mudanas em
classes relacionadas, fica mais difcil entender as classes isoladamente e mais difcil
reusar as classes, j que elas dependem da presena umas das outras.
Como exemplo de um problema causado pela existncia de um forte acoplamento
entre classes, vamos considerar um conhecido conceito de sistemas orientados a
objetos: o encapsulamento.
Encapsulamento (tambm conhecido como ocultamento de informaes) consiste em
manter uma interface pblica para um objeto sem expor os seus detalhes internos de
implementao, que permanecem escondidos dos outros objetos.
O encapsulamento evita que um programa torne-se to interdependente (to fortemente
acoplado) que uma pequena mudana tenha grandes efeitos colaterais. Motivos para
modificar a implementao de um objeto podem ser, por exemplo, aprendizado de
novas caractersticas e funcionalidades da linguagem de programao, melhoria de
desempenho, mudanas legais ou culturais, correo de erros ou mudana de plataforma
de execuo.
Para entender como um forte acoplamento dificulta modificaes em um sistema,
suponha que foi implementada uma classe em Java para um sistema de agenda de
compromissos que representa um evento (Listagem 1). Esta classe possui atributos para
armazenar o nome, a data, uma breve descrio e o status do evento. Os mtodos dessa
classe permitem que eventos sejam criados, cancelados e consultados.
Como voc no conhecia bem a linguagem Java no momento da implementao desta
classe, optou por representar a data do evento atravs de trs atributos (linha 4): dia,
mes e ano, todos do tipo int. Sem se preocupar com o conceito de encapsulamento, no
foi proibido o acesso direto aos atributos da classe (atributos pblicos).
Listagem 1. Cdigo da classe Evento cujos atributos no esto encapsulados.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public
public
public
public
String nome;
int dia, mes, ano;
String descrio;
boolean cancelado;
Esta classe foi utilizada em diversas aplicaes (ex.: sistema acadmico, locadora,
entre outras). Em cada uma delas, os valores dos atributos foram definidos diretamente,
conforme Listagem 2.
Listagem 2. Cdigo do sistema acadmico e de locadora que utilizam a classe Evento definida na Listagem 1.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Aps algum tempo, voc descobriu que a linguagem Java possui uma classe que
permite o armazenamento e manipulao de datas (java.util.Date) e deseja alterar a
estrutura da classe Evento para que a data passe a ser armazenada atravs de um objeto
da classe Date. Voc decidiu ento alterar a classe Evento, conforme Listagem 3.
Listagem 3. Cdigo da classe Evento aps a alterao dos atributos referentes data do evento.
1
2
3
4
5
6
7
8
import java.util.Date;
public class Evento {
public String nome;
public Date data;
public String descricao;
public boolean cancelado;
//...
Esta alterao acarretar em alteraes em todas as classes que usam a classe Evento,
como o caso dos exemplos anteriores apresentados para o sistema acadmico e da
locadora. Isto ocorre porque as linhas de cdigo que alteravam os atributos dia, mes e
ano (linhas 4, 5, 6, 13, 14 e 15 da Listagem 2) no funcionaro mais, j que estes
atributos no existem na nova verso da classe.
Isto ocorre porque a classe Evento e as classes que a usam esto fortemente acopladas
em relao estrutura de dados. Este acoplamento seria reduzido se a classe Evento
inicialmente tivesse encapsulado seus atributos. Neste cenrio, o cdigo da classe
Evento teria sido escrito conforme a Listagem 4.
Listagem 4. Cdigo da classe Evento com os atributos encapsulados.
1 public class Evento {
2
3
private String nome;
4
private int dia, mes, ano;
5
private String descricao;
6
private boolean cancelado;
7
8
public void agendar (int dia, int mes, int ano) {
9
this.dia = dia;
10
this.mes = mes;
11
this.ano = ano;
12
}
13
14
//... outros mtodos
15 }
As classes que usam este cdigo teriam sido escritas conforme o cdigo da Listagem
5.
Listagem 5. Cdigo do sistema acadmico e de locadora que utilizam a verso encapsulada da classe Evento.
1
2
3
4
5
6
7
8
9
10
11
12
13
Assim sendo, nenhuma outra classe teria que ser alterada. Este um exemplo claro de
benefcio de enfraquecer o acoplamento atravs da aplicao do conceito de
encapsulamento.
No exemplo apresentado, seria possvel fazer algumas alteraes na classe Evento no
encapsulada (Listagem 1) para que as alteraes nos atributos referentes a data no
tivessem ocasionado o efeito em cascata de alterao nas aplicaes do sistema
acadmico e da locadora.
No entanto, essas alteraes acarretariam em um cdigo remendado com diversas
informaes repetidas (data representada tanto pelos atributos dia, mes e ano, quanto
pelo atributo data) e mecanismos de controle de alterao (como algumas aplicaes
antigas usariam os atributos dia, mes e ano e outras, mais novas, o atributo data,
deveriam existir mecanismos para mant-los com o mesmo valor).
Este mesmo efeito de um forte acoplamento poderia ser observado em relacionamentos
de herana, que estabelecem um alto grau de acoplamento entre superclasse e subclasse,
em classes internas, entre outros.
Diversos padres e estratgias de projeto esto relacionados reduo do acoplamento,
como o caso do padro Iterator, Model-View-Controller (MVC), programao para
interfaces, injeo de dependncia, entre outros.
Embora eliminar o acoplamento seja impossvel, visto que, quando uma classe
conhece outra classe, j existe algum acoplamento entre elas, devemos procurar reduzilo atravs da eliminao de relaes desnecessrias, reduo do nmero de relaes
necessrias e do enfraquecimento da dependncia das relaes necessrias.
O encapsulamento um exemplo de enfraquecimento da dependncia das relaes
necessrias. Como mais um exemplo de reduo do acoplamento, vamos analisar o
cdigo de um sistema acadmico no qual existem relaes desnecessrias.
Neste sistema, foram utilizadas duas bibliotecas matemticas (biblioteca estatistica e
matematica) para a realizao do clculo das mdias dos alunos e da produo de outros
dados estatsticos. Uma das classes do sistema utiliza essas duas bibliotecas, conforme
cdigo da Listagem 7.
Listagem 7. Cdigo de um sistema acadmico no qual so utilizadas duas bibliotecas matemticas.
1 import estatistica.*;
2 import matematica.*;
3 //... incio da classe
4
5
public void calcularMedia() {
6
// calcula a mdia ponderada do aluno.
7
MediaPonderada media = new MediaPonderada();
8
//... restante do mtodo.
9
}
10
11 //... fim da classe
Mtrica
Descrio
Acoplamentos aferentes
(Ca)
Acoplamentos eferentes
(Ce)
Nvel de Abstrao (A)
Instabilidade (I)
O JHawk, por sua vez, uma ferramenta paga que calcula mtricas como nmero de
mtodos externos a uma classe chamados por ela, nmero de classes referenciadas por
um cdigo e o nmero de variveis referenciadas por mtodos.
Essas ferramentas possuem plug-ins para IDEs e interfaces grficas que facilitam o
processo de anlise e clculo de mtricas.
Concluso
A coeso e o acoplamento so conceitos que devem ser observados em projetos de
sistemas orientados a objetos, j que a produo de software com baixa coeso e forte
acoplamento dificulta seu entendimento, manuteno e reuso.
A literatura sobre coeso e acoplamento bastante extensa e no existe muito consenso
em relao s classificaes, nem em relao s melhores mtricas para a avaliao
destas caractersticas em projetos de software. No entanto, o estudo destes conceitos e
seus desdobramentos pode contribuir para a produo de sistemas de software com
maior qualidade.
Daqui para frente, nos seus projetos de sistemas orientados a objetos, reserve um
pouco de ateno para analisar a coeso e o acoplamento das suas classes e verifique se
alguma modificao pode ser feita para melhorar a qualidade do seu projeto.
Referncias
http://www.eli.sdsu.edu/courses/spring98/cs635/notes/index.html
Site com vrios materiais da disciplina de Programao e Projeto Orientados a Objetos da Universidade
do Estado de San Diego.
http://clarkware.com/software/JDepend.html
Site da ferramenta JDepend.
http://www.virtualmachinery.com/jhawkprod.htm
Site da ferramenta JHawk.
Leandro Luque (leandro.luque@gmail.com) gestor acadmico e professor da Universidade de Mogi das Cruzes
(UMC) e professor da FATEC-Mogi. Tem formao em Cincia da Computao e mestrado em Computao
Aplicada pelo Instituto Nacional de Pesquisas Espaciais (INPE). Trabalha com Java h 10 anos, tendo atuado no
desenvolvimento de aplicaes de grande porte tanto no segmento empresarial quanto governamental.
Rodrigo Rocha Silva (rrochas@gmail.com) Formado em Cincia da Computao pela Universidade de Mogi das
Cruzes (UMC), mestre em Computao Aplicada pelo INPE e Doutorando pelo ITA. Trabalha com Java h mais de
6 anos, atuando como desenvolvedor, analista e arquiteto em empresas de pequeno e grande porte, nos segmentos
de gesto empresarial, sade e governo. Atua tambm como professor na UMC e na Veris Faculdades. Possui
certificao SCJP 1.4.