Neste artigo, é apresentada uma visão geral sobre os conceitos de coesão e acoplamento e sua importância no desenvolvimento de sistemas orientados a objetos de qualidade.
Para que serve:
Apresentar conceitos que podem auxiliar desenvolvedores na produção de sistemas orientados a objetos com maior qualidade, principalmente no que diz respeito à facilidade de manutenção e ao potencial de reuso.
Em que situação o tema útil:
O desenvolvimento de software de qualidade, dentro do prazo e com o custo estabelecido é essencial para a sobrevivência de qualquer organização desenvolvedora de software. A facilidade com que se dá a manutenção e o potencial de reuso de um software desempenham papel de destaque nesse contexto, e os conceitos de coesão e acoplamento podem auxiliar muito neste sentido.
Coesão e acoplamento em sistemas orientados a objetos:
Os conceitos de coesão e acoplamento, surgidos no contexto da análise e projeto estruturados, embora tenham um grande impacto na qualidade de sistemas, são geralmente desconhecidos ou negligenciados por desenvolvedores iniciantes de sistemas orientados a objetos. O desenvolvimento de softwares com alta coesão e fraco acoplamento facilita, entre outras coisas, a manutenção e o reuso. Assim sendo, o estudo desses conceitos e seus desdobramentos torna-se importante para melhorar a qualidade de sistemas.
Muitos desenvolvedores de software percorreram caminhos que passaram pelo desenvolvimento procedural antes de chegarem à orientação a objetos.
Desenvolver um programa procedural significa entender e conceber o programa como um conjunto de procedimentos (também conhecidos como rotinas, sub-rotinas ou funções) que manipulam dados. Neste modelo de desenvolvimento, os procedimentos são geralmente as unidades de subdivisão ou modularidade de sistemas.
Diferentemente do paradigma orientado a objetos, no qual a subdivisão de sistemas é baseada no mapeamento de objetos do domínio do problema para o domínio da solução, o desenvolvimento procedural não possui uma semântica forte que oriente a subdivisão de sistemas. Por isso, os procedimentos ou conjuntos relacionados de procedimentos de sistemas procedurais muitas vezes tratam de aspectos distintos do sistema e, consequentemente, apresentam certas características, como um alto grau de interdependência, que dificultam a manutenção e o reuso.
Neste contexto, muitos conceitos e métricas foram definidos para avaliar e auxiliar a subdivisão de sistemas. Dois destes conceitos são especialmente importantes por terem grande influência na qualidade dos sistemas desenvolvidos: coesão e acoplamento.
Os conceitos de coesão e acoplamento surgiram em meados da década de 1960, a partir de um estudo conduzido por Larry Constantine sobre o motivo pelo qual certos tipos de módulos de sistemas eram definidos e da análise dos pontos positivos e negativos relativos a estes tipos. Estes conceitos foram bastante estudados e utilizados no contexto da análise e projeto estruturado de sistemas.
A falta de conhecimento ou o negligenciamento destes conceitos e métricas contribui para que muitos desenvolvedores de sistemas orientados a objetos, principalmente iniciantes, desenvolvam sistemas com características indesejáveis.
O objetivo desse artigo é apresentar uma introdução aos conceitos de coesão e acoplamento, buscando demonstrar o efeito de desprezá-los na modelagem de sistemas orientados a objetos através de alguns exemplos simples. Os exemplos são apresentados na forma de diagramas de classes da UML e código Java.
Coesão
Estendendo a definição clássica de coesão para o paradigma orientado a objetos, pode-se definir coesão de um sistema de software como a relação existente entre as responsabilidades de uma determinada classe e de cada um de seus métodos. Uma classe altamente coesa tem responsabilidades e propósitos claros e bem definidos, enquanto uma classe com baixa coesão tem muitas responsabilidades diferentes e pouco relacionadas.
Para se ter uma ideia de classes com níveis diferentes de coesão, vamos analisar dois exemplos de classes retiradas de um sistema bancário e de um sistema de locadora, representadas nas Figuras 1 e 2, respectivamente.
Figura 1. Exemplo de classe com um alto grau de coesão (sistema bancário).
No exemplo do sistema bancário, a classe ContaCorrente é responsável por operações relacionadas apenas a contas correntes: sacar() e depositar(). Nenhum outro “assunto” não relacionado a contas correntes é tratado por esta classe. Assim sendo, pode-se classificar esta classe como altamente coesa.
...