Refatoração: Extraindo Método Para Melhor Coesão
E aí, pessoal! Hoje vamos mergulhar em um tópico super importante para quem quer escrever código de qualidade: a refatoração. Mais especificamente, vamos falar sobre a técnica de Extract Method, ou Extração de Método. Essa é uma daquelas ferramentas que, quando bem utilizada, pode transformar um código complexo e difícil de entender em algo limpo, organizado e fácil de manter. Neste artigo, vamos explorar um caso prático de refatoração utilizando Extract Method em um sistema de autenticação, mostrando como essa técnica pode melhorar a coesão, legibilidade e testabilidade do seu código. Então, preparem-se para elevar o nível das suas habilidades de programação!
O Que é Extract Method?
Antes de entrarmos no caso prático, vamos entender o que é essa tal de Extract Method. Em essência, essa técnica de refatoração consiste em pegar um trecho de código dentro de um método que está fazendo muitas coisas e movê-lo para um novo método independente. Parece simples, né? E é! Mas o impacto que isso pode ter na qualidade do seu código é enorme.
Imagine que você tem um método gigante, com centenas de linhas, cheio de responsabilidades diferentes. É difícil de ler, difícil de entender e, consequentemente, difícil de manter. Quando você aplica Extract Method, você quebra esse métodozão em partes menores, cada uma com uma responsabilidade bem definida. Isso torna o código mais legível, facilita a identificação de bugs e simplifica a adição de novas funcionalidades.
Por que usar Extract Method?
- Melhora a Legibilidade: Métodos menores são mais fáceis de entender. Você bate o olho e já sabe o que ele faz.
 - Aumenta a Reusabilidade: Ao extrair um trecho de código para um método próprio, você pode reutilizá-lo em outros lugares do seu sistema.
 - Facilita a Manutenção: Se precisar alterar alguma coisa, você vai direto ao ponto, sem ter que navegar por um mar de código.
 - Promove a Testabilidade: Métodos menores e com responsabilidades bem definidas são mais fáceis de testar.
 
Caso Prático: Refatorando o Método Login
Para ilustrar o poder do Extract Method, vamos analisar um caso real. Imagine que temos um método Login em um UserController. Esse método é responsável por autenticar um usuário e, em seguida, gerar as claims (informações sobre o usuário) para o sistema de autenticação. O código original pode estar algo como:
public IActionResult Login(string username, string password)
{
    // 1. Autenticar o usuário
    var user = _userService.Authenticate(username, password);
    if (user == null)
    {
        return Unauthorized();
    }
    // 2. Criar as claims
    var claims = new List<Claim>
    {
        new Claim(ClaimTypes.Name, user.Username),
        new Claim(ClaimTypes.Email, user.Email),
        new Claim(ClaimTypes.Role, user.Role)
    };
    // 3. Criar o ClaimsPrincipal
    var identity = new ClaimsIdentity(claims, "Basic");
    var principal = new ClaimsPrincipal(identity);
    // 4. Gerar o token de autenticação
    var token = _tokenService.GenerateToken(principal);
    return Ok(new { Token = token });
}
Observe que o método Login está fazendo várias coisas: autenticando o usuário, criando as claims, criando o ClaimsPrincipal e gerando o token. Isso dificulta a leitura e o entendimento do código. É aí que entra o Extract Method!
Passo a Passo da Refatoração
Nosso objetivo é extrair a lógica de criação de autenticação e claims para uma classe auxiliar, a ClaimsHelper. Isso vai reduzir a complexidade do método Login e promover melhor coesão e reutilização de código.
1. Criando a Classe ClaimsHelper
Primeiro, vamos criar uma classe chamada ClaimsHelper que será responsável por gerar as claims e o ClaimsPrincipal. Essa classe terá um método chamado CreateClaimsPrincipal que receberá o usuário autenticado como parâmetro e retornará o ClaimsPrincipal.
public class ClaimsHelper
{
    public ClaimsPrincipal CreateClaimsPrincipal(User user)
    {
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, user.Username),
            new Claim(ClaimTypes.Email, user.Email),
            new Claim(ClaimTypes.Role, user.Role)
        };
        var identity = new ClaimsIdentity(claims, "Basic");
        var principal = new ClaimsPrincipal(identity);
        return principal;
    }
}
2. Refatorando o Método Login
Agora que temos a classe ClaimsHelper, podemos refatorar o método Login para utilizá-la. Vamos instanciar a classe ClaimsHelper e chamar o método CreateClaimsPrincipal para gerar o ClaimsPrincipal.
public IActionResult Login(string username, string password)
{
    // 1. Autenticar o usuário
    var user = _userService.Authenticate(username, password);
    if (user == null)
    {
        return Unauthorized();
    }
    // 2. Criar o ClaimsPrincipal usando o ClaimsHelper
    var claimsHelper = new ClaimsHelper();
    var principal = claimsHelper.CreateClaimsPrincipal(user);
    // 3. Gerar o token de autenticação
    var token = _tokenService.GenerateToken(principal);
    return Ok(new { Token = token });
}
Perceba como o método Login ficou mais limpo e direto. Ele agora se concentra apenas no fluxo de autenticação, delegando a responsabilidade de criação das claims para a classe ClaimsHelper.
Benefícios da Refatoração
- Redução da Complexidade: O método 
Loginficou mais simples e fácil de entender. - Reaproveitamento de Código: A lógica de criação de claims agora pode ser reutilizada em outros contextos, como rotas de administrador ou gerente.
 - Melhor Coesão: A classe 
ClaimsHelpertem uma única responsabilidade: criar oClaimsPrincipal. - Maior Testabilidade: É mais fácil testar a lógica de criação de claims isoladamente.
 
Impacto Esperado
A refatoração do método Login utilizando Extract Method traz diversos benefícios para o sistema. O impacto esperado é:
- ✅ Redução da complexidade do método 
Login; - 🧩 Reaproveitamento do método de criação de claims em outra classe;
 - 🧠 Maior clareza e legibilidade do código;
 - 🔒 Facilitação da manutenção e expansão futura do sistema de autenticação;
 - ⚙️ Aumento da testabilidade da aplicação.
 
Conclusão
Extract Method é uma técnica poderosa para melhorar a qualidade do seu código. Ao extrair trechos de código complexos para métodos menores e com responsabilidades bem definidas, você torna o código mais legível, reutilizável, fácil de manter e testável. No caso prático que vimos, a refatoração do método Login utilizando Extract Method resultou em um código mais limpo, coeso e fácil de entender. Então, da próxima vez que você se deparar com um método gigante e complexo, lembre-se do Extract Method! Essa técnica pode ser a chave para transformar seu código em uma obra de arte.
E aí, pessoal, curtiram o artigo? Espero que sim! Se tiverem alguma dúvida ou quiserem compartilhar suas experiências com Extract Method, deixem um comentário abaixo. Até a próxima! 😉