Clean Code com ASP.NET Core e C#: Code Smells

Quando falamos de Clean Code, nos referimos a código de boa legibilidade e manutenção.

Uma grande ameaça à manutenção de uma base de código limpa são os Code Smells.

Neste artigo vou cobrir os principais conceitos relacionados a Code Smells, e apresentar um exemplo prático utilizando ASP.NET Core onde realizo a identificação e refatoração de código de maneira a eliminar o Code Smell.

Espera só um instante…

Antes de falar sobre Code Smells, venho reforçar a necessidade de se sentir confortável com refatorações de código para a construção de uma base de código de boa legibilidade e manutenção.

Grandes bases de código não são escritas de maneira perfeita na primeira tentativa. Refatorações fazem parte do dia a dia de todo programador, idealmente sempre guiadas por um desenho de código mais organizado e desacoplado.

Um livro que me ajudou muito a conquistar confiança em diversos níveis de refatorações foi o Trabalho Eficaz com Código Legado. É um livro que frequentemente indico para meus alunos e mentorados, e sem dúvidas ajuda programadores a avançarem sua carreira nesse tópico tão importante.

Se tiver interesse em adquirir, clique aqui

O que são Code Smells?

O termo foi apresentado pela primeira vez por Kent Beck, enquanto auxiliava Martin Fowler com o seu livro Refactoring.

Como o próprio nome sinaliza, o Code Smell indica que algo não “cheira” bem no nosso código.

Eles não são bugs, e isso é importante destacar. Porém, eles podem sinalizar um problema maior de desenho de código, potencialmente diminuindo aspectos como legibilidade e manutenibilidade.

Os tipos de Code Smells

Existem 5 tipos de Code Smells:

Bloaters

Se referem a crescimento exagerado de código de métodos ou classes, resultando em uma má manutenção e/ou legibilidade. Evoluem com o tempo, sendo necessário que alguém entre em ação para eliminá-los.

São Code Smells desse tipo:

  • Long Method
  • Large Class
  • Primitive Obsession
  • Long Parameter List
  • Data Clumps

Object-Orientation Abusers

Se referem a aplicação incorreta de conceitos relacionados a programação orientada a objetos.

São Code Smells desse tipo:

  • Alternative Classes with Different Interfaces
  • Refused Bequest
  • Switch Statements
  • Temporary Field

Change Preventers

Se referem a alta complexidade no momento de se realizar alterações, pois estas requerem alterações em muitos outros locais do código.

São Code Smells desse tipo:

  • Divergent Change
  • Parallel Inheritance Hierarchies
  • Shotgun Surgery

Dispensables

Se referem a algo desnecessário que, quando removido, resultaria em código mais legível.

São Code Smells desse tipo:

  • Comments
  • Duplicate Code
  • Data Class
  • Dead Code
  • Lazy Class
  • Speculative Generality

Couplers

Se referem a alto acoplamento entre classes.

São Code Smells desse tipo:

  • Feature Envy
  • Inappropriate Intimacy
  • Incomplete Library Class
  • Message Chains
  • Middle Man

Alguns exemplos de Code Smells

Switch Statements

Se refere ao uso de switch complexo ou mesmo sequência de if’s.

O principal problema de seu uso é que é comum de se ver espalhado pelo código, tendo que se manter a cada nova condição adicionada, tornando o fluxo e manutenção mais complexos.

Por exemplo, no código abaixo vemos que a cada novo meio de notificação um novo case seria adicionado ao switch, resultando em uma estrutura mais complexa e um Long Method (outro Code Smell!).

Code Smell “Switch Statement”

Nessas situações, uma abordagem para se remover o Code Smell é:

  • Extrair subclasses para cada condição;
  • Substituir a estrutura condicional por polimorfismo (via herança ou interface).

Um Padrão de Projeto que se encaixa bem nessa solução é o Factory Method. Veja mais sobre ele e outros Design Patterns aqui.

Data Clumps & Long Parameter List

Em diferentes partes do código o mesmo grupo de variáveis são encontradas juntos, indicando Data Clumps. Nesses cenários, essas variáveis deveriam se tornar uma classe própria.

Um exemplo clássico de Data Clump é de Endereço. Informações como Logradouro, Número, Bairro, CEP, Cidade e Estado são comumente encontradas juntas.

Se uma delas for removida, o restante dos valores não fará tanto sentido, e isso indica um Data Clump.

Um Code Smell que é comum de se encontrar junto ao Data Clump é o Long Parameter List.

O Long Parameter List é indicado por um número maior de parâmetros para um método, quatro ou mais, por exemplo.

Isso pode ocorrer, por exemplo, quando um método tem muita responsabilidade, sendo responsável por implementar múltiplos algoritmos, e sendo assim, solicitando muitas informações através de parâmetros.

Por exemplo, no código abaixo, solicitamos diversas informações para processar o envio de um pacote de pedido de compra.

Code Smell “Data Clumps” e “Long Parameter List”

Uma maneira de endereçar esses Code Smells seria através da criação de classes novas, como Destinatario, Remetente e DetalhesPacote.

  • Extrair classes a partir dos Data Clumps;
  • Substituir no construtor, reduzindo a quantidade de parâmetros e eliminando os Data Clumps.

Mais sobre esse tema

Um site referência sobre Code Smells e outros tópicos é o refactoring.guru. Indico navegar por ele para ler mais sobre esses tópicos e conhecer mais Code Smells.


Quer alavancar sua carreira como Desenvolvedor(a) .NET?

Além de Desenvolvedor .NET Sênior, eu sou instrutor de mais de 700 alunos e também tenho dezenas de mentorados.

Conheça o Método .NET Direto ao Ponto, minha plataforma com mais de 800 videoaulas, com cursos cobrindo temas relacionados a linguagem C# e Programação Orientada a Objetos, APIs REST com ASP NET Core, Microsserviços com ASP NET Core, HTML, CSS e JavaScript, Desenvolvimento Front-end com Angular, Desenvolvimento Front-end com React, JavaScript Intermediário, TypeScript, Formação Arquitetura de Software, Microsoft Azure, Agile, SQL, e muito mais.

Inclui comunidade de centenas de alunos, suporte por ela, plataforma e e-mail, atualizações regulares e muito mais.

Clique aqui para ter mais informações e garantir sua vaga


Conclusão

O objetivo desse artigo foi apresentar o conceito de Refactoring, Code Smells e seus tipos, e apresentar código que viole 3 deles.

A má qualidade de uma base de código impacta diretamente a capacidade de inovação e entregas de uma equipe. E conhecer características de Clean Code, como princípios, Code Smells, padrões de projeto, entre outros, é fundamental para que no dia a dia não se piore cada vez a base de código, dificultando a inovação e gerando débitos técnicos e bugs.

Finalmente, apenas a prática nos permite identificá-los de maneira mais rápida e implementar soluções para eliminá-los.