Vamos falar de Clean
Code, Refatoração e
TDD mais uma vez
Domingos Teruel
Zend Certified Engineer
Domingos Teruel
Zend Certified Engineer PHP 5.3

Tecnólogo em Processamento de dados e
Gestão da Tecnologia da Informação,...
Sobre o que vamos falar?
Profissionalismo e felicidade
Insatisfação com o fracasso
Existe diferença?
Insatisfação no trabalho
Você se sente profissional?
Você se sente profissional?
Você se sente profissional?
Poderia ser mais produtivo?
Sensação de impotência
Se sente um peão de obra, trabalho braçal
Se sente um peão de obra, trabalho braçal
e desgastante!
e desgastante!
Qual a diferença entre cansaço e
Já teve aquele
sentimento de largar
tudo?
O que mais motiva um
desenvolvedor?
“Quem trabalha apenas pelo
salário, ganhe o que for, será
sempre mal pago.”
(Autor desconhecido)
“Qual é a sua obra?
obra
Quando você se for, o
vai restar?”
(Mario Cortella)
Afinal, quanto custa a
Afinal, quanto custa a
bagunça para a empresa?
bagunça para a empresa?
Alta rotatividade
Demora no lançamento de novas
Demora no lançamento de novas
funcionalidades
funcionalidades
Dificuldade na hora de realizar
qualquer modificação...
Alta incidência de bugs?
Quanto custa a falta deconfiança do
seu cliente?
Quanto tempo você perde tentando
Quanto tempo você perde tentando
entender o código para corrigir um
entender o código par...
Conclusão: Passamos a maior parte
Conclusão: Passamos a maior parte
do tempo lendo o código!
do tempo lendo o código!
Evolução da Produtividade
Clean code, o que é?
Você teria medo de tomar o
remédio?
Código feito com
cuidado
Que revela
intenção
simples
Fácil de entender
“Qualquer tolo consegue
escrever código que um
computador entenda.
Bons programadores escrevem
código que humanos possam
e...
Funcionar é o
mínimo que se
espera.
Qualidade Externa x Interna
Qualidade externa é aquela
que você percebe logo de
cara. Se ausabilidade da
interface
for
ruim,
aperformance for sofrível...
Qualidade interna é aquela que você
só
percebe
com
o
tempo.
Infelizmente o comercial não vende
esse tipo de qualidade. Noe...
Como medir a qualidade do
código?
• Linhas de código?
• Número de métodos?
•

Número de classes?

•

Linhas de código por método?

•

Complexidade ciclomáti...
WTF
WTF

WTF
WTF

WTF

WTF
dificuldade de entender
nivel máximo de sujeira
Debate: Até que ponto vale apena
continuar mantendo um projeto
vivo?
Falar é fácil
O desafio é criar código de
qualidade!
No entanto, falar é o primeiro passo rumo a
No entanto, falar é o primeiro passo rumo a
melhoria!
melhoria!
Quatro estágios
necessários para
adquirir novos
hábitos
Estágio 1
“Inconsciente e sem
habilidade”
Ignoramos o
comportamento e o
hábito
Estágio 2
“Consciente e sem
habilidade”
Conhecemos o
comportamento mas
ainda não temos o
hábito de aplicá-lo”
Estágio 3
“Consciente e
habilidoso”
Nos sentimos confortáveis
com pela prática que vamos
adquirindo com o tempo
Estágio 4
“Inconsciente e
habilidoso”
O hábito se torna uma coisa
natural
Escrever código limpo requer muita
Escrever código limpo requer muita
prática e habilidade!
prática e habilidade!
Començando a treinar
Nomes estranhos
Limitação histórica
1.
2.
3.
4.
5.
6.
7.
8.
9.

READ INPUT TAPE A1, B1, C1;
501 FORMAT A1;
IF (A1) 777, 777, 777
IF (B1) 888, 888, 888
IF (C1)...
Os ambientes não
ajudavam
Nem os computadores
Deixaram essa herança
maldita!
Aprendendo com os
mestres
1.
2.
3.
4.
5.
6.
7.
8.

// Descrição da maquina
$m_desc;
// Resultado parcial da soma
$s1;
// Cor dos olhos
$cOlhos;
// V...
revela a intenção
1.
2.
3.
4.
5.
6.
7.
8.

// Descrição da maquina
$m_desc;
// Resultado parcial da soma
$s1;
// Cor dos olhos
$cOlhos;
// V...
1.
2.
3.
4.
5.
6.
7.
8.

// Descrição da maquina
$descricaoDaMaquina;
// Resultado parcial da soma
$resultadoParcialSoma;
...
1.
2.
3.
4.
5.
6.
7.
8.

$descricaoDaMaquina;
$resultadoParcialSoma;
$corDosOlhos;
$valorDoIndiceTemporario;
1.$descricaoDaMaquina;
2.$resultadoParcialSoma;
3.$corDosOlhos;
4.$valorDoIndiceTemporario;
Não seja genérico
1.
2.
3.
4.
5.
6.
7.
8.

// Processa folha de pagamento
processa();
processa()
// Calcula o imposto de renda ret.
calcula(...
1.
2.
3.
4.
5.
6.
7.
8.

// Processa folha de pagamento
processaFolhaPagamento();
processaFolhaPagamento()
// Calcula o im...
1.
2.
3.
4.
5.
6.
7.
8.

processaFolhaPagamento();
processaFolhaPagamento()
calculaImpostoRetido();
calculaImpostoRetido()...
1.
2.
3.
4.

processaFolhaPagamento();
processaFolhaPagamento()
calculaImpostoRetido();
calculaImpostoRetido()
renderizaRe...
Simplifique estruturas de
decisão
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if ($hora > 22:00 || $hora < 06:00) {
return $this-...
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if () {
return $this->distancia * 3.90;
} else {
re...
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if ($this->ehBandeiraDois($hora)) {
return $this->d...
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if ($this->ehBandeiraDois($hora)) {
return $this->d...
Números mágicos
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if ($this->ehBandeiraDois($hora)) {
return $this->d...
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if ($this->ehBandeiraDois($hora)) {
return $this->d...
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if ($this->ehBandeiraDois($hora)) {
return $this->d...
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if ($this->ehBandeiraDois($hora)) {
return $this->d...
Saindo do labirinto
<?php
...
function calculaValorDaCorrida($hora) {
if ($hora > 22:00 || $hora < 06:00) {
return $this->distancia * 3.90;
} ...
distância da margem
<?php
...
function calculaValorDaCorrida($hora) {
if ($hora > 22:00 || $hora < 06:00) {
return $this->distancia * 3.90;
} ...
<?php
...
function calculaValorDaCorrida($hora) {
if () {
return $this->distancia * 3.90;
} else {
if () {
return $this->d...
<?php
...
function calculaValorDaCorrida() {
if ($this->ehBandeiraDois()) {
return $this->distancia * 3.90;
} else {
if ($...
<?php
..
function calculaValorDaCorrida() {
if ($this->ehBandeiraDois()) {
return $this->distancia * 3.90;
}
if ($this->eh...
<?php
...
function calculaValorDaCorrida() {
if ($this->ehBandeiraDois()) {
return $this->distancia * 3.90;
}
if ($this->e...
<?php
...
function calculaValorDaCorrida() {
if ($this->ehBandeiraDois()) {
return $this->distancia * 3.90;
}
if ($this->e...
<?php
...
function calculaValorDaCorrida() {
if ($this->ehBandeiraDois()) {
return $this->distancia * PRECO_BANDEIRA2;
}
i...
medo de estragar algo?
economize, teste mais
cedo!
Mas o que é refatorar?
“Alteração feita na estrutura
interna do software para tornálo mais fácil de ser
entendido e menos custoso
de ser modifica...
“Refactoring é a arte de
evoluir o design do
código existente.”
(William C. Wake)
“Refatorar é uma forma
de manter seu software
sustentável e
competitivo com o
passar do tempo.”
Refatorar é uma forma de
investimento
Tempo investido refatorando é
proporcional ao tempo
economizado com o entendimento
do código multiplicado pelo número
de p...
A fórmula matemática do refactoring:
Tr = Te * tamanho da equipe
1 hora investida refatorando é
proporcional a
8 horas eco...
infelizmente, o inverso também
é verdadeiro
Como vender atividades de
vender
refatoração para o seu gerente?
Diálogo entre o Desenvolvedor e o Gerente
Desenvolvedor: João, preciso fazer um refactoring no
código!
Gerente: Refactorin...
Refatore com um propósito,
evite refatorar apenas por
refatorar
Atente-se as
oportunidades!
oportunidades
Aproveite a correção de um defeito
Aproveite a correção de um defeito
para refatorar!
para refatorar!
Vai adicionar algo novo, aproveite
Vai adicionar algo novo, aproveite
para refatorar!
para refatorar!
Refatore quando precisar entender
Refatore quando precisar entender
uma parte do código
uma parte do código
Os 7 principais inimigos da
Os 7 principais inimigos da
refatoração
refatoração
Desconhecimento
Desconhecimento
Não se dar conta do problema é
uma das principais causas. É
comum ver desenvolvedores
experientes que não dão
atenção a qu...
Imediatismo
Imediatismo
Pensar apenas em resolver o
problema, sem considerar que
problema
a natureza do desenvolvimento
de software é a mudança.
Janelas quebradas
Janelas quebradas
Temos dificuldade em lidar com
janelas quebradas. Seja numa
dieta, relacionamento ou
desenvolvimento de software, o
desâni...
Nível técnico baixo
Nível técnico baixo
É fácil culpar o estagiário. É
preciso ter pessoas com nível
técnico alto e senso crítico
apurado para zelar pelas
boasprá...
Falta de trabalho em
Falta de trabalho em
equipe
equipe
O código pertence a
equipe, não ao seu autor.
Todos devem se
responsabilizar e zelar
pelo bem comum.
comum
Gerenciamento
Gerenciamento
Pressão comercial
Pressão comercial
Quando não
Quando não
refatorar?
refatorar?
• Quando o código simplesmente
não funciona, é instável
instáve

• Se funciona, ninguém sabe ao
certo como...

• Próximo a...
A maioria das empresas precisa
A maioria das empresas precisa
contrair algumas dívidas para
contrair algumas dívidas para
...
Mas cuidado com o aumento do débito
Mas cuidado com o aumento do débito
técnico, os juros são altos
técnico os juros são a...
Testes unitários
As 3 leis do TDD
• Você não pode escrever o código
até que tenha criado um teste
falhando;
falhando

• Você não pode escrever mais

testes ...
1 Conceito por teste
• Separe do teste que esteja

testando com mais de um
conceito em outros testes

• Facilite o entendimento de cada
teste
Os testes devem ser
rápidos para executar,
pois quando são lentos a
frequência de execução
diminui.
Testes não podem
depender uns dos
outros, pois se um falha
os outros também
falharam
Ao executa-los mais de
uma vez, devem sempre
retornar o mesmo
resultado
Os testes devem ser
escritos antes do
código.
código
Após o código será mais
difícil fazer o teste
O código do teste é tão
importante quanto o
código da produção.
O teste precisa sofrer
alterações da mesma forma
que o cód...
Quanto mais sujo o teste
mais difícil dar
manutenção, e menor a
flexibilidade para alterálo.
“Se você deixar seus
testes apodrecerem,
seu código também
apodrecerá”
Fique atento aos maus
cheiros!
• Comentários pobres, obsoletos e
redundantes

• Código comentado
• Testes que requerem mais de um passo
• Muitos parâmetr...
• Duplicação
• Inconsistência
• Intenção obscura
• Variáveis e funções inexpressivas
• Despadronização
• Números mágicos
•...
Conclusão
• Tudo o que falamos até aqui não é
para ser uma lista de regras

• Você não se torna um bom

programador aprendendo uma l...
Você é responsável pelo código
Você é responsável pelo código
que escreve e só você!
que escreve e só você!
Referência
•
•
•
•
•
•

Clean Code - Robert Martin

•
•
•
•
•

Design Patterns - Head First - Eric Freeman e Elisabeth Freeman

Refac...
Perguntas?
Participe!
dteruel@opensuse.org
http://about.me/mingomax
Vamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDD
Upcoming SlideShare
Loading in …5
×

Vamos falar de Clean Code, Refatoração e TDD

781
-1

Published on

Slides da palestra ministrada no 4º E-TIC do Instituto Federal de Camboriu.

Escrever código com baixa qualidade, de forma ilegível e confusa pode até funcionar!Tais atitudes,conscientes ou não, resultam na contração de uma dívida que cobra juros altos,perda de produtividade.
Serão abordados tópicos relacionados principalmente a responsabilidade e profissionalismo no desenvolvimento de software. Pontos importantes como motivação, qualidade de código, métricas, técnicas de refactoring, desenvolvimento orientado a testes e boas práticas para manter o código limpo e evitar muitas dores de cabeça no futuro!

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
781
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
12
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Vamos falar de Clean Code, Refatoração e TDD

  1. 1. Vamos falar de Clean Code, Refatoração e TDD mais uma vez Domingos Teruel Zend Certified Engineer
  2. 2. Domingos Teruel Zend Certified Engineer PHP 5.3 Tecnólogo em Processamento de dados e Gestão da Tecnologia da Informação, especialista em interfaces de sistemas, atuando no desenvolvimento e implementação de sistemas web com software livre e Governo Eletrônico.
  3. 3. Sobre o que vamos falar?
  4. 4. Profissionalismo e felicidade
  5. 5. Insatisfação com o fracasso
  6. 6. Existe diferença?
  7. 7. Insatisfação no trabalho
  8. 8. Você se sente profissional?
  9. 9. Você se sente profissional?
  10. 10. Você se sente profissional?
  11. 11. Poderia ser mais produtivo?
  12. 12. Sensação de impotência
  13. 13. Se sente um peão de obra, trabalho braçal Se sente um peão de obra, trabalho braçal e desgastante! e desgastante!
  14. 14. Qual a diferença entre cansaço e
  15. 15. Já teve aquele sentimento de largar tudo?
  16. 16. O que mais motiva um desenvolvedor?
  17. 17. “Quem trabalha apenas pelo salário, ganhe o que for, será sempre mal pago.” (Autor desconhecido)
  18. 18. “Qual é a sua obra? obra Quando você se for, o vai restar?” (Mario Cortella)
  19. 19. Afinal, quanto custa a Afinal, quanto custa a bagunça para a empresa? bagunça para a empresa?
  20. 20. Alta rotatividade
  21. 21. Demora no lançamento de novas Demora no lançamento de novas funcionalidades funcionalidades
  22. 22. Dificuldade na hora de realizar qualquer modificação...
  23. 23. Alta incidência de bugs?
  24. 24. Quanto custa a falta deconfiança do seu cliente?
  25. 25. Quanto tempo você perde tentando Quanto tempo você perde tentando entender o código para corrigir um entender o código para corrigir um bug? bug?
  26. 26. Conclusão: Passamos a maior parte Conclusão: Passamos a maior parte do tempo lendo o código! do tempo lendo o código!
  27. 27. Evolução da Produtividade
  28. 28. Clean code, o que é?
  29. 29. Você teria medo de tomar o remédio?
  30. 30. Código feito com cuidado
  31. 31. Que revela intenção
  32. 32. simples
  33. 33. Fácil de entender
  34. 34. “Qualquer tolo consegue escrever código que um computador entenda. Bons programadores escrevem código que humanos possam entender.” (Martin Fowler)
  35. 35. Funcionar é o mínimo que se espera.
  36. 36. Qualidade Externa x Interna
  37. 37. Qualidade externa é aquela que você percebe logo de cara. Se ausabilidade da interface for ruim, aperformance for sofrível e defeitos acontecem com frequência, a pessoa logo percebe e sequer compra o software.
  38. 38. Qualidade interna é aquela que você só percebe com o tempo. Infelizmente o comercial não vende esse tipo de qualidade. Noentanto, é ela que atrasa o negócio e mata a empresa aos poucos, sufoca e aumenta os custos. É ela que gera custos boa parte da rotatividade.
  39. 39. Como medir a qualidade do código?
  40. 40. • Linhas de código? • Número de métodos? • Número de classes? • Linhas de código por método? • Complexidade ciclomática? • Número de estruturas de decisão? ?
  41. 41. WTF
  42. 42. WTF WTF
  43. 43. WTF WTF WTF
  44. 44. dificuldade de entender
  45. 45. nivel máximo de sujeira
  46. 46. Debate: Até que ponto vale apena continuar mantendo um projeto vivo?
  47. 47. Falar é fácil
  48. 48. O desafio é criar código de qualidade!
  49. 49. No entanto, falar é o primeiro passo rumo a No entanto, falar é o primeiro passo rumo a melhoria! melhoria!
  50. 50. Quatro estágios necessários para adquirir novos hábitos
  51. 51. Estágio 1 “Inconsciente e sem habilidade” Ignoramos o comportamento e o hábito
  52. 52. Estágio 2 “Consciente e sem habilidade” Conhecemos o comportamento mas ainda não temos o hábito de aplicá-lo”
  53. 53. Estágio 3 “Consciente e habilidoso” Nos sentimos confortáveis com pela prática que vamos adquirindo com o tempo
  54. 54. Estágio 4 “Inconsciente e habilidoso” O hábito se torna uma coisa natural
  55. 55. Escrever código limpo requer muita Escrever código limpo requer muita prática e habilidade! prática e habilidade!
  56. 56. Començando a treinar
  57. 57. Nomes estranhos
  58. 58. Limitação histórica
  59. 59. 1. 2. 3. 4. 5. 6. 7. 8. 9. READ INPUT TAPE A1, B1, C1; 501 FORMAT A1; IF (A1) 777, 777, 777 IF (B1) 888, 888, 888 IF (C1) 999, 999, 999 STOP 1 799 S = FLOATF(A1 + B1 + C1) / 2.0 WRITE TO TAPE S END PROCESS As linguagens não ajudavam muito
  60. 60. Os ambientes não ajudavam
  61. 61. Nem os computadores
  62. 62. Deixaram essa herança maldita!
  63. 63. Aprendendo com os mestres
  64. 64. 1. 2. 3. 4. 5. 6. 7. 8. // Descrição da maquina $m_desc; // Resultado parcial da soma $s1; // Cor dos olhos $cOlhos; // Valor do índice temporário $aux;
  65. 65. revela a intenção
  66. 66. 1. 2. 3. 4. 5. 6. 7. 8. // Descrição da maquina $m_desc; // Resultado parcial da soma $s1; // Cor dos olhos $cOlhos; // Valor do índice temporário $aux;
  67. 67. 1. 2. 3. 4. 5. 6. 7. 8. // Descrição da maquina $descricaoDaMaquina; // Resultado parcial da soma $resultadoParcialSoma; // Cor dos olhos $corDosOlhos; // Valor do índice temporário $valorDoIndiceTemporario;
  68. 68. 1. 2. 3. 4. 5. 6. 7. 8. $descricaoDaMaquina; $resultadoParcialSoma; $corDosOlhos; $valorDoIndiceTemporario;
  69. 69. 1.$descricaoDaMaquina; 2.$resultadoParcialSoma; 3.$corDosOlhos; 4.$valorDoIndiceTemporario;
  70. 70. Não seja genérico
  71. 71. 1. 2. 3. 4. 5. 6. 7. 8. // Processa folha de pagamento processa(); processa() // Calcula o imposto de renda ret. calcula(); // Renderiza o relatório de alunos renderiza(); // Totaliza as estatísticas da ligação totaliza(); totaliza()
  72. 72. 1. 2. 3. 4. 5. 6. 7. 8. // Processa folha de pagamento processaFolhaPagamento(); processaFolhaPagamento() // Calcula o imposto de renda ret. calculaImpostoRetido(); calculaImpostoRetido() // Renderiza o relatório de alunos renderizaRelatorioAlunos(); renderizaRelatorioAlunos() // Totaliza as estatísticas da ligação totalizaEstatisticasLigacao(); totalizaEstatisticasLigacao()
  73. 73. 1. 2. 3. 4. 5. 6. 7. 8. processaFolhaPagamento(); processaFolhaPagamento() calculaImpostoRetido(); calculaImpostoRetido() renderizaRelatorioAlunos(); renderizaRelatorioAlunos() totalizaEstatisticasLigacao(); totalizaEstatisticasLigacao()
  74. 74. 1. 2. 3. 4. processaFolhaPagamento(); processaFolhaPagamento() calculaImpostoRetido(); calculaImpostoRetido() renderizaRelatorioAlunos(); renderizaRelatorioAlunos() totalizaEstatisticasLigacao(); totalizaEstatisticasLigacao()
  75. 75. Simplifique estruturas de decisão
  76. 76. <?php class Taximetro { public function calculaValorDaCorrida($hora) { if ($hora > 22:00 || $hora < 06:00) { return $this->distancia * 3.90; } else { return $this->distancia * 2.10; } } }
  77. 77. <?php class Taximetro { public function calculaValorDaCorrida($hora) { if () { return $this->distancia * 3.90; } else { return $this->distancia * 2.10; } } }
  78. 78. <?php class Taximetro { public function calculaValorDaCorrida($hora) { if ($this->ehBandeiraDois($hora)) { return $this->distancia * 3.90; } else { return $this->distancia * 2.10; } } }
  79. 79. <?php class Taximetro { public function calculaValorDaCorrida($hora) { if ($this->ehBandeiraDois($hora)) { return $this->distancia * 3.90; } else { return $this->distancia * 2.10; } } public function ehBandeiraDois($hora) { return $hora > 22:00 || $hora < 06:00; } }
  80. 80. Números mágicos
  81. 81. <?php class Taximetro { public function calculaValorDaCorrida($hora) { if ($this->ehBandeiraDois($hora)) { return $this->distancia * 3.90; } else { return $this->distancia * 2.10; } } public function ehBandeiraDois($hora) { return $hora > 22:00 || $hora < 06:00; } }
  82. 82. <?php class Taximetro { public function calculaValorDaCorrida($hora) { if ($this->ehBandeiraDois($hora)) { return $this->distancia *; } else { return $this->distancia *; } } public function ehBandeiraDois($hora) { return $hora > 22:00 || $hora < 06:00; } }
  83. 83. <?php class Taximetro { public function calculaValorDaCorrida($hora) { if ($this->ehBandeiraDois($hora)) { return $this->distancia * PRECO_B2; } else { return $this->distancia * PRECO_B1; } } public function ehBandeiraDois($hora) { return $hora > 22:00 || $hora < 06:00; } }
  84. 84. <?php class Taximetro { public function calculaValorDaCorrida($hora) { if ($this->ehBandeiraDois($hora)) { return $this->distancia * PRECO_BANDEIRA2; } else { return $this->distancia * PRECO_BANDEIRA1; } } public function ehBandeiraDois($hora) { return $hora > 22:00 || $hora < 06:00; } }
  85. 85. Saindo do labirinto
  86. 86. <?php ... function calculaValorDaCorrida($hora) { if ($hora > 22:00 || $hora < 06:00) { return $this->distancia * 3.90; } else { if ($this->diaDaSemana == 'Domingo') { return $this->distancia * 2.9; }else { return $this->distancia * 2.10; } } } ...
  87. 87. distância da margem
  88. 88. <?php ... function calculaValorDaCorrida($hora) { if ($hora > 22:00 || $hora < 06:00) { return $this->distancia * 3.90; } else { if ($this->diaDaSemana == 'Domingo') { return $this->distancia * 2.9; }else { return $this->distancia * 2.10; } } } ...
  89. 89. <?php ... function calculaValorDaCorrida($hora) { if () { return $this->distancia * 3.90; } else { if () { return $this->distancia * 2.9; }else { return $this->distancia * 2.10; } } } ...
  90. 90. <?php ... function calculaValorDaCorrida() { if ($this->ehBandeiraDois()) { return $this->distancia * 3.90; } else { if ($this->ehHorarioDeDomingo()) { return $this->distancia * 2.9; }else { return $this->distancia * 2.10; } } } ...
  91. 91. <?php .. function calculaValorDaCorrida() { if ($this->ehBandeiraDois()) { return $this->distancia * 3.90; } if ($this->ehHorarioDeDomingo()) { return $this->distancia * 2.9; }else { return $this->distancia * 2.10; } } ...
  92. 92. <?php ... function calculaValorDaCorrida() { if ($this->ehBandeiraDois()) { return $this->distancia * 3.90; } if ($this->ehHorarioDeDomingo()) { return $this->distancia * 2.9; }else { return $this->distancia * 2.10; } } ...
  93. 93. <?php ... function calculaValorDaCorrida() { if ($this->ehBandeiraDois()) { return $this->distancia * 3.90; } if ($this->ehHorarioDeDomingo()) { return $this->distancia * 2.9; } return $this->distancia * 2.10; } ...
  94. 94. <?php ... function calculaValorDaCorrida() { if ($this->ehBandeiraDois()) { return $this->distancia * PRECO_BANDEIRA2; } if ($this->ehHorarioDeDomingo()) { return $this->distancia * PRECO_DE_DOMINGO; } return $this->distancia * PRECO_BANDEIRA1; } ...
  95. 95. medo de estragar algo?
  96. 96. economize, teste mais cedo!
  97. 97. Mas o que é refatorar?
  98. 98. “Alteração feita na estrutura interna do software para tornálo mais fácil de ser entendido e menos custoso de ser modificado sem alterar seu comportamento observável.” (Martin Fowler)
  99. 99. “Refactoring é a arte de evoluir o design do código existente.” (William C. Wake)
  100. 100. “Refatorar é uma forma de manter seu software sustentável e competitivo com o passar do tempo.”
  101. 101. Refatorar é uma forma de investimento
  102. 102. Tempo investido refatorando é proporcional ao tempo economizado com o entendimento do código multiplicado pelo número de pessoas na equipe. (Rodrigo Branas - Developer)
  103. 103. A fórmula matemática do refactoring: Tr = Te * tamanho da equipe 1 hora investida refatorando é proporcional a 8 horas economizadas com o entendimento em uma equipe de 8 pessoas. Isso sem falar em flexibilidade, redução na quantidade de defeitos e reuso.
  104. 104. infelizmente, o inverso também é verdadeiro
  105. 105. Como vender atividades de vender refatoração para o seu gerente?
  106. 106. Diálogo entre o Desenvolvedor e o Gerente Desenvolvedor: João, preciso fazer um refactoring no código! Gerente: Refactoring?! O que é isso, você vai melhorar a performance? Desenvolvedor: Não, não... Gerente: Vai deixar a interface mais bonita e mais fácil de ser utilizada? Desenvolvedor: Não... Gerente: Então? O que é isso? Desenvolvedor: “Vou fazer uma alteração na estrutura interna do software,para torná-lo mais fácil de ser entendido e menos custoso de sermodificado, sem alterar seu comportamento observável.” (Martin Fowler) Gerente: Não.
  107. 107. Refatore com um propósito, evite refatorar apenas por refatorar
  108. 108. Atente-se as oportunidades! oportunidades
  109. 109. Aproveite a correção de um defeito Aproveite a correção de um defeito para refatorar! para refatorar!
  110. 110. Vai adicionar algo novo, aproveite Vai adicionar algo novo, aproveite para refatorar! para refatorar!
  111. 111. Refatore quando precisar entender Refatore quando precisar entender uma parte do código uma parte do código
  112. 112. Os 7 principais inimigos da Os 7 principais inimigos da refatoração refatoração
  113. 113. Desconhecimento Desconhecimento
  114. 114. Não se dar conta do problema é uma das principais causas. É comum ver desenvolvedores experientes que não dão atenção a qualidade do código.
  115. 115. Imediatismo Imediatismo
  116. 116. Pensar apenas em resolver o problema, sem considerar que problema a natureza do desenvolvimento de software é a mudança.
  117. 117. Janelas quebradas Janelas quebradas
  118. 118. Temos dificuldade em lidar com janelas quebradas. Seja numa dieta, relacionamento ou desenvolvimento de software, o desânimo das janelas quebradas leva ao fracasso. fracasso
  119. 119. Nível técnico baixo Nível técnico baixo
  120. 120. É fácil culpar o estagiário. É preciso ter pessoas com nível técnico alto e senso crítico apurado para zelar pelas boaspráticas e manter a ordem do código. código
  121. 121. Falta de trabalho em Falta de trabalho em equipe equipe
  122. 122. O código pertence a equipe, não ao seu autor. Todos devem se responsabilizar e zelar pelo bem comum. comum
  123. 123. Gerenciamento Gerenciamento
  124. 124. Pressão comercial Pressão comercial
  125. 125. Quando não Quando não refatorar? refatorar?
  126. 126. • Quando o código simplesmente não funciona, é instável instáve • Se funciona, ninguém sabe ao certo como... • Próximo ao final do prazo de entrega
  127. 127. A maioria das empresas precisa A maioria das empresas precisa contrair algumas dívidas para contrair algumas dívidas para funcionar efetivamente funcionar efetivamente
  128. 128. Mas cuidado com o aumento do débito Mas cuidado com o aumento do débito técnico, os juros são altos técnico os juros são altos técnico, técnico
  129. 129. Testes unitários
  130. 130. As 3 leis do TDD
  131. 131. • Você não pode escrever o código até que tenha criado um teste falhando; falhando • Você não pode escrever mais testes do que seja suficiente para falhar; falhar • Você não pode escrever mais código do que o suficiente para passar o teste que esta falhando; falhando
  132. 132. 1 Conceito por teste
  133. 133. • Separe do teste que esteja testando com mais de um conceito em outros testes • Facilite o entendimento de cada teste
  134. 134. Os testes devem ser rápidos para executar, pois quando são lentos a frequência de execução diminui.
  135. 135. Testes não podem depender uns dos outros, pois se um falha os outros também falharam
  136. 136. Ao executa-los mais de uma vez, devem sempre retornar o mesmo resultado
  137. 137. Os testes devem ser escritos antes do código. código Após o código será mais difícil fazer o teste
  138. 138. O código do teste é tão importante quanto o código da produção. O teste precisa sofrer alterações da mesma forma que o código
  139. 139. Quanto mais sujo o teste mais difícil dar manutenção, e menor a flexibilidade para alterálo.
  140. 140. “Se você deixar seus testes apodrecerem, seu código também apodrecerá”
  141. 141. Fique atento aos maus cheiros!
  142. 142. • Comentários pobres, obsoletos e redundantes • Código comentado • Testes que requerem mais de um passo • Muitos parâmetros ou parâmetros booleanos • Métodos mortos ou que fazem muita coisa • Responsabilidades fora do contexto • Nomes pequenos e inexpressivos
  143. 143. • Duplicação • Inconsistência • Intenção obscura • Variáveis e funções inexpressivas • Despadronização • Números mágicos • Desencapsulamento • Efeitos colaterais • Testes insuficientes
  144. 144. Conclusão
  145. 145. • Tudo o que falamos até aqui não é para ser uma lista de regras • Você não se torna um bom programador aprendendo uma lista de regras. • As técnicas e práticas têm que começar a fazer parte do nosso dia a dia. • Devemos nos preocupar com a qualidade do código e não somente fazê-lo funcionar.
  146. 146. Você é responsável pelo código Você é responsável pelo código que escreve e só você! que escreve e só você!
  147. 147. Referência
  148. 148. • • • • • • Clean Code - Robert Martin • • • • • Design Patterns - Head First - Eric Freeman e Elisabeth Freeman Refactoring - Martin Fowler Patters of Enterprise Application Architecture - Martin Fowler Test-Driven Development by Example - Kent Beck Effective Java - Joshua Block Design Patterns - Eric Gamma, Richard Helm, Ralph Johnson e John Vlissides Refactoring to Patterns - Joshua Kerievisky Domain-Driven Design - Eric Evans Working Effectively with Legacy Code - Michael Feathers Baseado no curso de Clean Code por Rodrigo Branas (www.agilecode.com.br) Referência
  149. 149. Perguntas?
  150. 150. Participe!
  151. 151. dteruel@opensuse.org http://about.me/mingomax
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×