Como medir a coesão do seu código? A métrica LCOM

Aqui no blog da Caelum já discutimos métricas como complexidade ciclomática e acoplamento, e chegamos em maneiras quantitativas de medi-las. Agora, uma boa pergunta é: como medir coesão? Mais claramente, como chegar em um número que diz o quão coesa uma classe é?

Vamos estudar novamente o que é coesão. Sabemos que uma classe deve ser simples, enxuta. Quanto mais enxuta, mais facil será a sua manutenção. E, para que uma classe seja enxuta, ela não pode fazer coisas demais (ter responsabilidades demais). Se cada classe tiver apenas uma única e exclusiva responsabilidade, a manutenção do sistema se torna fácil: se uma regra de nota fiscal mudar, mudamos na classe NotaFiscal; se uma regra de imposto mudar, mudamos na classe Imposto.

E isso é coesão. Uma classe coesa é aquela que tem apenas uma única responsabilidade. Uma classe pouco coesa é aquela que tem muitas responsabilidades, como definido por Bob Martin.

Apesar da teoria ser simples, discutir se uma classe é coesa não é. O que é “uma única responsabilidade”? Emitir uma Nota Fiscal e Gerenciar Nota Fiscais podem ser consideradas uma única responsabilidade, sob pontos de vista diferentes. Ou seja, olhar uma classe e dizer se a mesma é coesa ou não pode ser complicado. Imagine agora tentar calcular, de forma automática, a coesão de uma classe?

Sim, existem algumas métricas que tentam medir a coesão de uma classe. A mais famosa delas é conhecida por LCOM (Lack of Cohesion of Methods) ou, em português, Falta de Coesão dos Métodos. Existem várias versões dessa métricas, mas a ideia geral de todas elas é mais ou menos a mesma. Qual é?

Uma classe é composta por métodos e atributos. Esses métodos tendem a fazer alterações nos valores dos atributos das classes (essa é a ideia da OO, certo? A classe sendo responsável por manter/alterar seu estado). Sabendo disso, a métrica descobre quantos atributos são modificados por quantos métodos, de maneira independente.

Imagine uma classe abaixo com 2 métodos (A, B) e 4 atributos (X, Y, Z, K). O método A modifica os atributos X e Y. O método B modifica os atributos Z e K. Pelo desenho abaixo, conseguimos ver que existem “2 conjuntos diferentes” nessa classe: A modifica uma parte da classe, e B, outra. Para a métrica LCOM, essa classe possui 2 responsabilidades.

coesao

No fim, a métrica mede quanto uma classe não é coesa. Ou seja, quanto maior o número que a métrica LCOM apontar, menos coesa é a classe.

Apesar de ser uma solução bastante inteligente, veja que isso é apenas uma heurística. Essa classe pode ou não pode ser coesa. Por exemplo, no mundo Java, os getters e setters podem enganar o valor dessa métrica. Por esse e outros motivos, a academia, de maneira geral, não é muito fã dessa métrica.

Na prática, a ideia é você, como desenvolvedor, avaliar o resultado da métrica e ver se realmente faz sentido. Uma boa dica é buscar pelas classes que apresentam uma LCOM muito alta; essas provavelmente possuem alguma característica estranha.

Neste post, tentei mostrar como é possível medir coesão de classes, mesmo que seja de maneira bem abstrata e suscetível a falhas. Para calcular, você pode usar ferramentas como Eclipse Metrics ou Sonar. Se quiser ver a fórmula correta que é utilizada na LCOM HS (versão mais popular e aceita da métrica), você pode ver aqui. Se você quer aprender mais sobre orientação a objetos e boas práticas, veja nossos cursos online sobre o assunto.

12 Comentários

  1. Roberto Shizuo 24/01/2013 at 00:02 #

    oi

    Alguma forma de automatizar isso no maven pra ter o numero, como no checkstyle?

  2. Mauricio Aniche 24/01/2013 at 11:55 #

    Oi Roberto,

    Precisa ver se a ferramenta que você quer usar tem algum plugin pro Maven. Infelizmente as ferramentas de métricas são bem ruins, e sofremos pra achar a que queremos, sempre. Em meu doutorado, por exemplo, desisti de procurar ferramenta e acabei implementando a minha própria.

    Mas, sim, sem dúvida é possível! 🙂

    Um abraço,
    Mauricio

  3. Roberto Souza 26/01/2013 at 07:17 #

    Ola Mauricio, gostaria de comentar primeiro que seus posts são muitos bons, gostei do anterior sobre acoplamento ^^. E agora voce falou da coesâo, claro uma postagem breve, rápida. Mas interessante.

    Comentario a parte, existem outras métricas de C.K. que também tem relação a coesão, assim como outras variantes de LCOM, atualmente já está na LCOM4.

    Uma coisa que sempre tive interesse em saber é sobre a vida de mestrado e doutorado, vejo que vc ta fazendo doutorado, vc tem (ou sabe de algum) blog que fala um pouco sobre a vida academica? ^^

    Obrigado.
    .

  4. Mauricio Aniche 26/01/2013 at 18:10 #

    Oi Roberto,

    Obrigado, fico feliz que tenha gostado!

    Sim, existem várias versões da LCOM, mas a ideia por trás delas é sempre parecida: no fim é uma conta entre a quantidade de atributos e quantidade de métodos. Como disse, a academia em si critica um pouco a LCOM, pq no fim é uma aproximação que pode não fazer sentido em muitos casos; mas é a melhor que temos, IMHO! 🙂

    Existem algumas outras métricas que tentam medir a coesão de uma classe. No próprio CK que vc mencionou, tem lá o “Response for a Class”, que é uma delas.

    Sobre a vida acadêmica, não conheço. Mas fique a vontade para me mandar e-mail com suas dúvidas e comentários!

    Um abraço,
    Mauricio

  5. Jonathan Schreiber 04/02/2013 at 15:45 #

    Olá.

    Meu nome é Jonathan Schreiber e trabalho na área de Parcerias, da RedeHost, uma das 3 maiores empresas de Hosting do Brasil.

    Gostaríamos de ter você como um de nossos parceiros, já que o conteúdo do seu está diretamente ligado à tecnologia. Queremos oferecer nosso apoio através isenção nos nossos serviços como Hospedagem.

    Se houver interesse, envie um e-mail com seu e-mail e telefone que entraremos em contato.

    Abraço.

  6. Thalys 30/06/2013 at 16:26 #

    Poço afirmar que se tenho apenas um método a classe terá será valor 0 da métrica?

  7. Augusto 18/08/2015 at 16:23 #

    Boa tarde, vc teria um exemplo do calculo?

  8. Maurício Aniche 18/08/2015 at 17:58 #

    Oi Thalys,

    Acredito que as implementações mais comuns vão verificar se esse único método lida com todos os atributos da classe, pra aí sim dar o número.

    Oi Augusto,

    Vc diz da fórmula? Vc pode vê-la aqui: http://www.computing.dcu.ie/~renaat/ca421/LCOM.html. Mas é bem complicadinha, hehe.

  9. Sérgio 04/09/2017 at 23:35 #

    Maurício,

    Você conhece a ferramenta Kuscos? http ://www.kuscos.com/ é de uma empresa portuguesa Morphis ( http://www.morphis-tech.com ) Uma ferramenta de análise de métricas, impacto, qualidade de software. Eles já estão no Brasil com alguns clientes de renome. Dê uma olhada nas ofertas de serviços e produtos. Vale à pena investigar.

Deixe uma resposta