SlideShare uma empresa Scribd logo
Como trabalhar
com código legado
Velho desenvolvimento.
Novos paradigmas.
Será que sabemos
realmente o que
estamos fazendo?
Vou contar um pouco do que
funcionou para mim e que pode
funcionar para você também!
Ah é só botar breakpoint e tentar
descobrir porque está falhando!
Refatorar é como soltar um
cordão trançado
O objetivo ao refatorar um
código super-acoplado é
sempre e a todo custo buscar
a criação de teste unitários.
Se não fizer isso.
Se não fizer isso.
Crie Regions
public int RotinaAcoplada(boolean teste){
if (! teste){
var dao = new UsuarioDAO();
...
...
...
return dao.listarUsuarios().Count;
}
return 0;
}
Crie Regions
public int RotinaAcoplada(boolean teste){
if (! teste){
var dao = new UsuarioDAO();
#region Quantidade de Usuarios
...
#endregion
return dao.listarUsuarios().Count;
}
return 0;
}
Crie um metodo vazio com o nome da Region
public int QuantidadeUsuarios(){
var dao = new UsuarioDAO();
return dao.listarUsuarios().Count;
}
Copie o código da Region para o Método
public int QuantidadeUsuarios(){
var dao = new UsuarioDAO();
return dao.listarUsuarios().Count;
}
Neste momento o código não
compila e isso agora é bom.
Porque?
Chame o novo metodo no lugar
public int RotinaAcoplada(boolean teste){
if (! teste){
var dao = new UsuarioDAO();
#region Quantidade de Usuarios
...
#endregion
return dao.listarUsuarios().Count;
}
return 0;
}
Chame o novo metodo no lugar
public int RotinaAcoplada(bool teste){
if (!teste) {
return QuantidadeUsuarios();
return 0;
}
Agora sim está pronto.
Obrigado!
O método
anterior continua
acoplado e não dá
para testar,
resolva isso.
Como o Tiago não tá vendo vou
dar uma dica.
Passe as necessidades do código
como parametro da função, o
codigo fica mais limpo inclusive.
Desacoplando o código
public int RotinaAcoplada(bool teste){
if (!teste) {
return QuantidadeUsuarios();
return 0;
}
RotinaAcoplada(false);
Desacoplando o código
public int RotinaAcoplada(bool teste,
Func<int> query){
if (!teste) {
return query();
return 0;
}
RotinaAcoplada(false, QuantidadeUsuarios);
Testando o código
void TesteChamandoTrueRetornaZero (){
Assert.True(RotinaAcoplada(true, null), 0);
}
void TesteChamandoFalseChamaFuncao (){
Assert.True(RotinaAcoplada(false, ()=>27), 27);
}
O código pode não funcionar, se
acontecer não tente descobrir o
que houve, dá revert e começa
novamente. É mais seguro.
Código legado é aquele que não
tem testes, neste caso é como uma
rocha, que deve ser quebrada em
pedaços até ser possível testar,
caso ainda não consiga fazer
testes, continue quebrando até
conseguir.
“Desenvolver software é a arte de
fazer maquinas calcularem,
escrevendo poesias!”
Obrigado!

Mais conteúdo relacionado

Destaque

Complexidade Ciclomatica
Complexidade CiclomaticaComplexidade Ciclomatica
Complexidade Ciclomatica
Vinicius Pasquantonio
 
Truck Factor
Truck FactorTruck Factor
Truck Factor
Vinicius Pasquantonio
 
Art History TDH Final Presentation
Art History TDH Final PresentationArt History TDH Final Presentation
Art History TDH Final Presentation
Joseph Knox
 
Slides - O que é Legado? - QCon Rio
Slides - O que é Legado? - QCon RioSlides - O que é Legado? - QCon Rio
Slides - O que é Legado? - QCon Rio
Henrique Weissmann
 
[QConSP] Estrangulando o Legado na SoundCloud
[QConSP] Estrangulando o Legado na SoundCloud[QConSP] Estrangulando o Legado na SoundCloud
[QConSP] Estrangulando o Legado na SoundCloud
Flavio W. Brasil
 
TDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOSTDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOS
Fábio Miranda
 
Codigo legado fisl
Codigo legado fislCodigo legado fisl
Codigo legado fisl
Andre Fonseca
 
Is this how you hate unit testing?
Is this how you hate unit testing?Is this how you hate unit testing?
Is this how you hate unit testing?
Steven Mak
 
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job? Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Stanford GSB Corporate Governance Research Initiative
 

Destaque (9)

Complexidade Ciclomatica
Complexidade CiclomaticaComplexidade Ciclomatica
Complexidade Ciclomatica
 
Truck Factor
Truck FactorTruck Factor
Truck Factor
 
Art History TDH Final Presentation
Art History TDH Final PresentationArt History TDH Final Presentation
Art History TDH Final Presentation
 
Slides - O que é Legado? - QCon Rio
Slides - O que é Legado? - QCon RioSlides - O que é Legado? - QCon Rio
Slides - O que é Legado? - QCon Rio
 
[QConSP] Estrangulando o Legado na SoundCloud
[QConSP] Estrangulando o Legado na SoundCloud[QConSP] Estrangulando o Legado na SoundCloud
[QConSP] Estrangulando o Legado na SoundCloud
 
TDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOSTDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOS
 
Codigo legado fisl
Codigo legado fislCodigo legado fisl
Codigo legado fisl
 
Is this how you hate unit testing?
Is this how you hate unit testing?Is this how you hate unit testing?
Is this how you hate unit testing?
 
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job? Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
 

Semelhante a Como trabalhar com código legado

Curso de introdução ao ruby
Curso de introdução ao rubyCurso de introdução ao ruby
Curso de introdução ao ruby
Francis Wagner
 
Java hidden features
Java hidden featuresJava hidden features
Java hidden features
Josenaldo de Oliveira Matos Filho
 
Test-driven Development
Test-driven DevelopmentTest-driven Development
Test-driven Development
Denis L Presciliano
 
Java hidden features
Java hidden featuresJava hidden features
Java hidden features
Josenaldo de Oliveira Matos Filho
 
Migrando pra Scala
Migrando pra ScalaMigrando pra Scala
Migrando pra Scala
Maurício Linhares
 
Android testing PT-BR
Android testing PT-BRAndroid testing PT-BR
Android testing PT-BR
rafaeladson
 
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Tchelinux
 
Javascript
JavascriptJavascript
Javascript
Fernando Simeone
 
Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
Michael Castillo Granados
 
TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fisl
Adriano Petrich
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
Giovanni Bassi
 
Testes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração seguraTestes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração segura
Valberto Carneiro
 
Tdd em django sem desculpas versao final
Tdd em django sem desculpas versao finalTdd em django sem desculpas versao final
Tdd em django sem desculpas versao final
Adriano Petrich
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
Armando Daniel
 
Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...
Thiago Faria de Andrade
 
Testes de software de A a Z
Testes de software de A a ZTestes de software de A a Z
Testes de software de A a Z
Camilo Porto ► Software Engineer
 
Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010
rafaelferreira
 
Java5
Java5Java5
Aula5
Aula5Aula5
Aula5
fkimura
 
Introdução a programação I
Introdução a programação IIntrodução a programação I
Introdução a programação I
Clerton Leal
 

Semelhante a Como trabalhar com código legado (20)

Curso de introdução ao ruby
Curso de introdução ao rubyCurso de introdução ao ruby
Curso de introdução ao ruby
 
Java hidden features
Java hidden featuresJava hidden features
Java hidden features
 
Test-driven Development
Test-driven DevelopmentTest-driven Development
Test-driven Development
 
Java hidden features
Java hidden featuresJava hidden features
Java hidden features
 
Migrando pra Scala
Migrando pra ScalaMigrando pra Scala
Migrando pra Scala
 
Android testing PT-BR
Android testing PT-BRAndroid testing PT-BR
Android testing PT-BR
 
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
 
Javascript
JavascriptJavascript
Javascript
 
Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
 
TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fisl
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Testes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração seguraTestes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração segura
 
Tdd em django sem desculpas versao final
Tdd em django sem desculpas versao finalTdd em django sem desculpas versao final
Tdd em django sem desculpas versao final
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
 
Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...
 
Testes de software de A a Z
Testes de software de A a ZTestes de software de A a Z
Testes de software de A a Z
 
Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010
 
Java5
Java5Java5
Java5
 
Aula5
Aula5Aula5
Aula5
 
Introdução a programação I
Introdução a programação IIntrodução a programação I
Introdução a programação I
 

Como trabalhar com código legado

  • 2. Velho desenvolvimento. Novos paradigmas. Será que sabemos realmente o que estamos fazendo?
  • 3. Vou contar um pouco do que funcionou para mim e que pode funcionar para você também!
  • 4. Ah é só botar breakpoint e tentar descobrir porque está falhando!
  • 5. Refatorar é como soltar um cordão trançado
  • 6. O objetivo ao refatorar um código super-acoplado é sempre e a todo custo buscar a criação de teste unitários.
  • 9.
  • 10. Crie Regions public int RotinaAcoplada(boolean teste){ if (! teste){ var dao = new UsuarioDAO(); ... ... ... return dao.listarUsuarios().Count; } return 0; }
  • 11. Crie Regions public int RotinaAcoplada(boolean teste){ if (! teste){ var dao = new UsuarioDAO(); #region Quantidade de Usuarios ... #endregion return dao.listarUsuarios().Count; } return 0; }
  • 12. Crie um metodo vazio com o nome da Region public int QuantidadeUsuarios(){ var dao = new UsuarioDAO(); return dao.listarUsuarios().Count; }
  • 13. Copie o código da Region para o Método public int QuantidadeUsuarios(){ var dao = new UsuarioDAO(); return dao.listarUsuarios().Count; }
  • 14. Neste momento o código não compila e isso agora é bom. Porque?
  • 15. Chame o novo metodo no lugar public int RotinaAcoplada(boolean teste){ if (! teste){ var dao = new UsuarioDAO(); #region Quantidade de Usuarios ... #endregion return dao.listarUsuarios().Count; } return 0; }
  • 16. Chame o novo metodo no lugar public int RotinaAcoplada(bool teste){ if (!teste) { return QuantidadeUsuarios(); return 0; }
  • 17. Agora sim está pronto. Obrigado!
  • 18. O método anterior continua acoplado e não dá para testar, resolva isso.
  • 19. Como o Tiago não tá vendo vou dar uma dica. Passe as necessidades do código como parametro da função, o codigo fica mais limpo inclusive.
  • 20. Desacoplando o código public int RotinaAcoplada(bool teste){ if (!teste) { return QuantidadeUsuarios(); return 0; } RotinaAcoplada(false);
  • 21. Desacoplando o código public int RotinaAcoplada(bool teste, Func<int> query){ if (!teste) { return query(); return 0; } RotinaAcoplada(false, QuantidadeUsuarios);
  • 22. Testando o código void TesteChamandoTrueRetornaZero (){ Assert.True(RotinaAcoplada(true, null), 0); } void TesteChamandoFalseChamaFuncao (){ Assert.True(RotinaAcoplada(false, ()=>27), 27); }
  • 23. O código pode não funcionar, se acontecer não tente descobrir o que houve, dá revert e começa novamente. É mais seguro.
  • 24. Código legado é aquele que não tem testes, neste caso é como uma rocha, que deve ser quebrada em pedaços até ser possível testar, caso ainda não consiga fazer testes, continue quebrando até conseguir.
  • 25. “Desenvolver software é a arte de fazer maquinas calcularem, escrevendo poesias!”