Refactoring   Bruno Lui   @bruno_lui
O que éRefactoring?
“Processo de alterar e    melhorar o códigode um software de maneira que seu comportamento    não seja alterado”
“Uma maneira disciplinada delimpar código, que minimiza as chances de introduzir bugs”
Porque refatorar ?
Para melhorar odesign do código   existenteevitando que elefique decadente..
Para ajudar aencontrar bugs..
Para tornar o código mais    fácil de entender..
Para tornar o código maisbarato e rápido de modificar
Quando começamos a mergulhar no código ruim, logodescobrimos 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çãodeve ser uma   práticasistemática      e disciplinada.
Quando refatorar ?
Quando vamos adicionar uma nova funcionalidadeO código que deve ser alterado     está difícil de entender.O design não aju...
Quando vamos corrigir um bugUm bug reportado pode ser umsinal que o código não estava claroo 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 aj...
"Decidir quando começar e quando parar  uma refatoração, é tão importante     quanto saber como fazê-la."
Quando não refatorarMuitas aplicações estão totalmente acopladas                          ao banco de dados.            Qu...
Primeiro passo...Criar um conjunto de testes sólidospara garantir que sua refatoraçãonão quebre o código que estáfuncionan...
Técnicas derefatoração
Extract MethodTransformar um trecho de código em um novo método.             O seu nome deve explicar seu propósito.      ...
Remove temp with queryQuando transformamos uma variável temporária usada   para guardar o resultado de uma expressão em um...
double precoBase = quantidade * preco;if (precoBase > 1000) {  return precoBase * 0.95;} else {  return precoBase * 0.98;}...
Move method/field  Mover um método/atributo quando é ou será usado em      outras classes além da classe em que está defini...
Extract class      Quando uma classe está fazendo o trabalho de duas.class Person {                class Person {  String ...
Hide delegateRemova a dependência de uma classe que possua um         delegate para um atributo de outra classe.
class Pessoa {                               class Pessoa {  Departamento departamento;                   Departamento dep...
Remove middle man                              O contrário do Hide Delegate.          Crie um método para acessar o atribu...
Replace data value with objectQuando um item que precisa de um comportamento adicional                                Orde...
Encapsulate Collection      Quando somente temos o método para retornar a                                 collection imutá...
Decompose Conditional Uma lógica condicional não muito legível aumenta a complexidade.Pode facilmente nos confundir e alte...
Decompose Conditionalif (date.before(SUMMER_START) || date.after(SUMMER_END)) {  charge = quantity * winterRate + winterSe...
Consolidate Duplicate conditional fragments        Quando temos o mesmo trecho de código dentro de                        ...
Consolidate Duplicate conditional fragments  if (isSpecial()) {    total = price * 0.95;    send();  } else {    total = p...
Separate query from modifierQuando o mesmo método retorna um valor e altera o estado de um                                ...
Parameterize MethodVários métodos fazem coisas parecidas mas com valores diferentes.                        Unifique o méto...
Preserve whole objectQuando usamos vários valores de um objeto para passá-los para outro método.                          ...
Martin Fowler
“Qualquer idiota consegue escrevercódigo que o computador entenda...
...mas só bonsprogramadores   conseguemescrever código que outras   pessoas entendam.”
Referências                 http://www.slideshare.net/gvespucci/refactoring-an-introduction                 http://www.sli...
Obrigado!
Próximos SlideShares
Carregando em…5
×

Refactoring

1.127 visualizações

Publicada em

Essa apresentação fala um pouco sobre o que é, quando e porque aplicar Refatoração em seu código.
Além de mostrar algumas técnicas que Martin Fowler mostra em seu livro.

0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
1.127
No SlideShare
0
A partir de incorporações
0
Número de incorporações
221
Ações
Compartilhamentos
0
Downloads
18
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Refactoring

  1. 1. Refactoring Bruno Lui @bruno_lui
  2. 2. O que éRefactoring?
  3. 3. “Processo de alterar e melhorar o códigode um software de maneira que seu comportamento não seja alterado”
  4. 4. “Uma maneira disciplinada delimpar código, que minimiza as chances de introduzir bugs”
  5. 5. Porque refatorar ?
  6. 6. Para melhorar odesign do código existenteevitando que elefique decadente..
  7. 7. Para ajudar aencontrar bugs..
  8. 8. Para tornar o código mais fácil de entender..
  9. 9. Para tornar o código maisbarato e rápido de modificar
  10. 10. Quando começamos a mergulhar no código ruim, logodescobrimos várias “oportunidades” para refatorá-lo...
  11. 11. E quanto mais fundo vamos, mais dessas “opotunidades” aparecem..aumentando nossa vontade de alterar...
  12. 12. Antes de começar a cavar a própria cova, saiba que...
  13. 13. A Refatoraçãodeve ser uma práticasistemática e disciplinada.
  14. 14. Quando refatorar ?
  15. 15. Quando vamos adicionar uma nova funcionalidadeO código que deve ser alterado está difícil de entender.O design não ajuda a adicionara nova funcionalidade facilmente
  16. 16. Quando vamos corrigir um bugUm bug reportado pode ser umsinal que o código não estava claroo bastante para evitá-lo.
  17. 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 ajudara melhorar o código.
  18. 18. "Decidir quando começar e quando parar uma refatoração, é tão importante quanto saber como fazê-la."
  19. 19. Quando não refatorarMuitas 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. 20. Primeiro passo...Criar um conjunto de testes sólidospara garantir que sua refatoraçãonão quebre o código que estáfuncionando.
  21. 21. Técnicas derefatoração
  22. 22. Extract MethodTransformar 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. 23. Remove temp with queryQuando transformamos uma variável temporária usada para guardar o resultado de uma expressão em um método.
  24. 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. 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 classemais usada, e apenas delegue a chamada do método antigo para onovo.Atributos: Crie um novo atributo em outra classe e use oencapsulamento para delegar.
  26. 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. 27. Hide delegateRemova a dependência de uma classe que possua um delegate para um atributo de outra classe.
  28. 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. 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ê precisaficar criando novos métodos toda vez.
  30. 30. Replace data value with objectQuando um item que precisa de um comportamento adicional Order Order _________________ 1 customer: String Customer _________________ name: String
  31. 31. Encapsulate Collection Quando somente temos o método para retornar a collection imutável. Criamos métodos para adicionar e remover elementos. PersonPerson __________________________________ getCourses():Unmodifiable SetgetCourses():Set addCourse(:Course)setCourses(:Set) removeCourse(:Course)
  32. 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. 33. Decompose Conditionalif (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. 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. 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. 36. Separate query from modifierQuando 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. 37. Parameterize MethodVá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. 38. Preserve whole objectQuando 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);
  39. 39. Martin Fowler
  40. 40. “Qualquer idiota consegue escrevercódigo que o computador entenda...
  41. 41. ...mas só bonsprogramadores conseguemescrever código que outras pessoas entendam.”
  42. 42. Referências http://www.slideshare.net/gvespucci/refactoring-an-introduction http://www.slideshare.net/redigon/refactoring-1658371 Imagenshttp://www.flickr.com/photos/68751915@N05/6848823919http://www.flickr.com/photos/raiderslight/2800096351/http://theassistant.files.wordpress.com/2009/11/013.jpghttp://www.flickr.com/photos/birminghamcityuniversity/5367360800/http://1.bp.blogspot.com/_9iN8wXq1y_s/TOF3u11KD1I/AAAAAAAAAEg/v3HOYSzJlzo/s1600/why2.jpghttp://greatmiddleway.files.wordpress.com/2012/03/doubt1.jpghttp://www.sxc.hu/photo/1133804http://tweakyourbiz.com/growth/files/reviews.jpghttp://torwars.com/wp-content/uploads/2012/01/patch-notes-and-bug-fixes-SWTOR.pnghttp://www.revenuewoo.com/wp-content/uploads/2012/05/BlogUpp_new_features-788925.jpg
  43. 43. Obrigado!

×