Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Refactoring: comece agora!

Refactoring: comece agora!

Tarsis Azevedo

September 26, 2011
Tweet

More Decks by Tarsis Azevedo

Other Decks in Programming

Transcript

  1. esse é voce? -vou fazer essa gambiarra aqui, e depois

    eu volto... Friday, July 1, 2011 ja deu essa desculpa? uma? todas?
  2. esse é voce? -vou fazer essa gambiarra aqui, e depois

    eu volto... -queria fazer isso aqui direito, mas nao tenho tempo... Friday, July 1, 2011
  3. esse é voce? -vou fazer essa gambiarra aqui, e depois

    eu volto... -queria fazer isso aqui direito, mas nao tenho tempo... -esse codigo é tao simples que nao merece um teste Friday, July 1, 2011
  4. esse é voce? -vou fazer essa gambiarra aqui, e depois

    eu volto... -queria fazer isso aqui direito, mas nao tenho tempo... -esse codigo é tao simples que nao merece um teste -vou fazer de qualquer jeito porque nunca mais vou voltar nesse codigo mesmo... Friday, July 1, 2011
  5. e por fim... • "caro nerd, isso foi feito em

    dois dias, então, nao pertube." #priceless - http:// bit.ly/jzpcxj Friday, July 1, 2011
  6. Refacoring #wtf melhorar o design do codigo de um programa

    funcional, não alterando seu comportamento. - Martin Fowler Friday, July 1, 2011 apresentaçao formal
  7. Arrumar a bagunça Friday, July 1, 2011 arrumar um design

    mal feito, remover codigo duplicado... codigo facil de mudar, de ler, de reusar e extremamente flexivel. zerar debitos tecnicos, aceleraçao constante(fisica), facil achar bugs
  8. Fix broking windows Friday, July 1, 2011 Prag-Prog a ruina

    começa com uma pequena janela quebrada. se vc deixa codigo ruim, logo seu software estará todo cheio de lixo! concerte o mais rapido possivel!
  9. comece certo Friday, July 1, 2011 testar antes, design enxuto,

    evita repetição testes te fornecem segurança para refatorar sem medo!
  10. todo o tempo! Friday, July 1, 2011 tem que ser

    parte do processo! nao tirar um dia, ou uma hora pra refatorar! tem de ser feito sempre!
  11. foco Friday, July 1, 2011 saber o que refatorar nao

    se perder procurando codigo que voce nao está mexendo
  12. disciplina Friday, July 1, 2011 quando refatorar ate onde ir

    - nao ficar polindo muito ou refatora, ou adiciona nao ser fanatico
  13. ferramenta certa Friday, July 1, 2011 conheça a linguagem/framework que

    voce trabalha; - o que ela pode fazer, - o que nao pode, - frameworks tem magicas use as ferramentas para analise estatica de codigo
  14. va devagar Friday, July 1, 2011 vá devagar, faça uma

    alteraçao de cada vez. NAO CORRA!!!
  15. o que meu codigo ganha com isso?! Friday, July 1,

    2011 legal, mas porque fazer isso se meu sistema ja funciona? porque mexer em time que ta ganhando?
  16. facil de entender Friday, July 1, 2011 o entendimento do

    resto da equipe é essencial para um projeto de sucesso. aumenta a produtividade
  17. facil de manter Friday, July 1, 2011 manter um software

    é algo muito dificil, e se voce tem um codigo bagunçado e feio, se torna quase impossivel.
  18. flexivel Friday, July 1, 2011 tornando seu software flexivel fica

    muito mais facil responder a mudanças mais rapido.
  19. reuso Friday, July 1, 2011 eliminando a duplicaçao de codigo,

    voce escreve muito menos, e faz muito mais. isso é lucro $$
  20. nomes expressivos def primes(n): s=[1,]+range(4,n+1,2)+range(6,n+1,3)+range(10,n +1,5)+range(14,n+1,7) for x in (2,3,5,7):

    s+=range(x*2,n+1,x) l=range(1,n+1) s.sort() primes=list(set(l)-set(s)) return primes Friday, July 1, 2011 nomes estranhos, funçao desorganizada, faz muita coisa!!!
  21. e o teste?! from unittest import TestCase from primes import

    primes class PrimesTest(TestCase): def test_primes_to_30(self): self.assertEquals([2, 3, 5, 7, 11, 13, 17, 19, 23, 29], primes(30) ) Friday, July 1, 2011 primeiro tenho que garantir que o codigo ruim funciona! e por incrivel que pareça, ele funciona xD
  22. nomes expressivos def primes(n): s=[1,]+range(4,n+1,2)+range(6,n+1,3)+range(10,n +1,5)+range(14,n+1,7) for x in (2,3,5,7):

    s+=range(x*2,n+1,x) l=range(1,n+1) s.sort() primes=list(set(l)-set(s)) return primes Friday, July 1, 2011 primeiro temos que clarear a funçao, colocando nomes expressivos!
  23. nomes expressivos def primes(n): s=[1,]+range(4,n+1,2)+range(6,n+1,3)+range(10,n +1,5)+range(14,n+1,7) for x in (2,3,5,7):

    s+=range(x*2,n+1,x) l=range(1,n+1) s.sort() primes=list(set(l)-set(s)) return primes Friday, July 1, 2011
  24. nomes expressivos def primes(n): s=[1,]+range(4,n+1,2)+range(6,n+1,3)+range(10,n +1,5)+range(14,n+1,7) for x in (2,3,5,7):

    s+=range(x*2,n+1,x) l=range(1,n+1) s.sort() primes=list(set(l)-set(s)) return primes Friday, July 1, 2011 nomes nada expressivos =/
  25. nomes expressivos def primes(n): sieve=[1,]+range(4,n+1,2)+range(6,n+1,3)+range(10,n +1,5)+range(14,n+1,7) for prime in (2,3,5,7):

    sieve+=range(prime*2,n+1,prime) limit=range(1,n+1) sieve.sort() primes=list(set(limit)-set(sieve)) return primes Friday, July 1, 2011 agora temos nomes que fazem mais sentido! porem, ainda temos muito trabalho a fazer!
  26. pep8 def primes(n): sieve = [1,] + range(4, n +

    1, 2) + range(6, n + 1, 3) + range(10, n + 1, 5) + range(14, n + 1, 7) for prime in (2, 3, 5, 7): sieve += range(prime * 2, n + 1, prime) limit = range(1, n + 1) sieve.sort() primes = list(set(limit) - set(sieve)) return primes Friday, July 1, 2011 pep8 - http://www.python.org/dev/peps/pep-0008/ guia de estilo para programadores python - Siga ele e seja feliz!!!
  27. nomes expressivos def primes(n): sieve = [1,] + range(4, n

    + 1, 2) + range(6, n + 1, 3) + range(10, n + 1, 5) + range(14, n + 1, 7) for prime in (2, 3, 5, 7): sieve += range(prime * 2, n + 1, prime) limit = range(1, n + 1) sieve.sort() primes = list(set(limit) - set(sieve)) return primes Friday, July 1, 2011 outro nome nada expressivo =/
  28. nomes expressivos def primes(number): sieve = [1,] + range(4, number

    + 1, 2) + range(6, number + 1, 3) + range(10, number + 1, 5) + range(14, number + 1, 7) for prime in (2, 3, 5, 7): sieve += range(prime * 2, number + 1, prime) limit = range(1, number + 1) sieve.sort() primes = list(set(limit) - set(sieve)) return primes Friday, July 1, 2011 agora as coisas ja estao melhorando!
  29. nomes expressivos def primes(number): sieve = [1,] + range(4, number

    + 1, 2) + range(6, number + 1, 3) + range(10, number + 1, 5) + range(14, number + 1, 7) for prime in (2, 3, 5, 7): sieve += range(prime * 2, number + 1, prime) limit = range(1, number + 1) sieve.sort() primes = list(set(limit) - set(sieve)) return primes Friday, July 1, 2011 o nome da funçao nao faz sentido, nao eh expressivo!!!
  30. nomes expressivos def primes_to(number): sieve = [1,] + range(4, number

    + 1, 2) + range(6, number + 1, 3) + range(10, number + 1, 5) + range(14, number + 1, 7) for prime in (2, 3, 5, 7): sieve += range(prime * 2, number + 1, prime) limit = range(1, number + 1) sieve.sort() primes = list(set(limit) - set(sieve)) return primes Friday, July 1, 2011 agora qualquer um que bater o olho no nome da funçao ja vai entender o objetivo!
  31. e o teste? Friday, July 1, 2011 nosso teste quebrou,

    e isso eh um bom sinal! ele nos da segurança!
  32. ops... from unittest import TestCase from primes import primes_to class

    PrimesTest(TestCase): def test_primes_to_30(self): self.assertEquals([2, 3, 5, 7, 11, 13, 17, 19, 23, 29], primes_to(30) ) Friday, July 1, 2011
  33. Zen of Python def primes_to(number): sieve = [1,] + range(4,

    number + 1, 2) + range(6, number + 1, 3) + range(10, number + 1, 5) + range(14, number + 1, 7) for prime in (2, 3, 5, 7): sieve += range(prime * 2, number + 1, prime) limit = range(1, number + 1) sieve.sort() primes = list(set(limit) - set(sieve)) return primes Beautiful is better than ugly. Friday, July 1, 2011 zen of python - http://www.python.org/dev/peps/pep-0020/ como tornar seu codigo Pythonico xD | esse codigo nao é nada pythonico, ele é confuso, feio e nao faz muito sentido! nossa funçao faz muita coisa!
  34. Zen of Python def is_prime(number): if number <= 1: return

    False for i in xrange(2,number): if number % i == 0: return False return True def primes_to(number): primes = [] for num in range(number): if is_prime(num): primes.append(num) return primes Beautiful is better than ugly. Friday, July 1, 2011 zen of python - http://www.python.org/dev/peps/pep-0020/ agora está mais claro o funcionamento! dividimos a responsabilidade!
  35. ta lindo, mas e se eu quiser saber todos os

    primos até 2.000.000?! Friday, July 1, 2011 ok, nosso codigo ja pode ir pra producao. porem o cliente agora quer calcular todos os numeros ate 2.000.000! e agora o refactoring e o clean code mostram seu valor!
  36. vamos ao teste! from unittest import TestCase from primes import

    primes_to class PrimesTest(TestCase): def test_primes_to_30(self): self.assertEquals([2, 3, 5, 7, 11, 13, 17, 19, 23, 29], primes_to(30)) def test_primes_to_2000000(self): self.assertEquals([“?”], primes_to(2000000)) Friday, July 1, 2011
  37. crivo de erastostenes from unittest import TestCase from primes import

    primes_to from primos_ate_2000000 import primos_ate_2000000 class PrimesTest(TestCase): def test_primes_to_30(self): self.assertEquals([2, 3, 5, 7, 11, 13, 17, 19, 23, 29], primes_to(30) ) def test_primes_to_2000000(self): self.assertEquals(primos_ate_2000000, primes_to(2000000) ) Friday, July 1, 2011 essa lista tem 148933 itens!
  38. crivo de erastostenes import math def primes_to(number): sieve = [index

    for index in xrange(2, number + 1)] limit = int(math.sqrt(number)) for index1 in xrange(0, limit): if not sieve[index1]: continue for index2 in xrange(index1 + 1, number - 1): if sieve[index2] and (not (sieve[index2] % sieve[index1])): sieve[index2] = 0 return [index for index in xrange(2, number + 1)] Friday, July 1, 2011 esse eh o crivo!
  39. acabou?! import math def primes_to(number): sieve = [index for index

    in xrange(2, number + 1)] limit = int(math.sqrt(number)) for index1 in xrange(0, limit): if not sieve[index1]: continue for index2 in xrange(index1 + 1, number - 1): if sieve[index2] and (not (sieve[index2] % sieve[index1])): sieve[index2] = 0 return [index for index in xrange(2, number + 1)] Friday, July 1, 2011
  40. mais claro! import math def fill_sieve(number): return [index for index

    in xrange(2, number + 1)] def remove_zeros(sieve): return [sieve[index] for index in xrange(len(sieve)) if sieve[index]] def primes_to(number): sieve = fill_sieve(number) limit = int(math.sqrt(number)) for index1 in xrange(0, limit): if not sieve[index1]: continue for index2 in xrange(index1 + 1, number - 1): if sieve[index2] and (not (sieve[index2] % sieve [index1])): sieve[index2] = 0 return remove_zeros(sieve) Friday, July 1, 2011
  41. mas... import math def fill_sieve(number): return [index for index in

    xrange(2, number + 1)] def remove_zeros(sieve): return [sieve[index] for index in xrange(len(sieve)) if sieve[index]] def primes_to(number): sieve = fill_sieve(number) limit = int(math.sqrt(number)) for index1 in xrange(0, limit): if not sieve[index1]: continue for index2 in xrange(index1 + 1, number - 1): if sieve[index2] and (not (sieve[index2] % sieve [index1])): sieve[index2] = 0 return remove_zeros(sieve) Friday, July 1, 2011
  42. agora sim! import math def fill_sieve(number): return [index for index

    in xrange(2, number + 1)] def remove_zeros(sieve): return [sieve[index] for index in xrange(len(sieve)) if sieve[index]] def sieve_of_erastostenes(number): sieve = fill_sieve(number) limit = int(math.sqrt(number)) for index1 in xrange(0, limit): if not sieve[index1]: continue for index2 in xrange(index1 + 1, number - 1): if sieve[index2] and (not (sieve[index2] % sieve [index1])): sieve[index2] = 0 return sieve def primes_to(number): sieve = sieve_of_erastostenes(number) return remove_zeros(sieve) Friday, July 1, 2011
  43. agora é com voce! Friday, July 1, 2011 estude, ganhe

    experiencia, refatore codigos open source, coding dojo!
  44. referencias • artigos • - http://pragprog.com/the-pragmatic- programmer/extracts/software-entropy • - http://

    myadventuresincoding.wordpress.com/ 2009/03/24/working-with-legacy-code- lessons-learned/ Friday, July 1, 2011