SlideShare une entreprise Scribd logo
1  sur  71
Télécharger pour lire hors ligne
Refactoring
                         comece agora




Friday, July 1, 2011
Entao você é o famoso
                       @tarsisazevedo
                       github.com/tarsis
                       desenvolvedor globo.com
                       #cobrateam member - github.com/cobrateam/



Friday, July 1, 2011
E vocês?
                           Tdd?
                           Dojo?
                          Python?
                        Refactoring?




Friday, July 1, 2011
esse é voce?
          -vou fazer essa gambiarra aqui, e depois eu volto...




Friday, July 1, 2011

ja deu essa desculpa? uma? todas?
esse é voce?
              -vou fazer essa gambiarra aqui, e depois eu volto...
              -queria fazer isso aqui direito, mas nao tenho tempo...




Friday, July 1, 2011
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
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 demesmo... jeito porque nunca mais vou voltar
        nesse codigo
                       qualquer




Friday, July 1, 2011
e por fim...

                       • "caro nerd, isso foi feito em dois dias,
                         então, nao pertube." #priceless - http://
                         bit.ly/jzpcxj




Friday, July 1, 2011
You Are Doing It Wrong!




Friday, July 1, 2011
e agora, quem poderá
                           nos defender...


Friday, July 1, 2011
Chapolin?!




Friday, July 1, 2011
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
HÃ?!




Friday, July 1, 2011
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
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!
legal, #comofaz?




Friday, July 1, 2011
comece certo




Friday, July 1, 2011

testar antes, design enxuto, evita repetição
testes te fornecem segurança para refatorar sem medo!
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!
foco




Friday, July 1, 2011

saber o que refatorar
nao se perder procurando codigo que voce nao está mexendo
disciplina




Friday, July 1, 2011

quando refatorar
ate onde ir - nao ficar polindo muito
ou refatora, ou adiciona
nao ser fanatico
don’t repeat yourself




Friday, July 1, 2011
seja expressivo




Friday, July 1, 2011

nomes que fazem sentido
organizaçao do codigo é importante
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
va devagar




Friday, July 1, 2011

vá devagar, faça uma alteraçao de cada vez. NAO CORRA!!!
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?
facil de entender



Friday, July 1, 2011

o entendimento do resto da equipe é essencial para um projeto de sucesso.
aumenta a produtividade
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.
flexivel



Friday, July 1, 2011

tornando seu software flexivel fica muito mais facil responder a mudanças mais rapido.
reuso



Friday, July 1, 2011

eliminando a duplicaçao de codigo, voce escreve muito menos, e faz muito mais.
isso é lucro $$
show me the code




Friday, July 1, 2011
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!!!
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
funciona xD




Friday, July 1, 2011
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!
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 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 =/
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!
e ainda funciona xD




Friday, July 1, 2011
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!!!
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 =/
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!
e continua funcionando




Friday, July 1, 2011
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!!!
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!
e o teste?




Friday, July 1, 2011

nosso teste quebrou, e isso eh um bom sinal!
ele nos da segurança!
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
aew o/




Friday, July 1, 2011

pronto! acabou?!
Zen of Python
                       Beautiful is better than ugly.

    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

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!
Zen of Python
                       Beautiful is better than ugly.

                       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
Friday, July 1, 2011

zen of python - http://www.python.org/dev/peps/pep-0020/
agora está mais claro o funcionamento! dividimos a responsabilidade!
duvido que funcione!




Friday, July 1, 2011
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!
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
depois de 13 minutos....




Friday, July 1, 2011

é, ta lento! precisamos refatorar!
e agora?!



Friday, July 1, 2011
crivo de erastostenes



Friday, July 1, 2011

crivo - http://pt.wikipedia.org/wiki/Crivo_de_Erat%C3%B3stenes
é um algoritmo para encontrar numeros primos ate um numero x
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!
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!
agora sim!




Friday, July 1, 2011
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
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
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
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):
Friday, July 1, 2011       sieve = sieve_of_erastostenes(number)
                           return remove_zeros(sieve)
e o teste!?




Friday, July 1, 2011
agora é com voce!




Friday, July 1, 2011

estude, ganhe experiencia, refatore codigos open source, coding dojo!
referencias
                       • Livros
                        • - Refactoring - Martin Fowler
                        • - Clean Code




Friday, July 1, 2011
referencias

                       • slides
                        • - http://www.slideshare.net/caikesouza/
                           refactoring-5412194
                        • - http://www.slideshare.net/nashjain/
                           refactoring-fest



Friday, July 1, 2011
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
referencias

                       • catalogo de refatoraçoes
                        • - http://www.refactoring.com/catalog/
                           index.html
                       • site
                        • - http://refactormycode.com/

Friday, July 1, 2011
palestra


                       • github.com/tarsis/palestra-fisl



Friday, July 1, 2011
http://bit.ly/pb7-
Friday, July 1, 2011

vai que eh boa!
2 palavras




Friday, July 1, 2011

Contenu connexe

En vedette

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Applitools
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at WorkGetSmarter
 

En vedette (20)

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work
 
ChatGPT webinar slides
ChatGPT webinar slidesChatGPT webinar slides
ChatGPT webinar slides
 

Refactoring: Comece agora! (ou como não perder o sono ao olhar o código amanha)

  • 1. Refactoring comece agora Friday, July 1, 2011
  • 2. Entao você é o famoso @tarsisazevedo github.com/tarsis desenvolvedor globo.com #cobrateam member - github.com/cobrateam/ Friday, July 1, 2011
  • 3. E vocês? Tdd? Dojo? Python? Refactoring? Friday, July 1, 2011
  • 4. esse é voce? -vou fazer essa gambiarra aqui, e depois eu volto... Friday, July 1, 2011 ja deu essa desculpa? uma? todas?
  • 5. esse é voce? -vou fazer essa gambiarra aqui, e depois eu volto... -queria fazer isso aqui direito, mas nao tenho tempo... Friday, July 1, 2011
  • 6. 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
  • 7. 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 demesmo... jeito porque nunca mais vou voltar nesse codigo qualquer Friday, July 1, 2011
  • 8. e por fim... • "caro nerd, isso foi feito em dois dias, então, nao pertube." #priceless - http:// bit.ly/jzpcxj Friday, July 1, 2011
  • 9. You Are Doing It Wrong! Friday, July 1, 2011
  • 10. e agora, quem poderá nos defender... Friday, July 1, 2011
  • 12. 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
  • 14. 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
  • 15. 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!
  • 17. comece certo Friday, July 1, 2011 testar antes, design enxuto, evita repetição testes te fornecem segurança para refatorar sem medo!
  • 18. 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!
  • 19. foco Friday, July 1, 2011 saber o que refatorar nao se perder procurando codigo que voce nao está mexendo
  • 20. disciplina Friday, July 1, 2011 quando refatorar ate onde ir - nao ficar polindo muito ou refatora, ou adiciona nao ser fanatico
  • 22. seja expressivo Friday, July 1, 2011 nomes que fazem sentido organizaçao do codigo é importante
  • 23. 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
  • 24. va devagar Friday, July 1, 2011 vá devagar, faça uma alteraçao de cada vez. NAO CORRA!!!
  • 25. 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?
  • 26. facil de entender Friday, July 1, 2011 o entendimento do resto da equipe é essencial para um projeto de sucesso. aumenta a produtividade
  • 27. 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.
  • 28. flexivel Friday, July 1, 2011 tornando seu software flexivel fica muito mais facil responder a mudanças mais rapido.
  • 29. reuso Friday, July 1, 2011 eliminando a duplicaçao de codigo, voce escreve muito menos, e faz muito mais. isso é lucro $$
  • 30. show me the code Friday, July 1, 2011
  • 31. 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!!!
  • 32. 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
  • 34. 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!
  • 35. 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
  • 36. 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 =/
  • 37. 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!
  • 38. e ainda funciona xD Friday, July 1, 2011
  • 39. 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!!!
  • 40. 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 =/
  • 41. 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!
  • 43. 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!!!
  • 44. 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!
  • 45. e o teste? Friday, July 1, 2011 nosso teste quebrou, e isso eh um bom sinal! ele nos da segurança!
  • 46. 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
  • 47. aew o/ Friday, July 1, 2011 pronto! acabou?!
  • 48. Zen of Python Beautiful is better than ugly. 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 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!
  • 49. Zen of Python Beautiful is better than ugly. 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 Friday, July 1, 2011 zen of python - http://www.python.org/dev/peps/pep-0020/ agora está mais claro o funcionamento! dividimos a responsabilidade!
  • 51. 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!
  • 52. 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
  • 53. depois de 13 minutos.... Friday, July 1, 2011 é, ta lento! precisamos refatorar!
  • 55. crivo de erastostenes Friday, July 1, 2011 crivo - http://pt.wikipedia.org/wiki/Crivo_de_Erat%C3%B3stenes é um algoritmo para encontrar numeros primos ate um numero x
  • 56. 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!
  • 57. 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!
  • 59. 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
  • 60. 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
  • 61. 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
  • 62. 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): Friday, July 1, 2011 sieve = sieve_of_erastostenes(number) return remove_zeros(sieve)
  • 63. e o teste!? Friday, July 1, 2011
  • 64. agora é com voce! Friday, July 1, 2011 estude, ganhe experiencia, refatore codigos open source, coding dojo!
  • 65. referencias • Livros • - Refactoring - Martin Fowler • - Clean Code Friday, July 1, 2011
  • 66. referencias • slides • - http://www.slideshare.net/caikesouza/ refactoring-5412194 • - http://www.slideshare.net/nashjain/ refactoring-fest Friday, July 1, 2011
  • 67. 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
  • 68. referencias • catalogo de refatoraçoes • - http://www.refactoring.com/catalog/ index.html • site • - http://refactormycode.com/ Friday, July 1, 2011
  • 69. palestra • github.com/tarsis/palestra-fisl Friday, July 1, 2011
  • 70. http://bit.ly/pb7- Friday, July 1, 2011 vai que eh boa!