SlideShare uma empresa Scribd logo
1 de 43
Baixar para ler offline
Refactoring
   Bruno Lui
   @bruno_lui
O que é
Refactoring?
“Processo de alterar e
    melhorar o código
de um software de maneira
 que seu comportamento
    não seja alterado”
“Uma maneira disciplinada de
limpar código, que minimiza as
 chances de introduzir bugs”
Porque refatorar ?
Para melhorar o
design do código
   existente
evitando que ele
fique decadente..
Para ajudar a
encontrar bugs..
Para tornar o código mais
    fácil de entender..
Para tornar o código mais
barato e rápido de modificar
Quando começamos a mergulhar no código ruim, logo
descobrimos várias “oportunidades” para refatorá-lo...
E quanto mais fundo vamos, mais dessas
                  “opotunidades” aparecem..




aumentando nossa vontade de alterar...
Antes de começar a cavar a própria cova,
               saiba que...
A Refatoração
deve ser uma
   prática
sistemática      e

 disciplinada.
Quando refatorar ?
Quando vamos adicionar uma nova funcionalidade



O código que deve ser alterado
     está difícil de entender.



O design não ajuda a adicionar
a nova funcionalidade facilmente
Quando vamos corrigir um bug



Um bug reportado pode ser um
sinal que o código não estava claro
o bastante para evitá-lo.
Quando vamos revisar o código de alguém


 O código pode parecer limpo para mim, mas não para
 minha equipe.


Sugestões podem ajudar
a melhorar o código.
"Decidir quando começar e quando parar
  uma refatoração, é tão importante
     quanto saber como fazê-la."
Quando não refatorar

Muitas aplicações estão totalmente acopladas
                          ao banco de dados.


            Quando um código estiver tão cheio
            de bugs ou com um design muito ruim,
            é melhor começar do zero.
Primeiro passo...

Criar um conjunto de testes sólidos
para garantir que sua refatoração
não quebre o código que está
funcionando.
Técnicas de
refatoração
Extract Method

Transformar um trecho de código em um novo método.

             O seu nome deve explicar seu propósito.



            Muitos problemas vêm de métodos muito
                    grandes e com muita informação.
Remove temp with query

Quando transformamos uma variável temporária usada
   para guardar o resultado de uma expressão em um
                                           método.
double precoBase = quantidade * preco;


if (precoBase > 1000) {
  return precoBase * 0.95;
} else {
  return precoBase * 0.98;
}




   if (precoBase() > 1000) {
       return precoBase() * 0.95;
   } else {
       return precoBase() * 0.98;
   }


   double precoBase() {
       return quantidade * preco;
   }
Move method/field
  Mover um método/atributo quando é ou será usado em
      outras classes além da classe em que está definido.


Métodos: Crie um novo método com o mesmo corpo na classe
mais usada, e apenas delegue a chamada do método antigo para o
novo.


Atributos: Crie um novo atributo em outra classe e use o
encapsulamento para delegar.
Extract class
      Quando uma classe está fazendo o trabalho de duas.


class Person {                class Person {
  String name;                  String name;
  String officeAreaCode;        ...
  String officeNumber;          TelephoneNumber officePhone;
  ...                         }
}



                                class TelephoneNumber {
                                  String areaCode;
                                  String number;
                                }
Hide delegate

Remova a dependência de uma classe que possua um
         delegate para um atributo de outra classe.
class Pessoa {                               class Pessoa {
  Departamento departamento;                   Departamento departamento;

    public Departamento getDepartamento(){       public Pessoa getGerente() {
      return departamento;                         return departamento.getGerente();
    }                                            }
}                                            }

class Departamento {
  private Pessoa gerente;

    public Pessoa getGerente() {
      return gerente;
    }
}




                 gerente = joao.getDepartamento().getGerente();




                         gerente = joao.getGerente();
Remove middle man
                              O contrário do Hide Delegate.
          Crie um método para acessar o atributo encapsulado.




Quando há muitos atributos na classe delegate e você precisa
ficar criando novos métodos toda vez.
Replace data value with object

Quando um item que precisa de um comportamento adicional


                                Order

     Order
     _________________
                                        1
     customer: String
                                Customer
                                _________________

                                name: String
Encapsulate Collection
      Quando somente temos o método para retornar a
                                 collection imutável.

 Criamos métodos para adicionar e remover elementos.


                            Person
Person
                            _________________
_________________

                            getCourses():Unmodifiable Set
getCourses():Set
                            addCourse(:Course)
setCourses(:Set)
                            removeCourse(:Course)
Decompose Conditional

 Uma lógica condicional não muito legível aumenta a complexidade.

Pode facilmente nos confundir e alterar o comportamento desejado.
Decompose Conditional

if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
  charge = quantity * winterRate + winterSeviceCharge;
} else {
  charge = quantity * summerRate;
}




if (notSummer(date)) {
  charge = winterCharge(quantity);
} else {
  charge = summerCharge(quantity);
}
Consolidate Duplicate conditional fragments


        Quando temos o mesmo trecho de código dentro de
                                 uma lógica condicional.

                               Mova-o para fora da lógica.
Consolidate Duplicate conditional fragments

  if (isSpecial()) {
    total = price * 0.95;
    send();
  } else {
    total = price * 0.98;
    send();
  }




  if (isSpecial()) {
    total = price * 0.95;
  } else {
    total = price * 0.98;
  }
  send();
Separate query from modifier

Quando o mesmo método retorna um valor e altera o estado de um
                                                        objeto.

                                              Separe-o em dois métodos.

                               Customer
                  __________________________________
              getTotalOutstandingAndSetReadyForSummaries




                             Customer
                         _________________
                      getTotalOutstanding
                      setReadyForSummaries
Parameterize Method


Vários métodos fazem coisas parecidas mas com valores diferentes.
                        Unifique o método e parametrize o valor.




         Employee                         Employee
     _________________                _________________

  fivePercentRaise()                raise(percentage)
  tenPercentRaise()
Preserve whole object

Quando usamos vários valores de um objeto para passá-los para outro método.

                                    Passe o objeto inteiro por parametro.


                    int low = period.getLow();
                    int high = period.getHigh();

                    withinPlan = plan.withinRange(low, high);




                    withinPlan = plan.withinRange(period);
Martin Fowler
“Qualquer idiota consegue escrever
código que o computador entenda...
...mas só bons
programadores   conseguem
escrever código que outras
   pessoas entendam.”
Referências


                 http://www.slideshare.net/gvespucci/refactoring-an-introduction

                 http://www.slideshare.net/redigon/refactoring-1658371




                                         Imagens
http://www.flickr.com/photos/68751915@N05/6848823919
http://www.flickr.com/photos/raiderslight/2800096351/
http://theassistant.files.wordpress.com/2009/11/013.jpg
http://www.flickr.com/photos/birminghamcityuniversity/5367360800/
http://1.bp.blogspot.com/_9iN8wXq1y_s/TOF3u11KD1I/AAAAAAAAAEg/v3HOYSzJlzo/s1600/why2.jpg
http://greatmiddleway.files.wordpress.com/2012/03/doubt1.jpg
http://www.sxc.hu/photo/1133804
http://tweakyourbiz.com/growth/files/reviews.jpg
http://torwars.com/wp-content/uploads/2012/01/patch-notes-and-bug-fixes-SWTOR.png
http://www.revenuewoo.com/wp-content/uploads/2012/05/BlogUpp_new_features-788925.jpg
Obrigado!

Mais conteúdo relacionado

Mais procurados

Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Mario Jorge Pereira
 
Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2irenescotolo
 
JAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTOJAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTOAndré Victor
 
Exercícios de programação orientado a objeto
Exercícios de programação orientado a objetoExercícios de programação orientado a objeto
Exercícios de programação orientado a objetoGleyciana Garrido
 
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...Manuel Menezes de Sequeira
 
Clean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHPClean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHPRafael Neris
 
Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Natanael Fonseca
 

Mais procurados (20)

POO - 06 - Encapsulamento
POO - 06 - EncapsulamentoPOO - 06 - Encapsulamento
POO - 06 - Encapsulamento
 
POO - 10 - Herança
POO - 10 - HerançaPOO - 10 - Herança
POO - 10 - Herança
 
Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java
 
POO - 24 - Classes Básicas do Java - Datas
POO - 24 - Classes Básicas do Java - DatasPOO - 24 - Classes Básicas do Java - Datas
POO - 24 - Classes Básicas do Java - Datas
 
Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2
 
Aula5
Aula5Aula5
Aula5
 
Solid
SolidSolid
Solid
 
POO - 14 - Vetores
POO - 14 - VetoresPOO - 14 - Vetores
POO - 14 - Vetores
 
POO - 07 - Operadores do Java
POO - 07 - Operadores do  JavaPOO - 07 - Operadores do  Java
POO - 07 - Operadores do Java
 
Encapsulamento em oo
Encapsulamento em ooEncapsulamento em oo
Encapsulamento em oo
 
POO - 17 - Interfaces
POO - 17 - InterfacesPOO - 17 - Interfaces
POO - 17 - Interfaces
 
POO - 09 - Entradas e Saídas em Java
POO - 09 - Entradas e Saídas em JavaPOO - 09 - Entradas e Saídas em Java
POO - 09 - Entradas e Saídas em Java
 
POO - 05 - Ambiente de Desenvolvimento
POO - 05 - Ambiente de DesenvolvimentoPOO - 05 - Ambiente de Desenvolvimento
POO - 05 - Ambiente de Desenvolvimento
 
05 poo-ii
05   poo-ii05   poo-ii
05 poo-ii
 
JAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTOJAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTO
 
Exercícios de programação orientado a objeto
Exercícios de programação orientado a objetoExercícios de programação orientado a objeto
Exercícios de programação orientado a objeto
 
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
 
Java7
Java7Java7
Java7
 
Clean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHPClean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHP
 
Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Curso Java Básico - Aula 03
Curso Java Básico - Aula 03
 

Semelhante a Refactoring

Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoJuciellen Cabrera
 
Aula 3 - Java Prof.ª Cristiane Fidelix
Aula 3 -  Java Prof.ª Cristiane FidelixAula 3 -  Java Prof.ª Cristiane Fidelix
Aula 3 - Java Prof.ª Cristiane FidelixCris Fidelix
 
Tutorial java orientação a objetos parte 1
Tutorial java orientação a objetos parte 1Tutorial java orientação a objetos parte 1
Tutorial java orientação a objetos parte 1Elaine Cecília Gatto
 
Java - Visão geral e Exercícios
Java - Visão geral e ExercíciosJava - Visão geral e Exercícios
Java - Visão geral e ExercíciosArthur Emanuel
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetrosMaurício Linhares
 
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...Professor Samuel Ribeiro
 
Heranca reescrita e_polimorfismo
Heranca reescrita e_polimorfismoHeranca reescrita e_polimorfismo
Heranca reescrita e_polimorfismoPedro Neto
 
Java 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De ClasseJava 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De ClasseRegis Magalhães
 
Curso Java Básico - Aula02
Curso Java Básico - Aula02Curso Java Básico - Aula02
Curso Java Básico - Aula02Natanael Fonseca
 
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Elvis Rocha
 
introdução a linguagem java-2003
introdução a linguagem java-2003introdução a linguagem java-2003
introdução a linguagem java-2003elliando dias
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverEduardo Jorge
 

Semelhante a Refactoring (20)

Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 
Code Smells
Code SmellsCode Smells
Code Smells
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no código
 
Aula 3 - Java Prof.ª Cristiane Fidelix
Aula 3 -  Java Prof.ª Cristiane FidelixAula 3 -  Java Prof.ª Cristiane Fidelix
Aula 3 - Java Prof.ª Cristiane Fidelix
 
Tutorial java orientação a objetos parte 1
Tutorial java orientação a objetos parte 1Tutorial java orientação a objetos parte 1
Tutorial java orientação a objetos parte 1
 
Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2
 
Java - Visão geral e Exercícios
Java - Visão geral e ExercíciosJava - Visão geral e Exercícios
Java - Visão geral e Exercícios
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetros
 
Dip the dependency inversion principle
Dip   the dependency inversion principleDip   the dependency inversion principle
Dip the dependency inversion principle
 
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
 
Heranca reescrita e_polimorfismo
Heranca reescrita e_polimorfismoHeranca reescrita e_polimorfismo
Heranca reescrita e_polimorfismo
 
Tutorial Java: Herança
Tutorial Java: HerançaTutorial Java: Herança
Tutorial Java: Herança
 
POO.pdf
POO.pdfPOO.pdf
POO.pdf
 
Java 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De ClasseJava 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De Classe
 
Dip the dependency inversion principle
Dip   the dependency inversion principleDip   the dependency inversion principle
Dip the dependency inversion principle
 
Dip the dependency inversion principle
Dip   the dependency inversion principleDip   the dependency inversion principle
Dip the dependency inversion principle
 
Curso Java Básico - Aula02
Curso Java Básico - Aula02Curso Java Básico - Aula02
Curso Java Básico - Aula02
 
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
 
introdução a linguagem java-2003
introdução a linguagem java-2003introdução a linguagem java-2003
introdução a linguagem java-2003
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserver
 

Mais de Bruno Lui

Functional Programming
Functional ProgrammingFunctional Programming
Functional ProgrammingBruno Lui
 
Introdução ao Android
Introdução ao AndroidIntrodução ao Android
Introdução ao AndroidBruno Lui
 
Inversion of control
Inversion of controlInversion of control
Inversion of controlBruno Lui
 
Passionate programmer - Parte 1
Passionate programmer - Parte 1Passionate programmer - Parte 1
Passionate programmer - Parte 1Bruno Lui
 

Mais de Bruno Lui (6)

Functional Programming
Functional ProgrammingFunctional Programming
Functional Programming
 
Switch
SwitchSwitch
Switch
 
Introdução ao Android
Introdução ao AndroidIntrodução ao Android
Introdução ao Android
 
Inversion of control
Inversion of controlInversion of control
Inversion of control
 
Passionate programmer - Parte 1
Passionate programmer - Parte 1Passionate programmer - Parte 1
Passionate programmer - Parte 1
 
Clean Code
Clean CodeClean Code
Clean Code
 

Refactoring

  • 1. Refactoring Bruno Lui @bruno_lui
  • 3. “Processo de alterar e melhorar o código de um software de maneira que seu comportamento não seja alterado”
  • 4. “Uma maneira disciplinada de limpar código, que minimiza as chances de introduzir bugs”
  • 6. Para melhorar o design do código existente evitando que ele fique decadente..
  • 8. Para tornar o código mais fácil de entender..
  • 9. Para tornar o código mais barato e rápido de modificar
  • 10. Quando começamos a mergulhar no código ruim, logo descobrimos várias “oportunidades” para refatorá-lo...
  • 11. E quanto mais fundo vamos, mais dessas “opotunidades” aparecem.. aumentando nossa vontade de alterar...
  • 12. Antes de começar a cavar a própria cova, saiba que...
  • 13. A Refatoração deve ser uma prática sistemática e disciplinada.
  • 15. Quando vamos adicionar uma nova funcionalidade O código que deve ser alterado está difícil de entender. O design não ajuda a adicionar a nova funcionalidade facilmente
  • 16. Quando vamos corrigir um bug Um bug reportado pode ser um sinal que o código não estava claro o bastante para evitá-lo.
  • 17. Quando vamos revisar o código de alguém O código pode parecer limpo para mim, mas não para minha equipe. Sugestões podem ajudar a melhorar o código.
  • 18. "Decidir quando começar e quando parar uma refatoração, é tão importante quanto saber como fazê-la."
  • 19. Quando não refatorar Muitas aplicações estão totalmente acopladas ao banco de dados. Quando um código estiver tão cheio de bugs ou com um design muito ruim, é melhor começar do zero.
  • 20. Primeiro passo... Criar um conjunto de testes sólidos para garantir que sua refatoração não quebre o código que está funcionando.
  • 22. Extract Method Transformar um trecho de código em um novo método. O seu nome deve explicar seu propósito. Muitos problemas vêm de métodos muito grandes e com muita informação.
  • 23. Remove temp with query Quando transformamos uma variável temporária usada para guardar o resultado de uma expressão em um método.
  • 24. double precoBase = quantidade * preco; if (precoBase > 1000) { return precoBase * 0.95; } else { return precoBase * 0.98; } if (precoBase() > 1000) { return precoBase() * 0.95; } else { return precoBase() * 0.98; } double precoBase() { return quantidade * preco; }
  • 25. Move method/field Mover um método/atributo quando é ou será usado em outras classes além da classe em que está definido. Métodos: Crie um novo método com o mesmo corpo na classe mais usada, e apenas delegue a chamada do método antigo para o novo. Atributos: Crie um novo atributo em outra classe e use o encapsulamento para delegar.
  • 26. Extract class Quando uma classe está fazendo o trabalho de duas. class Person { class Person { String name; String name; String officeAreaCode; ... String officeNumber; TelephoneNumber officePhone; ... } } class TelephoneNumber { String areaCode; String number; }
  • 27. Hide delegate Remova a dependência de uma classe que possua um delegate para um atributo de outra classe.
  • 28. class Pessoa { class Pessoa { Departamento departamento; Departamento departamento; public Departamento getDepartamento(){ public Pessoa getGerente() { return departamento; return departamento.getGerente(); } } } } class Departamento { private Pessoa gerente; public Pessoa getGerente() { return gerente; } } gerente = joao.getDepartamento().getGerente(); gerente = joao.getGerente();
  • 29. Remove middle man O contrário do Hide Delegate. Crie um método para acessar o atributo encapsulado. Quando há muitos atributos na classe delegate e você precisa ficar criando novos métodos toda vez.
  • 30. Replace data value with object Quando um item que precisa de um comportamento adicional Order Order _________________ 1 customer: String Customer _________________ name: String
  • 31. Encapsulate Collection Quando somente temos o método para retornar a collection imutável. Criamos métodos para adicionar e remover elementos. Person Person _________________ _________________ getCourses():Unmodifiable Set getCourses():Set addCourse(:Course) setCourses(:Set) removeCourse(:Course)
  • 32. Decompose Conditional Uma lógica condicional não muito legível aumenta a complexidade. Pode facilmente nos confundir e alterar o comportamento desejado.
  • 33. Decompose Conditional if (date.before(SUMMER_START) || date.after(SUMMER_END)) { charge = quantity * winterRate + winterSeviceCharge; } else { charge = quantity * summerRate; } if (notSummer(date)) { charge = winterCharge(quantity); } else { charge = summerCharge(quantity); }
  • 34. Consolidate Duplicate conditional fragments Quando temos o mesmo trecho de código dentro de uma lógica condicional. Mova-o para fora da lógica.
  • 35. Consolidate Duplicate conditional fragments if (isSpecial()) { total = price * 0.95; send(); } else { total = price * 0.98; send(); } if (isSpecial()) { total = price * 0.95; } else { total = price * 0.98; } send();
  • 36. Separate query from modifier Quando o mesmo método retorna um valor e altera o estado de um objeto. Separe-o em dois métodos. Customer __________________________________ getTotalOutstandingAndSetReadyForSummaries Customer _________________ getTotalOutstanding setReadyForSummaries
  • 37. Parameterize Method Vários métodos fazem coisas parecidas mas com valores diferentes. Unifique o método e parametrize o valor. Employee Employee _________________ _________________ fivePercentRaise() raise(percentage) tenPercentRaise()
  • 38. Preserve whole object Quando usamos vários valores de um objeto para passá-los para outro método. Passe o objeto inteiro por parametro. int low = period.getLow(); int high = period.getHigh(); withinPlan = plan.withinRange(low, high); withinPlan = plan.withinRange(period);
  • 40. “Qualquer idiota consegue escrever código que o computador entenda...
  • 41. ...mas só bons programadores conseguem escrever código que outras pessoas entendam.”
  • 42. Referências http://www.slideshare.net/gvespucci/refactoring-an-introduction http://www.slideshare.net/redigon/refactoring-1658371 Imagens http://www.flickr.com/photos/68751915@N05/6848823919 http://www.flickr.com/photos/raiderslight/2800096351/ http://theassistant.files.wordpress.com/2009/11/013.jpg http://www.flickr.com/photos/birminghamcityuniversity/5367360800/ http://1.bp.blogspot.com/_9iN8wXq1y_s/TOF3u11KD1I/AAAAAAAAAEg/v3HOYSzJlzo/s1600/why2.jpg http://greatmiddleway.files.wordpress.com/2012/03/doubt1.jpg http://www.sxc.hu/photo/1133804 http://tweakyourbiz.com/growth/files/reviews.jpg http://torwars.com/wp-content/uploads/2012/01/patch-notes-and-bug-fixes-SWTOR.png http://www.revenuewoo.com/wp-content/uploads/2012/05/BlogUpp_new_features-788925.jpg