De volta ao básico…
De tempos em tempos, ao analisar arquiteturas propostas, percebo a dificuldade que ainda temos no design de classes e camadas. Na minha vivência os problemas mais comuns parecem sempre estar relacionados com a baixa coesão . Parece que existe um desuso de variáveis globais ou estáticas, diminuindo o também comum problema do alto acoplamento .
Aqui vão dois truques que costumo usar para melhorar a coesão no design de um software:
1. Se você está usando a OO, use a teoria de tipos ( data type e abstract data type ). Vou voltar a falar sobre este assunto num futuro, mas minha lista do por que usá-la é:
a. Dados e métodos devem andar juntos – caso contrário o espalhamento será natural e, com ele, vai-se embora a coesão;
b. Heranças ficam bem estruturadas, aumentando o poder do uso do polimorfismo (dica: sempre que for necessário o uso de um switch/case desconfie – talvez seja falta de herança);
2. Faça uma análise de coesão. É relativamente simples, principalmente com ferramentas de apoio. Siga os passos:
a. Faça uma matriz entre as unidades que você quer analisar. Exemplo: coloque nas linhas as ações/métodos e nas colunas as tabelas do banco de dados. Outro exemplo: coloque métodos/funções nas linhas e colunas para analisar quem chama quem;
b. Coloque um X na célula em que há dependência (ex.: uso ou chamadas). Você vai conseguir uma matriz cheia de pontos distribuídos de forma irregular e provavelmente esparsa;
c. Mude linhas e colunas de lugar de modo a que tenhamos o maior número de X’s lado a lado. Ao final, as regiões escuras são excelentes candidatos para a coesão (classes, classes inter-relacionadas, patterns ou camadas);
O mais interessante é que, na minha experiência, o uso de 1) leva a uma excelente matriz em 2) .
Minhas interpretações deste fato:
1. A teoria de tipos é boa;
2. Se entendermos o que fazemos costumeiramente o fazemos melhor :)