Vamos falar de Clean Code, Refatoração e TDD
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 752 views

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

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!

Statistics

Views

Total Views
752
Views on SlideShare
751
Embed Views
1

Actions

Likes
4
Downloads
9
Comments
0

1 Embed 1

https://twitter.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • 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, especialista em interfaces de sistemas, atuando no desenvolvimento e implementação de sistemas web com software livre e Governo Eletrônico.
  • 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 para corrigir um bug? bug?
  • 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 entender.” (Martin Fowler)
  • 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 e defeitos acontecem com frequência, a pessoa logo percebe e sequer compra o software.
  • 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.
  • 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ática? • Número de estruturas de decisão? ?
  • 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) 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
  • 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; // Valor do índice temporário $aux;
  • 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; // Valor do índice temporário $aux;
  • 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;
  • 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(); // Renderiza o relatório de alunos renderiza(); // Totaliza as estatísticas da ligação totaliza(); totaliza()
  • 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()
  • 1. 2. 3. 4. 5. 6. 7. 8. processaFolhaPagamento(); processaFolhaPagamento() calculaImpostoRetido(); calculaImpostoRetido() renderizaRelatorioAlunos(); renderizaRelatorioAlunos() totalizaEstatisticasLigacao(); totalizaEstatisticasLigacao()
  • 1. 2. 3. 4. processaFolhaPagamento(); processaFolhaPagamento() calculaImpostoRetido(); calculaImpostoRetido() renderizaRelatorioAlunos(); renderizaRelatorioAlunos() totalizaEstatisticasLigacao(); totalizaEstatisticasLigacao()
  • Simplifique estruturas de decisão
  • <?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; } } }
  • <?php class Taximetro { public function calculaValorDaCorrida($hora) { if () { return $this->distancia * 3.90; } else { return $this->distancia * 2.10; } } }
  • <?php class Taximetro { public function calculaValorDaCorrida($hora) { if ($this->ehBandeiraDois($hora)) { return $this->distancia * 3.90; } else { return $this->distancia * 2.10; } } }
  • <?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; } }
  • Números mágicos
  • <?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; } }
  • <?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; } }
  • <?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; } }
  • <?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; } }
  • Saindo do labirinto
  • <?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; } } } ...
  • distância da margem
  • <?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; } } } ...
  • <?php ... function calculaValorDaCorrida($hora) { if () { return $this->distancia * 3.90; } else { if () { return $this->distancia * 2.9; }else { return $this->distancia * 2.10; } } } ...
  • <?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; } } } ...
  • <?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; } } ...
  • <?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; } } ...
  • <?php ... function calculaValorDaCorrida() { if ($this->ehBandeiraDois()) { return $this->distancia * 3.90; } if ($this->ehHorarioDeDomingo()) { return $this->distancia * 2.9; } return $this->distancia * 2.10; } ...
  • <?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; } ...
  • 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 modificado sem alterar seu comportamento observável.” (Martin Fowler)
  • “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 pessoas na equipe. (Rodrigo Branas - Developer)
  • 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.
  • 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: 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.
  • 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 qualidade do código.
  • 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ânimo das janelas quebradas leva ao fracasso. fracasso
  • 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áticas e manter a ordem do código. código
  • 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 ao final do prazo de entrega
  • A maioria das empresas precisa A maioria das empresas precisa contrair algumas dívidas para contrair algumas dívidas para funcionar efetivamente funcionar efetivamente
  • 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
  • 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 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
  • 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ódigo
  • 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âmetros ou parâmetros booleanos • Métodos mortos ou que fazem muita coisa • Responsabilidades fora do contexto • Nomes pequenos e inexpressivos
  • • Duplicação • Inconsistência • Intenção obscura • Variáveis e funções inexpressivas • Despadronização • Números mágicos • Desencapsulamento • Efeitos colaterais • Testes insuficientes
  • 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 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.
  • 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 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
  • Perguntas?
  • Participe!
  • dteruel@opensuse.org http://about.me/mingomax