Refatoração: aperfeiçoando o projeto de código existente

Autor(es): Fowler, Martin
Visualizações: 1316
Classificação: (0)

 

15 capítulos

Formato Comprar item avulso Adicionar à Pasta

1. Refatoração, um Primeiro Exemplo

PDF Criptografado

CAPÍTULO

1

Refatoração, um Primeiro Exemplo

C

omo começar a escrever sobre refatoração? O modo tradicional de começar a falar sobre algo é resumir a história, princípios gerais e assim por diante.

Quando alguém faz isso em uma conferência, costumo ficar um pouco sonolento. Minha mente começa a divagar em um processo em segundo plano de baixa prioridade que fica sondando o orador até que ele ou ela dê um exemplo. Os exemplos me acordam porque é com exemplos que posso ver o que está acontecendo.

Com princípios é fácil fazer generalizações, difícil é descobrir como aplicar as coisas.

Um exemplo ajuda a tornar as coisas mais claras.

Então, começarei este livro com um exemplo de refatoração. Durante o processo, falarei bastante a respeito do modo pelo qual a refatoração funciona e lhe darei uma idéia sobre o processo de refatoração. Depois disso, posso então fazer a introdução comum baseada em princípios.

Com um exemplo introdutório, entretanto, me deparo com um grave problema.

Se escolher um programa grande, sua descrição e o modo como ele é refatorado é complicado demais para qualquer leitor acompanhar. (Experimentei e até mesmo um programa ligeiramente complicado ocupa mais do que uma centena de páginas).

 

2. Princípios da Refatoração

PDF Criptografado

2

CAPÍTULO

Princípios da Refatoração

O

exemplo anterior deve ter lhe dado uma boa idéia a respeito do que se trata a refatoração. Agora é hora de voltar e ver os princípios chave da refatoração e algumas das questões que você precisa considerar ao usar refatoração.

Definindo Refatoração

Fico sempre um pouco desconfiado de definições porque todos têm as suas, mas quando você escreve um livro acaba escolhendo suas próprias definições. Neste caso, estou baseando minhas definições no trabalho feito pelo grupo de Ralph Johnson e diversos associados.

A primeira coisa a dizer é que a palavra Refatoração tem dois significados, dependendo do contexto. Você pode achar isto irritante (eu certamente acho), mas serve como exemplo da realidade de trabalhar com linguagem natural.

A primeira definição é a da forma substantiva

Refatoração (substantivo): uma alteração feita na estrutura interna do software para torná-lo mais fácil de ser entendido e menos custoso de ser modificado sem alterar seu comportamento observável.

 

3. “Maus Cheiros” no Código

PDF Criptografado

CAPÍTULO

3

“Maus Cheiros” no Código

por Kent Beck e Martin Fowler

Se cheirar mal, troque-o.

- Vovó Beck, discutindo filosofia de traseiro de bebê.

A

gora você tem uma boa idéia de como a refatoração funciona. Mas, apenas porque sabe como ela funciona, isso não significa que você sabe quando usá-la.

Decidir quando começar a refatorar e quando parar é tão importante para a refatoração quanto a mecânica da refatoração.

Agora vem o dilema. É fácil explicar como apagar uma variável de uma instância ou criar uma hierarquia. Essas são questões simples. Tentar explicar quando você deve fazer essas coisas não é algo tão consolidado. Em vez de apelar para alguma noção vaga de estética de programação (o que francamente é o que nós consultores geralmente fazemos), eu queria algo um pouco mais concreto.

Estava meditando sobre essa questão traiçoeira quando visitei Kent Beck em Zurique. Talvez ele estivesse sob a influência dos odores de sua filha recém-nascida na época, mas ele tinha aparecido com a noção que descrevia o “quando” da refatoração em termos de cheiros. “Cheiros”, você diz, “e isto deve ser melhor do que estética vaga?”

 

4. Construindo Testes

PDF Criptografado

CAPÍTULO

4

Construindo Testes

S

e você quiser refatorar, a pré-condição essencial é ter testes sólidos. Mesmo que você tenha a sorte de possuir uma ferramenta que consiga automatizar as refatorações, ainda assim precisará de testes. Será preciso ainda muito tempo até que todas as refatorações possíveis possam ser automatizadas em uma ferramenta de refatoração.

Não vejo isso como uma desvantagem. Descobri que escrever bons testes aumenta bastante minha velocidade de programação, mesmo se eu não estiver refatorando.

Isto foi uma surpresa para mim e não é intuitivo para muitos programadores, de modo que vale a pena explicar por quê.

O Valor do Código de Autoteste

Se você vir como a maioria dos programadores gasta seu tempo, descobrirá que escrever código ocupa apenas uma pequena fração desse tempo. Algum tempo é gasto imaginando o que deveria estar acontecendo, algum tempo é gasto projetando, mas a maior parte é gasta depurando o código. Tenho certeza de que cada leitor pode lembrar de longas horas de depuração, muitas vezes noite adentro. Cada programador pode contar uma história de uma falha que levou um dia inteiro (ou mais) para ser encontrada. Consertar a falha é normalmente rápido, mas encontrá-la é um pesadelo, e quando você realmente conserta uma falha, há sempre uma chance de que outra apareça e que você não possa sequer percebê-la até que seja tarde demais. Então você gasta um tempo enorme procurando essa falha.

 

5. Rumo a um Catálogo de Refatorações

PDF Criptografado

CAPÍTULO

5

Rumo a um Catálogo de Refatorações

O

s capítulos 5 a 12 formam um catálogo inicial de refatorações. Eles se desenvolveram a partir das anotações que tenho feito a respeito de refatoração nos

últimos anos. Este catálogo não é de forma alguma completo ou fechado, mas deve fornecer uma base sólida para o seu próprio trabalho de refatoração.

Formato das Refatorações

Quando descrevo as refatorações neste e em outros capítulos, uso um formato padrão. Cada refatoração apresenta cinco partes, conforme se segue:

Começo com um nome. O nome é importante para construir um vocabulário de refatorações. Esse é o nome que uso em todo o livro.

Após o nome segue um breve resumo da situação na qual você precisa da refatoração e um resumo do que ela faz. Isso ajuda a refatorar mais rapidamente.

A motivação descreve porque a refatoração deve ser feita e as circunstâncias nas quais não deve ser feita.

A mecânica é uma descrição concisa, passo-a-passo, de como executar a refatoração.

Os exemplos mostram um uso bem simples da refatoração para ilustrar como ela funciona.

 

6. Compondo Métodos

PDF Criptografado

CAPÍTULO

6

Compondo Métodos

U

ma grande parte da minha refatoração é a composição de métodos para empacotar código apropriadamente. Quase sempre os problemas vêm de métodos que são longos demais. Métodos longos são problemáticos porque freqüentemente contêm muita informação, que fica escondida pela complexidade da lógica normalmente associada. A refatoração chave é Extrair Método (100), que pega um pedaço de código e o transforma em seu próprio método. Internalizar Método (106) é essencialmente o oposto. Você pega uma chamada de código e substitui pelo corpo do mesmo. Preciso de Internalizar Método (106) quando após ter feito diversas extrações, percebo que alguns dos métodos resultantes não “valem o que pesam” ou então se preciso reorganizar o modo pelo qual dividi os métodos.

O maior problema com Extrair Método (100) é lidar com as variáveis locais, e as variáveis temporárias são uma das maiores fontes desse problema. Quando estou trabalhando em um método, gosto de usar Substituir Variável Temporária por Consulta

 

7. Movendo Recursos Entre Objetos

PDF Criptografado

CAPÍTULO

7

Movendo Recursos Entre Objetos

U

ma das decisões mais fundamentais, se não a fundamental, no projeto orientado a objetos é onde colocar as responsabilidades. Tenho trabalhado com objetos há mais de uma década, mas ainda não consigo acertar de primeira. Isso costumava me incomodar, mas agora percebo que posso usar refatoração para mudar de idéia nesses casos.

Freqüentemente posso resolver esses problemas simplesmente usando Mover

Método (125) e Mover Campo (129) para mover o comportamento. Se precisar usar ambos, prefiro usar Mover Campo (129) primeiro e então Mover Método (125).

Muitas vezes as classes ficam inchadas com responsabilidades demais. Nesse caso, uso Extrair Classe (132) para separar algumas dessas responsabilidades. Se uma classe acabar tendo muito poucas responsabilidades, uso Internalizar Classe (136) para fundi-la com outra. Se outra classe estiver sendo usada, muitas vezes é útil ocultar esse fato com Ocultar Delegação (138). Às vezes ocultar a classe delegada resulta em alterações freqüentes na interface do dono. Nesse caso, você precisará usar Remover

 

8. Organizando Dados

PDF Criptografado

CAPÍTULO

8

Organizando Dados

N

este capítulo, discuto várias refatorações que tornam mais fácil o trabalho com dados. Para muitas pessoas, Auto-Encapsular Campo (150) parece desnecessário. Há muito tem sido motivo de um debate civilizado, se um objeto deve acessar seus próprios dados diretamente ou por meio de métodos. Às vezes, você realmente precisa de métodos de acesso e pode então obtê-los em Auto-Encapsular Campo (150). Eu geralmente uso acesso direto porque acho simples fazer essa refatoração quando preciso.

Uma das coisas úteis com relação a linguagens orientadas a objetos é que elas lhe permitem definir novos tipos que vão além do que pode ser feito com os tipos de dados simples das linguagens tradicionais. No entanto, demora um certo tempo até se acostumar com o modo de fazer isso. Muitas vezes você começa com um simples atributo e então percebe que um objeto seria mais útil. Substituir Atributo por Objeto

(153) lhe permite transformar dados que não dizem nada em objetos articulados.

 

9. Simplificando Expressões Condicionais

PDF Criptografado

CAPÍTULO

9

Simplificando Expressões

Condicionais

L

ógica condicional pode se tornar traiçoeira, de modo que aqui estão várias refatorações que você pode usar para simplificá-la. A refatoração básica aqui é

Decompor Condicional (205), a qual requer a quebra de uma expressão condicional em partes. Isso é importante porque separa a lógica variante dos detalhes do que ocorre.

As outras refatorações neste capítulo envolvem outros casos importantes. Use

Consolidar Expressão Condicional (206) quando você tiver diversos testes e todos tiverem o mesmo efeito. Use Consolidar Fragmentos Condicionais Duplicados (208) para remover qualquer duplicação dentro do código condicional.

Se você está trabalhando com código desenvolvido com a mentalidade de um

único ponto de saída, muitas vezes encontra flags de controle que permitem que condições trabalhem com essa regra. Eu não sigo a regra do ponto único de saída de um método. Conseqüentemente, uso Substituir Condição Aninhada por Cláusulas Guardas

(214) para clarear casos especiais de condicionais e Remover Flag de Controle (210) para eliminar os deselegantes flags de controle.

 

10. Tornando Mais Simples as Chamadas de Métodos

PDF Criptografado

CAPÍTULO

10

Tornando Mais Simples as

Chamadas de Métodos

O

bjetos têm tudo a ver com interfaces. Produzir interfaces que sejam fáceis de entender e usar é uma habilidade chave no desenvolvimento de bom software orientado a objetos. Este capítulo explora refatorações que tornam as interfaces mais diretas.

Muitas vezes a coisa mais simples e mais importante que você pode fazer é alterar o nome de um método. A nomeação é uma ferramenta chave na comunicação. Se você entender o que um programa está fazendo, não deve temer usar Renomear Método (233) para passar esse conhecimento adiante. Você também pode (e deve) renomear variáveis e classes. No conjunto, essas renomeações são razoavelmente simples substituições de texto, de modo que não acrescentei refatorações extras para elas.

Os próprios parâmetros têm um papel a desempenhar nas interfaces. Acrescentar

Parâmetro (235) e Remover Parâmetro (236) são refatorações comuns. Programadores novatos em objetos muitas vezes usam listas de parâmetros longas, que são típicas de outros ambientes de programação. Objetos lhe permitem manter a lista de parâmetros curta, e diversas outras refatorações mais complexas lhe dão maneiras de encurtá-las. Se você estiver passando diversos valores de um objeto, use Preservar o Objeto

 

11. Lidando com Generalização

PDF Criptografado

CAPÍTULO

11

Lidando com Generalização

G

eneralizações produzem seu próprio lote de refatorações, a maior parte lidando com a movimentação de métodos por uma hierarquia de herança. Subir

Campo na Hierarquia (274) e Subir Método na Hierarquia (275) promovem a função para níveis mais altos na hierarquia e Descer Método na Hierarquia (279) e Descer

Campo na Hierarquia (280) levam a função para níveis mais baixos na hierarquia.

Construtores são um pouco mais trabalhosos de subir, de modo que Subir o Corpo do

Construtor na Hierarquia (277) lida com essas questões. Em vez de baixar um construtor na hierarquia, é muitas vezes útil usar Substituir o Construtor por um Método Fábrica (259).

Se você tiver métodos que possuam um esboço semelhante de corpo mas que difiram em detalhes, pode usar Criar um Método Padrão (293) para separar as diferenças das similaridades.

Além de mover métodos e campos pela hierarquia, você pode alterar essa hierarquia criando novas classes. Extrair Subclasses (281), Extrair Superclasse (286) e Extrair

 

12. Refatorações Grandes

PDF Criptografado

CAPÍTULO

12

Refatorações Grandes

por Kent Beck e Martin Fowler

O

s capítulos precedentes apresentam as movimentações individuais das refatorações. O que está faltando é um sentido integral do “jogo”. Você está refatorando por algum motivo (ou, pelo menos, geralmente você está refatorando por algum motivo), não apenas para evitar ter progresso. Como se parece o jogo completo?

A Natureza do Jogo

Uma coisa que você perceberá com certeza no material que se segue é que os passos não são tão cuidadosamente descritos como nas refatorações anteriores. Isso ocorre porque as situações mudam muito nas refatorações grandes. Não podemos lhe dizer exatamente o que fazer, porque não sabemos exatamente o que você estará vendo quando executá-las. Quando você estiver acrescentando um parâmetro a um método, o mecanismo é claro porque o escopo é claro. Quando você está desembaraçando uma herança confusa, cada confusão é diferente da outra.

Outra coisa a ser percebida a respeito destas refatorações é que elas demandam tempo. Todas as refatorações do Capítulo 6 ao 11 podem ser executadas em alguns minutos ou em torno de uma hora. Temos trabalhado em algumas das refatorações grandes por meses ou anos em sistemas em execução. Quando você tem um sistema e ele está em produção e você precisa acrescentar funcionalidade, terá que dar duro para convencer os gerentes que eles devem parar o progresso por alguns meses enquanto você o arruma. Em vez disso, você tem que fazer como Hansel e Gretel e ir aos poucos, pelas bordas, um pouco hoje, um pouco mais amanhã.

 

13. Refatoração, Reúso e Realidade

PDF Criptografado

CAPÍTULO

13

Refatoração, Reúso e Realidade

por William Opdyke

M

artin Fowler eu nos encontramos pela primeira vez em Vancouver, durante a

OOPSLA 92. Alguns meses antes, eu havia terminado meu doutorado sobre refatoração de frameworks orientados a objetos1 na University of Illinois. Enquanto eu considerava continuar minha pesquisa sobre refatorações, também explorava outras opções, como informática médica. Martin estava trabalhando em um aplicativo para informática médica na época, o que nos aproximou para uma conversa durante um café em Vancouver. Como Martin relata anteriormente neste livro, passamos alguns minutos conversando sobre minha pesquisa sobre refatoração. Ele tinha interesse limitado sobre esse assunto na época, mas como você sabe agora, o interesse dele aumentou.

À primeira vista, pode parecer que a refatoração começou em laboratórios de pesquisa acadêmica. Na verdade, ela começou nas trincheiras do desenvolvimento de software, onde programadores orientados a objetos, então usando Smalltalk, encontraram situações nas quais eram necessárias técnicas para apoiar melhor o processo de desenvolvimento de frameworks ou, mais geralmente, para apoiar o processo de alterações no software. Esse embrião de pesquisa amadureceu até o ponto no qual sentimos que está

 

14. Ferramentas de Refatoração

PDF Criptografado

CAPÍTULO

14

Ferramentas de Refatoração

por Don Roberts e John Brant

U

ma das maiores barreiras à refatoração de código tem sido a aflitiva falta de ferramentas de suporte. Linguagens nas quais a refatoração é parte da cultura, como Smalltalk, geralmente têm ambientes poderosos que suportam muitas das características necessárias para refatorar código. Mesmo lá, até recentemente, o processo tem sido apenas parcialmente suportado, e a maioria do trabalho ainda está sendo feito à mão.

Refatorando com uma Ferramenta

Refatorar com suporte de uma ferramenta automatizada é diferente da refatoração manual. Mesmo com a rede de segurança de um conjunto de testes, a refatoração

à mão consome tempo. Esse simples fato impede que os programadores façam refatorações que eles sabem que deveriam fazer, simplesmente porque refatorar torna-se muito caro. Se a refatoração se tornar tão barata quanto o ajuste do formato do código, o trabalho de limpeza do código pode ser feito de uma maneira semelhante à limpeza da aparência do mesmo. Entretanto, esse tipo de limpeza pode ter um profundo efeito positivo na capacidade de manutenção, reusabilidade e legibilidade do código.

 

15. Juntando Tudo

PDF Criptografado

CAPÍTULO

15

Juntando Tudo

por Kent Beck

A

gora você tem todas as peças do quebra-cabeças. Você aprendeu as refatorações. Você estudou o catálogo. Você praticou todas as checklists. Ficou bom em testes, de modo que não está com receio. Agora você pode achar que sabe como refatorar. Ainda não.

A lista de técnicas é apenas o começo. É o portão pelo qual você deve passar. Sem as técnicas, você não consegue manipular o projeto de programas em execução. Com elas, você ainda não consegue, mas pelo menos pode começar.

Por que todas essas técnicas maravilhosas são apenas o começo? Porque você não sabe ainda quando usá-las e quando não, quando começar e quando parar, quando ir e quando esperar. É o ritmo que faz a refatoração, não as notas individuais.

Como você irá saber que está realmente conseguindo? Você saberá quando começar a se acalmar. Quando sentir confiança absoluta de que, não importa o quão estragado alguém tenha deixado o código, você pode melhorá-lo o suficiente para continuar seguindo em frente.

 

Detalhes do Produto

Livro Impresso
eBook
Capítulos

Formato
PDF
Criptografado
Sim
SKU
BP00000042593
ISBN
9788577804153
Tamanho do arquivo
1,7 MB
Impressão
Desabilitada
Cópia
Desabilitada
Vocalização de texto
Não
Formato
PDF
Criptografado
Sim
Impressão
Desabilitada
Cópia
Desabilitada
Vocalização de texto
Não
SKU
Em metadados
ISBN
Em metadados
Tamanho do arquivo
Em metadados