Refatoração: não é apenas uma palavra sofisticada para limpar seu código? [fechadas]

21

Antes da publicação do livro de Martin Fowler "Refatoração: aprimorando o design do código existente", costumávamos chamar grandes mudanças no código "rearchitecture" e pequenas alterações "cleanup". Na IMO, as técnicas de refatoração são todas de senso comum / coisas óbvias que estamos fazendo desde sempre.

Você acha que a refatoração sempre foi algo novo? Talvez apenas uma maneira de induzir o gerenciamento a alocar tempo para a limpeza do código?

Chuck Stephanski
fonte
Quando você diz "antes da publicação do livro", presumo que esteja se referindo ao livro de Martin Folwer, isso está correto?
AlexC #
-1: Qual é a utilidade desta pergunta?
Jim G.
Sim, o livro de Fowler.
Chuck Stephanski

Respostas:

43

A refatoração é mais antiga que as colinas, então não, não é novidade.

E a refatoração não está limpando. Bem, pode ser, mas não se limita à limpeza.

Está ajustando a arquitetura do seu aplicativo (em grandes ou pequenas escalas) enquanto preserva o comportamento.

Isso significa que, embora parte de seu aplicativo possa estar perfeitamente limpa e bem ontem, o novo recurso de hoje exige o ajuste dessa parte para acomodar o novo recurso.

Você não deseja interromper a funcionalidade existente, portanto, ajusta a estrutura do seu aplicativo enquanto preserva o comportamento - o que é refatoração.

Dito isto, não importa que alterações sejam feitas no código, deve-se sempre executar seus testes ... apenas por precaução.

Frank Shearar
fonte
1
Newtopian: esse é um ponto vital. Se você não executou seus testes, não tem idéia se hackou alguma coisa aleatoriamente ou se foi refatorado . (E, claro, você precisa de um conjunto de testes adequada!)
Frank Shearar
9

É apenas arrumar o código. Essencialmente, os programadores (especialmente Martin Fowler) notaram que tendiam a executar as mesmas tarefas cada vez que organizavam seu código. Eles definiram e rotularam os métodos de arrumação e problemas de código associados e pronto! A refatoração nasceu.

É o mesmo com os padrões de design - as pessoas notaram que tendiam a usar as mesmas abordagens para problemas específicos repetidas vezes. Eles rotularam e definiram as abordagens e agora parece que você não é um programador real, a menos que você use apenas a mesma dúzia de padrões no código.

Não há mágica para refatorar; é apenas um novo conjunto de jargões para descrever uma prática antiga.

Formiga
fonte
William Opdyke, 1992: Refatorando estruturas orientadas a objetos . Fowler & Beck & amigos popularizaram a refatoração. Jon Brant e Don Roberts implementaram a primeira ferramenta automatizada algum tempo antes de 1999. Portanto, "novo conjunto de jargões" não é muito preciso.
Frank Shearar
Se você aceita que a programação de computadores está acontecendo desde Ada Lovelace em meados do século XIX, então sim - é um conjunto de jargões relativamente novo.
Ant
1
Eu acho que a diferença está no Design Patterns, quase todos os desenvolvedores aprenderam alguns novos padrões e, portanto, algumas novas ferramentas do comércio do livro. Com a refatoração, não sinto que alguém realmente aprendeu alguma coisa. Há um valor secundário em apenas colocar um nome em alguma coisa (e a comparação dos padrões de design permanece lá), mas ele poderia ter feito isso com uma postagem no blog.
Chuck Stephanski
Na verdade, eu mencionei que era um novo jargão ... em relação ao cálculo lambda.
precisa saber é o seguinte
@ Chuck, você leu o livro Refatoração? Nesse caso, eu ficaria muito surpreso se você não aprendesse algo novo com isso.
Marcie
7

Fazemos três coisas separadas em nossa empresa, com tempo alocado para as três:

  • Refatoração: consiste em alterar a estrutura do código, mantendo assim o comportamento.

Exemplo: dividindo um método feio e ilegível de 100 linhas, que faz quatro coisas em quatro métodos reutilizáveis, 25 linhas cada.

  • Limpeza: consiste em fazer pequenas modificações para tornar o código mais legível sem modificar nem seu comportamento nem sua estrutura.

Exemplo: removendo o código comentado depois de garantir que esse código não seja mais necessário.

  • Aplicação de regras StyleCop / FxCop: consiste em verificar se o código corresponde ao conjunto padrão de regras StyleCop ou FxCop e, se não, modificá-lo para corresponder a essas regras.

Exemplo: adicionar Culture.Invariantem string.Format(ou outra cultura, que é mais apropriado).

Portanto, no meu caso, refatorar é algo muito diferente de limpeza . Ao fazer a limpeza, eu não tenho para executar testes de unidade novamente: se o código funcionou antes, ele vai trabalhar depois da limpeza. Em outras palavras, não é porque removi uma linha vazia ou adicionei um comentário que o código deixará de funcionar. Por outro lado, quando refato partes complicadas de um código antigo, posso cometer alguns erros; portanto, devo executar testes de unidade após a refatoração.

Arseni Mourzenko
fonte
4
Embora eu concorde que exista uma diferença fundamental entre limpeza e re-fatoração, há muitos casos em que essa linha se confunde bastante. Remover uma classe morta e "limpar" todas as referências a ela de assinaturas de método ou associações restantes seria considerado limpeza ou refatoração? Também discordo totalmente de que a execução de testes de unidade seja opcional. Você não tem idéia de como as coisas podem quebrar. Vi mudanças na cadeia de mensagens de um código de quebra de exceção porque alguém pensou que era uma boa ideia analisá-lo para agir com base em alguns erros.
Newtopian 25/03
Eu tenho que concordar com o Newtopian, principalmente sobre não ter que executar novamente os testes. De fato, deve haver um conjunto de testes automatizado que seja executado com menos frequência do que uma vez por confirmação. Independentemente de se tratar de limpeza ou refatoração , se houver uma alteração no código para confirmar o controle de versão, os testes deverão ser executados.
Kojiro # 25/11
Você sempre deve fazer uma compilação completa depois de fazer qualquer limpeza - mesmo que seja apenas espaço em branco e alterações nos comentários. Pergunte a qualquer autor de Python ou Makefile sobre isso.
JBRWilkinson
3

A refatoração adiciona conhecimento ao seu código. Se você souber que algo está nomeado incorretamente, dê um nome melhor. Se você sabe que algo pode ser feito melhor, você o transforma em algo melhor.

São muitos os passos - pequenos e grandes - que esperam resultar em um programa melhor.

user1249
fonte
3

Concordo com "refatorar é uma palavra chique para limpar seu código", mas não com "apenas". As pessoas usam palavras sofisticadas por um motivo: às vezes porque querem parecer inteligentes, e às vezes porque transmitem um significado maior ou mais preciso, e a refatoração do IMHO (mesmo que ocasionalmente mal utilizada) geralmente se refere a este último.

"Limpar" pode significar qualquer coisa, desde "reformatar um pouco" até "reescrever grandes pedaços".

"Refatoração" significa especificamente algo como "pequenas alterações incrementais no código, projetadas para manter a mesma funcionalidade, enquanto a transforma em um design melhor". E há várias práticas recomendadas para o tipo de coisa que você faz: algumas são ad-hoc, mas existem princípios gerais, como usar testes de unidade, extrair parte de funções em novas funções ou classes, etc., que as pessoas podem e devem aprender .

Você diz "apenas induza o gerenciamento a alocar tempo para a limpeza do código". Mas se dizer "refatoração" transmite corretamente o conceito de que agora um investimento constante em clareza pagará dividendos em eficiência no futuro, isso não é um "truque", é uma comunicação clara e eficaz.

Jack V.
fonte
2

Refatorar é codificar como Normalização é para dados relacionais. É um processo de abstrair conceitos em representações mais limpas, mais claras e mais eficientes de seu papel no aplicativo.

sunwukung
fonte
1
Essa é uma maneira interessante de ver isso. Talvez seja proveniente do meu histórico de banco de dados, mas há algo que me incomoda com o estresse na refatoração, e você me ajudou a colocar meu dedo nela. É que em um banco de dados o que você não conserta no design leva 10 vezes mais tempo para consertar nos testes e provavelmente 1000 vezes mais na produção. Portanto, um bom DBA é anal sobre como acertar as coisas o mais cedo possível. Minha intuição é que muito tempo para refatorar em estágios posteriores é indicativo de muito pouco tempo gasto na criação.
user21007
@ user21007: O código é muito mais complicado que um esquema de banco de dados, mas muito mais fácil de alterar e implantar.
kevin Cline
1

Depende de como você entende a refatoração de termos. Para a maioria das pessoas, esse é um processo de melhorar a estrutura sem alterar o comportamento. Se você concorda, sim, isso foi feito muito antes do lançamento deste livro. Eu sei, porque estava (entre muitas outras coisas) renomeando classes, extraindo classes e métodos antes de o livro ser escrito. Eu não estava chamando isso de refatoração, mas em essência eu estava fazendo exatamente a mesma coisa.

Para mim, refatoração pessoal é o que as pessoas chamam de "refatoração automática de código", ou seja, suporte a várias técnicas de refatoração dentro de um IDE. Esta é uma melhoria real para o que eu estava fazendo antes (o que realmente foi muito doloroso). Posso realizar uma alteração em uma classe e não me preocupar com como isso afetará o restante do software. Eu acho que Martin formalizou as técnicas de refatoração até o ponto em que poderia ser representado como algoritmo e, portanto, implementado em vários IDEs por aí.

Portanto, se você entende a refatoração como um processo, isso não é novidade. Se você vê isso como automação, sim, é uma enorme melhoria. Tente renomear algumas classes principais (literalmente, não através das opções de refatoração do seu IDE) em um projeto razoavelmente grande para ver o porquê :)

Jacek Prucia
fonte
0

A refatoração é realmente "limpeza" do código, mas também reestrutura o código. Na minha equipe, a refatoração é geralmente a última. Quando temos um caso de "refatoração", alocamos tempo para reestruturar nosso código, por exemplo, para alinhá-lo com uma nova arquitetura ou modelo de informação ou para torná-lo mais eficiente.

A "limpeza" do código é algo que fazemos continuamente, sem tempo especialmente alocado para isso. Para mim, "limpeza" geralmente é renomear, limpar comentários, etc.

Mantisen
fonte
1
renomear é uma técnica de refatoração padrão!
Chuck Stephanski
0

Eu diria que não.

Pode haver limpeza no processo de refatoração, mas não é a essência.

A limpeza vem com a suposição de que o código anterior não está limpo. Na realidade, os desenvolvedores refatoram seu código até o código original já está limpo.

O DRY é um dos principais impulsionadores da refatoração.

Ao adicionar novos códigos a uma base de códigos existente, a refatoração é feita naturalmente devido ao princípio DRY.

Just my 0.02

Oh Ho
fonte
0

Limpar seu código é como arrumar sua casa, refatorar é como derrubar um muro e possivelmente colocá-lo em outro lugar

Homde
fonte
0

Quando alguém limpa sua casa, você não consegue encontrar nada, porque o objetivo é deixar as coisas limpas e fora do caminho. A refatoração criaria e rotularia salas, armários, armários, prateleiras, caixas, etc. Ele ainda mantém a maioria das coisas (você ainda pode fazer um sanduíche de queijo grelhado na cozinha e comê-lo na sala de estar), mas deve fazê-lo mais fácil de encontrar e possivelmente ter locais eficientes para colocar coisas novas.

JeffO
fonte
Não sou fanático por palavras-chave, mas às vezes tarefas comuns precisam ser rotuladas e formalizadas para que todos saibam do que você está falando. Um cliente relata um erro e o gerente grita: "Vá limpar seu código!" você sabe que eles não estão falando sobre refatoração.
JeffO
0

O termo 'refatoração' é elegantemente emprestado da álgebra. Significa simplificar os termos para produzir o mesmo resultado. Não apenas elegante, era revolucionário - exigia uma abordagem finita e rígida ao seu código, em um nível que surpreendeu muitos. E, portanto, o próprio termo foi significativo e útil.

Smandoli
fonte
-1

Não. A refatoração está melhorando a estrutura sem alterar o comportamento. A refatoração no sentido estrito implica uma boa disciplina de teste. Isso não é necessariamente necessário quando você "limpa as coisas".

Willie Wheeler
fonte
2
atitude perigosa. Remover uma faixa inteira de código morto e configuração morta está limpando e alterando a assinatura de um único método de um refator. No entanto, em ambos os casos, eu gostaria de ter uma boa disciplina de teste para garantir que não quebrei nada.
Newtopian 25/03
Não estou dizendo que é bom / seguro / desejável fazer grandes alterações sem a disciplina de teste. Estou dizendo que a refatoração como metodologia envolve disciplina de teste, enquanto "limpar as coisas" não é uma metodologia.
Willie Wheeler
Então, se eu entendi direito, se ele não tem um nome adequado, então estamos prontos para ir !! : -Tô brincando, entendo o que você está tentando dizer, é verdade que limpar as coisas dificilmente poderia ser chamado de metodologia, mas também não é refatoração. É apenas uma palavra chique que indica que você está alterando o código sem alterar o comportamento. Não tem, por si só, nenhuma implicação nos testes. Seguindo as boas práticas de codificação, será declarado que, se o código for alterado, ele deverá ser testado independentemente de como você chamar a ação que gerou a alteração.
Newtopian 30/03
1
Claro, eu posso comprar isso. A disciplina de teste é mais sobre como executar a refatoração, mas não é inerente à definição. (Ou seja, posso refatorar o código sem nenhum teste.) Não sei se posso concordar que a refatoração não é uma metodologia - existem livros inteiros escritos com padrões passo a passo e assim por diante.
Willie Wheeler
-1

Os dois se sobrepõem um pouco nas bordas, mas para mim é a diferença entre limpar a casa e reformar a casa. A limpeza, para mim, não implica mudanças estruturais, enquanto a refatoração implica.

PSU
fonte
-2

"Refatoração" é realmente a mesma coisa que "rearchitecture", mas com uma conotação mais forte de "nenhuma funcionalidade muda". Também é mais claro em termos do objetivo da re-arquitetura, que geralmente é "fatorar" o código comum em pedaços reutilizáveis.

DVK
fonte