Anterior Próximo

Extract Methodpublicado em 02/12/2009

Na prova discursiva do BNDES deste ano, caiu uma questão sobre refatoração de código e não fiquei surpreso ao ver que a mesma falava sobre o processo Extract Method.

Refatoração ou Refactoring é o processo de melhorar a estrutura interna de um código sem alterar seu comportamento externo. Além da melhora no entendimento do código, refatorar significa facilitar a manutenção, aumentar a reutilização, baixar o acoplamento.

Existem muitos outros processos de refactoring ( Rename, Encapsulate Field, Split Loop etc. ) mas o Extract Method é o mais comum deles.

O processo de extração de método consiste em mover um fragmento de código para um novo método que represente melhor a ação pretendida. Métodos longos e com muitas responsabilidades fatalmente necessitam ser separados em métodos menores que façam a penas o que devem fazer.

Vamos dar uma olhada no exemplo clássico de aplicação do Extract Method:

private void MostarDivida(double valor) 
{
    MostrarCabecalho();
 
    // mostrar detalhes
    Console.WriteLine("nome:" + _nome);
    Console.WriteLine("valor:" + valor);
}

Sem muito pensar, percebemos que podemos e devemos refatorar o código separando em um novo método a ação que mostra os detalhes da dívida.

private void MostarDivida(double valor) 
{
    MostrarCabecalho();
    MostrarDetalhes(valor);
} 
private void MostrarDetalhes(double valor) 
{
    Console.WriteLine("nome:" + _nome);
    Console.WriteLine("valor:" + valor);
}

Costumo dizer que um código bem escrito se auto documenta, se um determinado trecho de código necessita ser comentado para que outras pessoas entendam sua função, então é provável que estejamos de frente a um bom cenário para a aplicação de Extract Method.

Abaixo segue mais um exemplo simples onde temos um método que é responsável informar se um determinado aluno passou ou não de ano.

public void MostrarAprovacao(double nota1, double nota2)
{
    double media = (nota1 + nota2) /2;

    if (media > 7)
        Console.Write("Passou de ano !");
    else
        Console.Write("Não passou de ano !");

}

Podemos perceber que o método não está realizando apenas a função de mostrar aprovação. Temos um calculo de média e uma condição que julga se o aluno passou ou não de ano.

No código abaixo, já refatorado, os métodos tem apenas uma responsabilidade.

public void MostrarAprovacao(double nota1, double nota2)
{
    double media = CalcularMedia(nota1,nota2);

    Console.WriteLine(PassouDeAno(media));
}


private double CalcularMedia(double nota1, double nota2)
{
    return (nota1 + nota2) / 2;
}

private string PassouDeAno(double media)
{
    if (media > 7)
        return "Passou de ano !";
    else
        return "Não passou de ano !";
}

O Visual Studio fornece algumas formas de fazer refactoring, basta selecionar o código, clicar com o botão direito e no menu Refactor escolher o tipo de refatoração a ser feita.


Tags:

retweet

BBCode permitido - [code], [pre], [b], [i], [u], [del], [url], [left], [right], [center]

  • 3/12/2009 12:44 - Otávio

    Muito bom, também fiz esta prova mas errei esta questão :(

    Na próxima acerto ! hehe

  • 3/12/2009 14:35 - Felipe Carvalho

    Fala Diogo! Parabéns pelo artigo. Muito bom mesmo!

  • 3/12/2009 14:37 - Luiza Jardim

    Na prova discursiva do BNDES deste ano... Parabéns, Di!

  • 23/1/2010 17:30 - Robson

    Diogo, Fiz a prova do BNDES e nesta questão perdi 1 ponto.

    Ela era metade uma tabela verdade que não tenho como ter errado e a outra era essa que vc colocou no artigo.

    Fiz um pouco diferente do que está no exemplo, pois fiz:


    void printOwing(int amount)
    {
    printBanner();
    printString("name: " + _name);
    printString("amount " + amount);
    }

    void printString(string texto)
    {
    System.out.println(texto);
    }

    Esta sintaxe não está correta?


Ir direto para o topo