Classe coesa, manutenção moleza!

Repita esse mantra todos os dias e seja um programador feliz


O título desse artigo é um mantra e deve ser repetido todos os dias pela manhã. Antes de começar a “codar”, repita novamente. Antes de criar uma classe, repita outra vez e, se mesmo assim não funcionar, você precisa rever seus conceitos! ☺

Brincadeiras a parte, esse artigo não tem nada a ver com auto ajuda e se você trabalha com orientação a objeto, já ouviu falar na tal coesão. Mas afinal, o que é? Onde vive? O que come? Isso e muito mais você verá agora, no Globo Repórter.

Coesão

Conexão; Ligação; Harmonia entre os elementos; Conteúdos entrelaçados dando continuidade uns aos outros.

Leia a lista a seguir e veja se algo lhe parece familiar:

  • Classes grandes e complicadas de serem mantidas;
  • Classes com grande quantidade de linhas;
  • Classes com emaranhados de “ifs”;
  • Classes com mais de uma responsabilidade;
  • Classes complicadas (em alguns casos quase impossíveis) de dar manutenção;
  • Classes com pouca legibilidade.

Você se identificou com algum item nessa lista? É claro que sim! Esse artigo poderia parar por aqui para forçar você a repensar no seu trabalho, mas vamos seguir em frente, somos fortes e queremos evoluir.

Como criar e manter uma classe coesa?

O inverso da negativa lista apresentada anteriormente responderia essa pergunta mas, por mais óbvio que pareça, o trabalho de criar uma classe coesa não será simples se você não estiver preparado para esse desafio.

Principio da responsabilidade única

SPR — Single Responsibility Principle

“Com grandes poderes vêm grandes responsabilidades.” Stan Lee, 1962.

Certamente com muita responsabilidade você teria grandes poderes, mas você também ficaria louco! Com muita responsabilidade, você não conseguira organizar sua vida e seu tempo e tudo ficaria bem confuso. O mesmo acontece com seu código.

O primeiro passo é separar essas responsabilidades e delegar tarefas. Observe o exemplo (simples, MUITO simples) a seguir:

Código com teste em aqui.

A classe Discount possui três métodos, o twenty_percent, fifty_percent e final_price. O final_price é responsável por definir o valor final com o desconto empregado de acordo com o customer_type. Até o momento só existem dois tipos de descontos que podem ser atribuídos, mas… Se aparecer um tipo de cliente diferente que receberá 10%? Você vai lá e cria o ten_percent. E se aparecer outro com 15%, outro com 30%, outro com 40%, outro com 45% etc? Como se não pudesse piorar, imagine se aparece uma regra onde, nos dias pares, o tipo de cliente “X” recebe 5% a mais do que a porcentagem existente, e nos dias ímpares os clientes “Y” recebem 4%!

Reparou que sua classe tem a possibilidade de crescer infinitamente? Além do monstro que essa classe pode virar, repare que cada método, mesmo atribuindo percentual de desconto diferente, executa a mesma ação: recebe um valor e aplica um determinado desconto.

Não é atoa que o tal do SPR (Single Responsibility Principle) é um dos conceitos mais importantes no desenvolvimento orientado a objetos e, apesar da tamanha importância, é o mais simples de ser aplicado.

Robert Martin, em seu livro Clean Code, fala que:

“Fazer um software funcionar e torná-lo limpo são duas coisas bem diferentes”

Ele está coberto de razão, e se você pensar nisso sempre que estiver “codando” você estará dando um grande passo e evitando uma série de futuros problemas.

Mas e agora José?

Como dito anteriormente, sua classe precisa fazer apenas uma única coisa. Uma solução para o problema anteriormente apresentado é a criação de uma interface que receberá as regras básicas para todos os cálculos e aplicar as demais regras em outras classes oriundas da interface criada. Dessa forma, toda nova regra deverá ser adicionada em uma classe nova.

Usar encapsulamento, métodos privados para auxiliar um determinado método público etc. Mas, isso é assunto para outro artigo que virá em breve. O mais importante agora é fazer você prestar mais atenção na construção de seu código.

Agradecimento especial ao amigo Rômulo Collopy. Valeu Collopytu! ☺