Primeiras aulas do curso C# Refatoração Parte 1: Praticando refatoração de código

C# Refatoração Parte 1: Praticando refatoração de código

Extraindo métodos - Introdução

Olá, tudo bem com você? Sou o Marcelo Oliveira. Bem vindo a primeira parte do curso de C#: Refatorando Código aqui da Alura. Veremos como deixar o código limpo: - sem duplicação; - com clareza; - menos classes; - fácil de manter; - passar em todos os testes.

Atacaremos o problema do Débito Técnico, que acontece pela falta de tempo para melhorar ou refatorar o código - ou porque tememos a chefia. Faremos a refatoração para melhorar a qualidade e facilitar o entendimento da equipe, pois assim, melhoraremos a nossa comunicação interna e o trabalho da equipe no projeto.

Nesse curso, veremos dois tipos de técnicas de refatoração. A primeira é chamada de Técnicas de Composição, que consiste em:

A segunda é uma técnica para "Mover Itens Entre Objetos", por exemplo:

Esperamos que você goste bastante do curso, e que aproveitem ao máximo!

Mãos à obra!

Extraindo métodos - Extrair Método 1

Começaremos a ver as Técnicas de Refatoração. Dentro do grupo de técnicas de composição, em primeiro temos Extrair Método. Para visualizar o seu funcionamento, é necessário abrir o Visual Studio.

No projeto caelum-stella-csharp, abriremos o arquivo Moeda.cs que está dentro da pasta Inwords. Veremos logo no início a classe Moeda, que entre outras coisas, fará a impressão do valor monetário por extenso.

Por exemplo, o valor de R$ 500,32 terá como saída quinhentos reais e trinta e dois centavos. Para isso, usaremos o método Extenso() dentro da classe Moeda.

Para entendermos melhor o que esse método faz, é necessário visualizar o código completo. A desvantagem de códigos grandes é que sempre precisamos rolar o código para cima ou para baixo para que possamos visualizá-lo por inteiro. Esse código está dividido em partes:

public override string Extenso()
{
    StringBuilder builder = new StringBuilder();

    //Montar os inteiros

    //Montar os centavos
}

O comentário já nos ajuda a entender o objetivo de cada parte desse código. Entretanto, existe um problema, como por exemplo, quando fazemos uma melhoria no código, e o comentário não é atualizado. Isso pode enganar um futuro desenvolvedor que for lê-lo, pois o comentário estaria defasado.

E como podemos eliminar esses problemas? Podemos extrair o método! Então, selecionaremos o trecho do método a ser extraído, que se encontra abaixo do comentário //Montar os inteiros:

    //Montar os inteiros
    if (numeroOrigem < 0)
    {
        throw new ArgumentOutOfRangeException();
    }
    else if (numeroOrigem >= 1.0 || numeroOrigem == 0)
    {
        BuildNumeroMoeda(numeroOrigem, builder);
        BuildPreposicaoMilhoes(numeroOrigem, builder);
        BuildPalavraMoeda(numeroOrigem,builder );
    }

Após ter selecionado esse trecho do código, aparecerá uma lâmpada à esquerda que nos dará opções de refatoração. Entre as opções, encontraremos o "Extract Method". Ao clicar nessa opção, automaticamente esse trecho será substituído pela chamada do método. Nesse momento, teremos a oportunidade de renomear esse método como MontarInteiros(). Após pressionarmos o "Enter", teremos o trecho trocado dessa forma:

public override string Extenso() 
{
    StringBuilder builder = new StringBuilder();

    //Montar os inteiros
    MontarInteiros(builder);
}

O método MontarInteiros() está localizado na própria classe Moeda um pouco mais abaixo. Ele recebe um StringBuilder builder como parâmetro. É interessante porque foi identificado que o trecho de código extraído, precisa da variável local builder. E com isso, foi criado automaticamente a chamada desse método já passando como parâmetro a variável que é uma dependência do trecho.

No comentário, temos somente a informação //Montar inteiros. E por causa da refatoração, esse comentário ficou obsoleto. Por isso, podemos deletá-lo. Adiante, temos o segundo trecho de código, aquele que monta os centavos!

Faremos o mesmo processo de refatoração feito com o método anterior, selecionando o método, clicando na lâmpada para extrair. Ou podemos também, fazer esse processo utilizando o atalho "Ctrl + ." e será exibida a opção de extração. Chamaremos esse método de MontarCentavos().

Assim como o primeiro, o segundo método criado está situado logo mais abaixo. O método Extenso() ficou da seguinte forma:

public override string Extenso() 
{
    StringBuilder builder = new StringBuilder();
    MontarInteiros(builder);
    MontarCentavos(builder);
    return builder.ToString();
}

Temos a declaração do StringBuilder, as chamadas dos métodos MontarInteiros() e MontarCentavos(), e por último é retornado o builder com o resultado do texto por extenso.

Extraindo métodos - Code Smells

Agora, veremos a segunda refatoração: incorporar método. Para ver essa técnica, também precisaremos do Visual Studio. Dentro do projeto refatoracao e dentro da pasta Aula01, teremos uma outra que receberá o nome R02.InlineMethod usada para incorporar métodos. Dentro dela, temos a pasta depois, que contém o arquivo Motoboy.cs.

Temos uma classe Motoboy que obtém a avaliação de algum motoboy. Essa classe chamará o método TemMaisDeCincoEntregasNoturnas() e retornará um boolean indicando se a variável qtdeEntregasNoturnas é ou não maior que 5.

class Motoboy
{
    private int qtdeEntregasNoturnas;

    int GetAvaliacao()
    {
        return (TemMaisDeCincoEntregasNoturnas()) ? 2 : 1;
    }

    bool TemMaisDeCincoEntregasNoturnas()
    {
        return qtdeEntregasNoturnas > 5;
    }
}

O nome do método faz referência ao que expressão faz, ou seja, o corpo do método é tão evidente quanto o seu nome. Neste caso, aplicaremos a técnica "Extrair método" para fazer a operação inversa. A ação é chamada de Incorporar método.

Para colocar em prática essa técnica, pegaremos a expressão de retorno, copiaremos e substituiremos onde o método é chamado. Depois eliminaremos o método TemMaisDeCincoEntregasNoturnas().

class Motoboy
{
    private int qtdeEntregasNoturnas;

    int GetAvaliacao()
    {
        return (qtdeEntregasNoturnas > 5) ? 2 : 1;
    }
}

Agora temos um método tão claro quanto o anterior.

A primeira técnica que vimos foi o Extract Method, que consiste em pegar um trecho de código que pode ser agrupado. Podemos refatorar em situações como:

Não extrairemos o método quando a própria expressão retornada pelo ele, for auto-instrutiva.

Vimos também o Inline Method, trata-se da operação inversa do "Extract Method". Usaremos essa técnica quando o método for tão óbvio quanto o seu nome, a ponto de se tornar desnecessário. Nós não refatoramos quando o corpo do método não é auto-explicativo, quando é óbvio, e quando o nome do método não explica o que a expressão faz.

Agora, veremos uma técnica de composição chamada de Code Smells. Essa técnica consiste em revisar o código para descobrir se algo está errado. Adiante, veremos algumas situações em que algo está "cheirando mal".

Código Duplicado

Com o código duplicado, violamos uma das boas práticas de programação, conhecida como DRY: Don't Repeat Yourself ("Não se Repita", traduzido para português).

Imagem com 3 blocos iguais representados como blocos de código em duplicidade

O problema da duplicação é que se temos um código replicado que está com bug, provavelmente os outros trechos também o terão. E para corrigir esse bug, é preciso fazer a manutenção do código em vários lugares onde esse trecho foi copiado.

A solução para o código duplicado é *extrair método.

Os três blocos de código da imagem anterior, agora se tornam somente um. Quando se é necessário, usamos as chamadas à esse bloco de código extraído.

Então, os lugares que tinham esse trecho copiado, são substituídos pela a chamada desse novo método.

Método Longo

Quando temos um método muito longo, geralmente violamos o "Princípio de Responsabilidade Única" ou Simple Responsibility Principle, no qual é dito que o método deve realizar somente uma única tarefa. Outro problema é que os métodos longos são difíceis de ler, enquanto os métodos curtos são mais fáceis de comparar e de entender.

Os métodos longos são quebrados em vários métodos pequenos.

Comentários

A necessidade de comentários são considerados um Code Smell porque podem não explicar o código da forma correta, estar mais desatualizados do que o código, enganar o desenvolvedor e também podem inibir a refatoração.

Resolvemos os comentários, extraindo métodos.

De acordo com a imagem, podemos ver a eliminação de dois comentários por meio da extração dos métodos A() e B().

Sobre o curso C# Refatoração Parte 1: Praticando refatoração de código

O curso C# Refatoração Parte 1: Praticando refatoração de código possui 111 minutos de vídeos, em um total de 88 atividades. Gostou? Conheça nossos outros cursos de .NET em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda .NET acessando integralmente esse e outros cursos, comece hoje!

  • 1112 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

Premium

  • 1112 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$75
à vista R$900
Matricule-se

Premium Plus

  • 1112 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$100
à vista R$1.200
Matricule-se

Max

  • 1112 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$120
à vista R$1.440
Matricule-se
Procurando planos para empresas?
Acesso por 1 ano
Estude 24h/dia onde e quando quiser
Novos cursos toda semana