Refatorar é... ● Mudar a estrutura do código ● SEM mudar o comportamento externo ● Visando melhorar o design Em geral, envolve fazer uma série de pequenas mudanças preservando o funcionamento.
Refatorar NÃO é... ● Reescrever um módulo/função ● Alterar um código, mudando o comportamento ● Adicionar ou remover um recurso Mesmo que essas coisas visem melhorar o design!
Primeiro, refatorar requer um lock Reestruturar código preservando comportamento é algo que precisa ser feito de maneira “atômica” Ou seja, quando estiver refatorando, não faça outras coisas ao mesmo tempo: apenas refatore
Refatorar é pra ser um hábito ● Cotidiano, como tomar água, abrir o editor, rodar o código, rodar os testes ● Não é algo que você precise pedir permissão pro gerente A seguir vamos ver alguns exemplos
Exemplos: extrair variável if cur_page < max(int(x) for x in page_links): goto_page(cur_page + 1) total_pages = max(int(x) for x in page_links) if cur_page < total_pages: goto_page(cur_page + 1)
Exemplos: inline da variável (inverso de extrair) if cur_page < max(int(x) for x in page_links): goto_page(cur_page + 1) total_pages = max(int(x) for x in page_links) if cur_page < total_pages: goto_page(cur_page + 1)
Exemplos: extrair função if cur_page < max(int(x) for x in page_links): goto_page(cur_page + 1) def get_total_pages(): return max(int(x) for x in page_links) if cur_page < get_total_pages(): goto_page(cur_page + 1)
Exemplos: extrair função (opção 2) if cur_page < max(int(x) for x in page_links): goto_page(cur_page + 1) def get_total_pages(all_pages): return max(int(x) for x in all_pages) if cur_page < get_total_pages(page_links): goto_page(cur_page + 1)
Exemplos: inline da função (inverso de extrair) if cur_page < max(int(x) for x in page_links): goto_page(cur_page + 1) def get_total_pages(all_pages): return max(int(x) for x in all_pages) if cur_page < get_total_pages(page_links): goto_page(cur_page + 1)
Refatoração & YAGNI ● Humanos são péssimos em antecipar mudanças ● “You Aren’t Gonna Need It”: princípio que preza pela simplicidade, não olhando muito para o futuro, evitando complexidade desnecessária ● Você precisa refatorar para obter simplicidade ● Refatore para os casos de uso conhecidos
Refatorar precisa ser fácil! Para isso, é preciso: ● Dominar profundamente a linguagem ○ Quanto mais coisas você souber fazer de cabeça, mais fácil fica ● Escrever testes ○ É uma necessidade básica ● Obter boas ferramentas ● Educar-se e praticar ○ Ler livros, ler código dos outros, tentar refactor grande num branch
● Qual a ferramenta de refatoração mais popular entre os Pythonistas? ○ grep (e similares) ○ Será que não podemos fazer melhor? “The cobbler’s children have no shoes” Sobre ferramentas
● https://github.com/python-rope/rope ● Biblioteca de refatorações ○ e outras coisas mais (jump to definition) ● Plugins para VIM/Emacs/Sublime: ○ UI espartana ○ Poucas pessoas conhecem & usam ● Pessoalmente, uso pouco, a UI me assusta ○ Tenho mappings no VIM para as refatorações mais simples Rope -- is there hope?
Thanks! Elias Dorneles @eliasdorneles Algumas referências ● http://refactoring.com ● http://martinfowler.com/articles/ workflowsOfRefactoring ● https://www.infoq.com/br/articles /is-design-dead ● https://pythonhelp.wordpress.co m/2016/10/01/usando-comando- with-para-evitar-acoplamento-te mporal/ ● Livro do Martin Fowler ● Livro The Pragmatic Programmer