SlideShare ist ein Scribd-Unternehmen logo
1 von 116
Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br




Introdução ao Clean Code
@rodrigobranas
  rodrigo.branas@gmail.com
 http://www.agilecode.com.br
Formação Acadêmica
Ciências da Computação – UFSC
Gerenciamento de Projetos - FGV

Certificações

SCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM
Rodrigo Branas – rodrigo.branas@gmail.com
10 anos de experiência na plataforma Java
1000 horas em sala de aula
Mais de 50 palestras em eventos

Líder da área de desenvolvimento na Gennera
Autor da revista Java Magazine
Palestrante
Instrutor da Academia Java e Agile da Globalcode
Criador dos treinamentos de Clean Code, Selenium e
Maven da Agile Code

Trabalhou com as empresas:
EDS, HP, GM, Citibank, OnCast, Globalcode, V.Office, Dígitr
o, Softplan, Unimed, Suntech, Vale do Rio
O conteúdo deste treinamento vai
 afetar na sua zona de conforto
Sobre o que vamos falar?
Profissionalismo e Felicidade!
Insatisfação com o fracasso!
Existe diferença?
Insatisfação com o trabalho
Você se sente profissional?
Você se sente profissional?
Você se sente profissional?
Poderia ser mais produtivo?
Sensação de impotência
Se sente sempre fazendo um
trabalho braçal e desgastante?
Qual é a diferença entre cansaço
            e stress?
Já teve vontade 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? Quando
 você se for, o vai restar?”

        (Mario Cortella)
Afinal, quanto custa a bagunça
        para a empresa?
Alta rotatividade
Demora no lançamento de novas
       funcionalidades
Dificuldade na hora de realizar
    qualquer modificação...
Alta incidência de bugs?
Quanto custa a falta de
confiança do seu cliente?
Quanto tempo você perde
tentando entender o código para
       corrigir um bug?
Conclusão: Passamos a maior
parte do tempo lendo o código!
Evolução da Produtividade




                Uncle Bob – Robert C. Martin
Debate: Dois programadores são
 mais produtivos que um? (Pair)
O que é Clean Code?
Você teria medo de tomar o
          remédio?
Código feito com cuidado
Que revela suas intenções
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 a
usabilidade da interface for ruim, a
performance 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. No
entanto, é ela que atrasa o negócio
       e mata a empresa aos
   poucos, sufoca e aumenta os
custos. É ela que gera 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?


WTF?
Dificuldade para entender
Nível máximo de sujeira
Debate: Até que ponto vale a
pena continuar mantendo um
       projeto vivo?
Falar é fácil!
O desafio é criar código de
        qualidade!
No entanto, falar é o primeiro
  passo rumo a 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 prática e habilidade!
Começando a treinar
Nomes estranhos
Limitação histórica
1.   READ INPUT TAPE A1, B1, C1;
2.   501 FORMAT A1;
3.   IF (A1) 777, 777, 777
4.   IF (B1) 888, 888, 888
5.   IF (C1) 999, 999, 999
6.   STOP 1
7.   799 S = FLOATF(A1 + B1 + C1) / 2.0
8.   WRITE TO TAPE S
9.   END PROCESS
As linguagens não ajudavam
Os ambientes não ajudavam
Os computadores não ajudavam
Recebendo a herança maldita!
Aprendendo com os mestres
1.   // Descrição da maquina
2.   String m_desc;
3.   // Resultado parcial da soma
4.   int s1;
5.   // Cor dos olhos
6.   String cOlhos;
7.   // Valor do índice temporário
8.   int aux;
Revelando a intenção
1.   // Descrição da maquina
2.   String m_desc;
3.   // Resultado parcial da soma
4.   int s1;
5.   // Cor dos olhos
6.   String cOlhos;
7.   // Valor do índice temporário
8.   int aux;
1.   // Descrição da maquina
2.   String descricaoDaMaquina;
3.   // Resultado parcial da soma
4.   int resultadoParcialSoma;
5.   // Cor dos olhos
6.   String corDosOlhos;
7.   // Valor do índice temporário
8.   int valorDoIndiceTemporario;
1.
2.   String descricaoDaMaquina;
3.
4.   int resultadoParcialSoma;
5.
6.   String corDosOlhos;
7.
8.   int valorDoIndiceTemporario;
1.   String descricaoDaMaquina;
2.   int resultadoParcialSoma;
3.   String corDosOlhos;
4.   int valorDoIndiceTemporario;
Não seja genérico
1.   // Processa folha de pagamento
2.   void processa();
3.   // Calcula o imposto de renda ret.
4.   void calcula();
5.   // Renderiza o relatório de alunos
6.   void renderiza();
7.   // Totaliza as estatísticas da ligação
8. void totaliza();
1.   // Processa folha de pagamento
2.   void processaFolhaPagamento();
3.   // Calcula o imposto de renda ret.
4.   void calculaImpostoRetido();
5.   // Renderiza o relatório de alunos
6.   void renderizaRelatorioAlunos();
7.   // Totaliza as estatísticas da ligação
8. void totalizaEstatisticasLigacao();
1.
2. void processaFolhaPagamento();
3.
4. void calculaImpostoRetido();
5.
6. void renderizaRelatorioAlunos();
7.
8. void totalizaEstatisticasLigacao();
1.   void processaFolhaPagamento();
2.   void calculaImpostoRetido();
3.   void renderizaRelatorioAlunos();
4.   void totalizaEstatisticasLigacao();
Simplificando estruturas de
          decisão
1.    class Taximetro {
2.    ...
3.    double calculaValorDaCorrida() {
4.        if (hora > 22:00 || hora < 06:00) {
5.           return distancia * 3.90;
6.        } else {
7.           return distancia * 2.10;
8.        }
9.    }
10.   ...
1.    class Taximetro {
2.    ...
3.    double calculaValorDaCorrida() {
4.        if () {
5.           return distancia * 3.90;
6.        } else {
7.           return distancia * 2.10;
8.        }
9.    }
10.   ...
1.    class Taximetro {
2.    ...
3.    double calculaValorDaCorrida() {
4.        if (ehBandeiraDois()) {
5.           return distancia * 3.90;
6.        } else {
7.           return distancia * 2.10;
8.        }
9.    }
10.   ...
1.    ...
2.    double calculaValorDaCorrida() {
3.        if (ehBandeiraDois()) {
4.           return distancia * 3.90;
5.        } else {
6.           return distancia * 2.10;
7.        }
8.    boolean ehBandeiraDois() {
9.     return hora > 22:00 || hora < 06:00;
10.   }
11.   ...
Magic numbers
1.    class Taximetro {
2.    ...
3.    double calculaValorDaCorrida() {
4.        if (ehBandeiraDois()) {
5.           return distancia * 3.90;
6.        } else {
7.           return distancia * 2.10;
8.        }
9.    }
10.   ...
1.    class Taximetro {
2.    ...
3.    double calculaValorDaCorrida() {
4.        if (ehBandeiraDois()) {
5.           return distancia *;
6.        } else {
7.           return distancia *;
8.        }
9.    }
10.   ...
1.    class Taximetro {
2.    ...
3.    double calculaValorDaCorrida() {
4.        if (ehBandeiraDois()) {
5.           return distancia * PRECO_B_2;
6.        } else {
7.           return distancia * PRECO_B_1;
8.        }
9.    }
10.   ...
1.    class Taximetro {
2.    ...
3.    double calculaValorDaCorrida() {
4.        if (ehBandeiraDois()) {
5.           return distancia * PRECO_BANDEIRA_2;
6.        } else {
7.           return distancia * PRECO_BANDEIRA_1;
8.        }
9.    }
10.   ...
Saindo do labirinto
1. double calculaValorDaCorrida() {
2.   if (hora > 22:00 || hora < 06:00) {
3.      return distancia * 3.90;
4.   } else {
5.       if (diaDaSemana eq Domingo) {
6.          return distancia * 2.9;
7.       else {
8.          return distancia * 2.10;
9.       }
10. }
Distância da margem
1. double calculaValorDaCorrida() {
2.   if (hora > 22:00 || hora < 06:00) {
3.      return distancia * 3.90;
4.   } else {
5.       if (diaDaSemana eq Domingo) {
6.          return distancia * 2.9;
7.       } else {
8.          return distancia * 2.10;
9.       }
10. }
1. double calculaValorDaCorrida() {
2.   if () {
3.      return distancia * 3.90;
4.   } else {
5.       if () {
6.           return distancia * 2.9;
7.       } else {
8.           return distancia * 2.10;
9.       }
10. }
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia * 3.90;
4.   } else {
5.       if (ehHorarioDeDomingo()) {
6.          return distancia * 2.9;
7.       } else {
8.          return distancia * 2.10;
9.       }
10. }
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia * 3.90;
4.   }
5.       if (ehHorarioDeDomingo()) {
6.          return distancia * 2.9;
7.       } else {
8.          return distancia * 2.10;
9.       }
10.
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia * 3.90;
4.   }
5.   if (ehHorarioDeDomingo()) {
6.      return distancia * 2.9;
7.   } else {
8.      return distancia * 2.10;
9.   }
10.
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia * 3.90;
4.   }
5.   if (ehHorarioDeDomingo()) {
6.      return distancia * 2.9;
7.   }
8.      return distancia * 2.10;
9.
10.
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia * 3.90;
4.   }
5.   if (ehHorarioDeDomingo()) {
6.      return distancia * 2.9;
7.   }
8.   return distancia * 2.10;
9.
10.
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia * 3.90;
4.   }
5.   if (ehHorarioDeDomingo()) {
6.      return distancia * 2.9;
7.   }
8.   return distancia * 2.10;
9. }
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia *;
4.   }
5.   if (ehHorarioDeDomingo()) {
6.      return distancia *;
7.   }
8.   return distancia *;
9. }
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia * PRECO_BANDEIRA_2;
4.   }
5.   if (ehHorarioDeDomingo()) {
6.      return distancia * PRECO_DE_DOMINGO;
7.   }
8.   return distancia * PRECO_BANDEIRA_1;
9. }
Medo de estragar algo?
Test-Driven Development
Economize, teste mais cedo!
Ferramentas – Hudson + Sonar
Introdução ao Clean Code

Weitere ähnliche Inhalte

Was ist angesagt?

Construindo Diretivas com AngularJS
Construindo Diretivas com AngularJSConstruindo Diretivas com AngularJS
Construindo Diretivas com AngularJSRodrigo Branas
 
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Rafael Ponte
 
As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)Pablo Dall'Oglio
 
(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota(Portuguese) Java EE Poliglota
(Portuguese) Java EE PoliglotaPhil Calçado
 
AngularJS - 10 passos para aprender a criar suas directivas
AngularJS - 10 passos para aprender a criar suas directivasAngularJS - 10 passos para aprender a criar suas directivas
AngularJS - 10 passos para aprender a criar suas directivasJanderson Fernandes Cardoso
 
A evolução do AngularJS
A evolução do AngularJSA evolução do AngularJS
A evolução do AngularJSRodrigo Branas
 
Começando com Zend Framework 2
Começando com Zend Framework 2Começando com Zend Framework 2
Começando com Zend Framework 2Cezar Souza
 
T11_LM3: Subalgoritmose colisões (2013-2014)
T11_LM3: Subalgoritmose colisões (2013-2014)T11_LM3: Subalgoritmose colisões (2013-2014)
T11_LM3: Subalgoritmose colisões (2013-2014)Carlos Santos
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11Cezar Souza
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2Cezar Souza
 

Was ist angesagt? (20)

Construindo Diretivas com AngularJS
Construindo Diretivas com AngularJSConstruindo Diretivas com AngularJS
Construindo Diretivas com AngularJS
 
Java script aula 08 - formulários
Java script   aula 08 - formuláriosJava script   aula 08 - formulários
Java script aula 08 - formulários
 
Javascript aula 01 - visão geral
Javascript   aula 01 - visão geralJavascript   aula 01 - visão geral
Javascript aula 01 - visão geral
 
Java script aula 02 - operadores
Java script   aula 02 - operadoresJava script   aula 02 - operadores
Java script aula 02 - operadores
 
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
 
As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)
 
(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota
 
Tutorial JavaFX simples
Tutorial JavaFX simplesTutorial JavaFX simples
Tutorial JavaFX simples
 
AngularJS - 10 passos para aprender a criar suas directivas
AngularJS - 10 passos para aprender a criar suas directivasAngularJS - 10 passos para aprender a criar suas directivas
AngularJS - 10 passos para aprender a criar suas directivas
 
Java script aula 10 - angularjs
Java script   aula 10 - angularjsJava script   aula 10 - angularjs
Java script aula 10 - angularjs
 
JavaScript
JavaScriptJavaScript
JavaScript
 
Java script aula 05 - funções
Java script   aula 05 - funçõesJava script   aula 05 - funções
Java script aula 05 - funções
 
A evolução do AngularJS
A evolução do AngularJSA evolução do AngularJS
A evolução do AngularJS
 
Tutorial Dwr - Configuração e Uso
Tutorial Dwr - Configuração e UsoTutorial Dwr - Configuração e Uso
Tutorial Dwr - Configuração e Uso
 
Começando com Zend Framework 2
Começando com Zend Framework 2Começando com Zend Framework 2
Começando com Zend Framework 2
 
Groovy grails
Groovy grailsGroovy grails
Groovy grails
 
T11_LM3: Subalgoritmose colisões (2013-2014)
T11_LM3: Subalgoritmose colisões (2013-2014)T11_LM3: Subalgoritmose colisões (2013-2014)
T11_LM3: Subalgoritmose colisões (2013-2014)
 
Java script - funções
Java script - funçõesJava script - funções
Java script - funções
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
 

Andere mochten auch

Vamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDDVamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDDDomingos Teruel
 
Desvendando os mistérios do Charset
Desvendando os mistérios do CharsetDesvendando os mistérios do Charset
Desvendando os mistérios do CharsetRodrigo Branas
 
Apresentação Clean Code
Apresentação Clean CodeApresentação Clean Code
Apresentação Clean CodeAndré Leoni
 
Clean Code (Robert C. Martin)
Clean Code (Robert C. Martin)Clean Code (Robert C. Martin)
Clean Code (Robert C. Martin)Yasser Veleda
 
Clean code - Mantenha seu código limpo
Clean code - Mantenha seu código limpoClean code - Mantenha seu código limpo
Clean code - Mantenha seu código limpoTiago Bencardino
 
Test-Driven Development com JavaScript, Jasmine Karma
Test-Driven Development com JavaScript, Jasmine  KarmaTest-Driven Development com JavaScript, Jasmine  Karma
Test-Driven Development com JavaScript, Jasmine KarmaRodrigo Branas
 
XP - Extreme Programming
XP - Extreme ProgrammingXP - Extreme Programming
XP - Extreme ProgrammingRodrigo Branas
 
PHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsPHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsGuilherme Blanco
 
Evoluindo a arquitetura de uma aplicação com AngularJS
Evoluindo a arquitetura de uma aplicação com AngularJSEvoluindo a arquitetura de uma aplicação com AngularJS
Evoluindo a arquitetura de uma aplicação com AngularJSRodrigo Branas
 
Acelerando projetos de software com Scrum e Extreme Programming
Acelerando projetos de software com Scrum e Extreme ProgrammingAcelerando projetos de software com Scrum e Extreme Programming
Acelerando projetos de software com Scrum e Extreme ProgrammingRodrigo Branas
 
Clean Code summary
Clean Code summaryClean Code summary
Clean Code summaryJan de Vries
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Rodrigo Kono
 

Andere mochten auch (19)

Refactoring
RefactoringRefactoring
Refactoring
 
Vamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDDVamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDD
 
Testes Automatizados
Testes AutomatizadosTestes Automatizados
Testes Automatizados
 
Desvendando os mistérios do Charset
Desvendando os mistérios do CharsetDesvendando os mistérios do Charset
Desvendando os mistérios do Charset
 
Apresentação Clean Code
Apresentação Clean CodeApresentação Clean Code
Apresentação Clean Code
 
Clean Code (Robert C. Martin)
Clean Code (Robert C. Martin)Clean Code (Robert C. Martin)
Clean Code (Robert C. Martin)
 
Clean code - Mantenha seu código limpo
Clean code - Mantenha seu código limpoClean code - Mantenha seu código limpo
Clean code - Mantenha seu código limpo
 
Maven em 10 minutos
Maven em 10 minutosMaven em 10 minutos
Maven em 10 minutos
 
Code Smells
Code SmellsCode Smells
Code Smells
 
Clean Code
Clean CodeClean Code
Clean Code
 
Test-Driven Development com JavaScript, Jasmine Karma
Test-Driven Development com JavaScript, Jasmine  KarmaTest-Driven Development com JavaScript, Jasmine  Karma
Test-Driven Development com JavaScript, Jasmine Karma
 
XP - Extreme Programming
XP - Extreme ProgrammingXP - Extreme Programming
XP - Extreme Programming
 
Selenium - WebDriver
Selenium - WebDriverSelenium - WebDriver
Selenium - WebDriver
 
PHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsPHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object Calisthenics
 
Evoluindo a arquitetura de uma aplicação com AngularJS
Evoluindo a arquitetura de uma aplicação com AngularJSEvoluindo a arquitetura de uma aplicação com AngularJS
Evoluindo a arquitetura de uma aplicação com AngularJS
 
Acelerando projetos de software com Scrum e Extreme Programming
Acelerando projetos de software com Scrum e Extreme ProgrammingAcelerando projetos de software com Scrum e Extreme Programming
Acelerando projetos de software com Scrum e Extreme Programming
 
Clean Code summary
Clean Code summaryClean Code summary
Clean Code summary
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)
 
Clean code
Clean codeClean code
Clean code
 

Ähnlich wie Introdução ao Clean Code

Pg sem3-1505102
Pg sem3-1505102Pg sem3-1505102
Pg sem3-1505102csmp
 
Pg sem3ex
Pg sem3exPg sem3ex
Pg sem3excsmp
 
Relato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para RailsRelato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para RailsCássio Marques
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerGiovanni Kenji Shiroma
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
 
Apostila Calculo II - UDESC.pdf
Apostila Calculo II - UDESC.pdfApostila Calculo II - UDESC.pdf
Apostila Calculo II - UDESC.pdfJulioCesarSouza35
 
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para DesenvolvedoresTDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para DesenvolvedoresFernando Franquini
 
Lógica de Programação - Unimep/Pronatec - Aula04
Lógica de Programação - Unimep/Pronatec - Aula04Lógica de Programação - Unimep/Pronatec - Aula04
Lógica de Programação - Unimep/Pronatec - Aula04André Phillip Bertoletti
 
Codificação segura em C para sistemas embarcados
Codificação segura em C para sistemas embarcadosCodificação segura em C para sistemas embarcados
Codificação segura em C para sistemas embarcadoshenriqueprossi
 
Testes Automatizados de Software Um Guia Pratico by Mauricio Aniche (z-lib.or...
Testes Automatizados de Software Um Guia Pratico by Mauricio Aniche (z-lib.or...Testes Automatizados de Software Um Guia Pratico by Mauricio Aniche (z-lib.or...
Testes Automatizados de Software Um Guia Pratico by Mauricio Aniche (z-lib.or...RodrigoLuis21
 
Principais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorizaçãoPrincipais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorizaçãoIntel Software Brasil
 
Grafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
Grafos e Algoritimos - Dr. Julio Cesar de Araujo MenezesGrafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
Grafos e Algoritimos - Dr. Julio Cesar de Araujo MenezesJulio Menezes
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaEduardo Bregaida
 
Cacheamento Lado Servidor
Cacheamento Lado ServidorCacheamento Lado Servidor
Cacheamento Lado ServidorMario Guedes
 
Robustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesRobustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesDavid Robert Camargo de Campos
 
TDC2013 Otimizando-C
TDC2013 Otimizando-CTDC2013 Otimizando-C
TDC2013 Otimizando-Cosmarcf
 

Ähnlich wie Introdução ao Clean Code (20)

TDD e Clean Code
TDD e Clean CodeTDD e Clean Code
TDD e Clean Code
 
Pg sem3-1505102
Pg sem3-1505102Pg sem3-1505102
Pg sem3-1505102
 
Pg sem3ex
Pg sem3exPg sem3ex
Pg sem3ex
 
Relato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para RailsRelato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para Rails
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & Docker
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
Clean code
Clean codeClean code
Clean code
 
Apostila Calculo II - UDESC.pdf
Apostila Calculo II - UDESC.pdfApostila Calculo II - UDESC.pdf
Apostila Calculo II - UDESC.pdf
 
Test-driven Development
Test-driven DevelopmentTest-driven Development
Test-driven Development
 
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para DesenvolvedoresTDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
 
Lógica de Programação - Unimep/Pronatec - Aula04
Lógica de Programação - Unimep/Pronatec - Aula04Lógica de Programação - Unimep/Pronatec - Aula04
Lógica de Programação - Unimep/Pronatec - Aula04
 
Codificação segura em C para sistemas embarcados
Codificação segura em C para sistemas embarcadosCodificação segura em C para sistemas embarcados
Codificação segura em C para sistemas embarcados
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
Testes Automatizados de Software Um Guia Pratico by Mauricio Aniche (z-lib.or...
Testes Automatizados de Software Um Guia Pratico by Mauricio Aniche (z-lib.or...Testes Automatizados de Software Um Guia Pratico by Mauricio Aniche (z-lib.or...
Testes Automatizados de Software Um Guia Pratico by Mauricio Aniche (z-lib.or...
 
Principais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorizaçãoPrincipais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorização
 
Grafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
Grafos e Algoritimos - Dr. Julio Cesar de Araujo MenezesGrafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
Grafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
 
Cacheamento Lado Servidor
Cacheamento Lado ServidorCacheamento Lado Servidor
Cacheamento Lado Servidor
 
Robustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesRobustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefes
 
TDC2013 Otimizando-C
TDC2013 Otimizando-CTDC2013 Otimizando-C
TDC2013 Otimizando-C
 

Mehr von Rodrigo Branas

Node.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasNode.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasRodrigo Branas
 
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasRodrigo Branas
 
Node.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasNode.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasRodrigo Branas
 
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasNode.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasRodrigo Branas
 
Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasRodrigo Branas
 
#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisas#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisasRodrigo Branas
 
#1 - Git - Introdução
#1 - Git - Introdução#1 - Git - Introdução
#1 - Git - IntroduçãoRodrigo Branas
 
#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remoto#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remotoRodrigo Branas
 
#3 - Git - Branching e Merging
#3 - Git - Branching e Merging#3 - Git - Branching e Merging
#3 - Git - Branching e MergingRodrigo Branas
 
JavaScript - Expressões Regulares
JavaScript - Expressões RegularesJavaScript - Expressões Regulares
JavaScript - Expressões RegularesRodrigo Branas
 
HTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSHTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSRodrigo Branas
 
Criando Filtros com AngularJS
Criando Filtros com AngularJSCriando Filtros com AngularJS
Criando Filtros com AngularJSRodrigo Branas
 
Criando aplicações Single-Page com AngularJS
Criando aplicações Single-Page com AngularJSCriando aplicações Single-Page com AngularJS
Criando aplicações Single-Page com AngularJSRodrigo Branas
 

Mehr von Rodrigo Branas (20)

Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Node.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasNode.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo Branas
 
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo Branas
 
Node.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasNode.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo Branas
 
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasNode.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
 
Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo Branas
 
#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisas#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisas
 
#1 - Git - Introdução
#1 - Git - Introdução#1 - Git - Introdução
#1 - Git - Introdução
 
#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remoto#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remoto
 
#4 - Git - Stash
#4 - Git - Stash#4 - Git - Stash
#4 - Git - Stash
 
#3 - Git - Branching e Merging
#3 - Git - Branching e Merging#3 - Git - Branching e Merging
#3 - Git - Branching e Merging
 
#2 - Git - DAG
#2 - Git - DAG#2 - Git - DAG
#2 - Git - DAG
 
JavaScript - Date
JavaScript - DateJavaScript - Date
JavaScript - Date
 
JavaScript - Expressões Regulares
JavaScript - Expressões RegularesJavaScript - Expressões Regulares
JavaScript - Expressões Regulares
 
Scope AngularJS
Scope AngularJSScope AngularJS
Scope AngularJS
 
HTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSHTTP Interceptors com AngularJS
HTTP Interceptors com AngularJS
 
Criando Filtros com AngularJS
Criando Filtros com AngularJSCriando Filtros com AngularJS
Criando Filtros com AngularJS
 
Criando aplicações Single-Page com AngularJS
Criando aplicações Single-Page com AngularJSCriando aplicações Single-Page com AngularJS
Criando aplicações Single-Page com AngularJS
 
Grunt
GruntGrunt
Grunt
 
Bower
BowerBower
Bower
 

Introdução ao Clean Code

  • 1. Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br Introdução ao Clean Code
  • 2.
  • 3. @rodrigobranas rodrigo.branas@gmail.com http://www.agilecode.com.br Formação Acadêmica Ciências da Computação – UFSC Gerenciamento de Projetos - FGV Certificações SCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM
  • 4. Rodrigo Branas – rodrigo.branas@gmail.com 10 anos de experiência na plataforma Java 1000 horas em sala de aula Mais de 50 palestras em eventos Líder da área de desenvolvimento na Gennera Autor da revista Java Magazine Palestrante Instrutor da Academia Java e Agile da Globalcode Criador dos treinamentos de Clean Code, Selenium e Maven da Agile Code Trabalhou com as empresas: EDS, HP, GM, Citibank, OnCast, Globalcode, V.Office, Dígitr o, Softplan, Unimed, Suntech, Vale do Rio
  • 5. O conteúdo deste treinamento vai afetar na sua zona de conforto
  • 6. Sobre o que vamos falar?
  • 8.
  • 10.
  • 13. Você se sente profissional?
  • 14. Você se sente profissional?
  • 15. Você se sente profissional?
  • 16. Poderia ser mais produtivo?
  • 18. Se sente sempre fazendo um trabalho braçal e desgastante?
  • 19. Qual é a diferença entre cansaço e stress?
  • 20. Já teve vontade de largar tudo?
  • 21. O que mais motiva um desenvolvedor?
  • 22. “Quem trabalha apenas pelo salário, ganhe o que for, será sempre mal pago.” (Autor desconhecido)
  • 23.
  • 24.
  • 25.
  • 26. “Qual é a sua obra? Quando você se for, o vai restar?” (Mario Cortella)
  • 27. Afinal, quanto custa a bagunça para a empresa?
  • 29. Demora no lançamento de novas funcionalidades
  • 30. Dificuldade na hora de realizar qualquer modificação...
  • 32. Quanto custa a falta de confiança do seu cliente?
  • 33. Quanto tempo você perde tentando entender o código para corrigir um bug?
  • 34. Conclusão: Passamos a maior parte do tempo lendo o código!
  • 35. Evolução da Produtividade Uncle Bob – Robert C. Martin
  • 36. Debate: Dois programadores são mais produtivos que um? (Pair)
  • 37. O que é Clean Code?
  • 38.
  • 39. Você teria medo de tomar o remédio?
  • 40. Código feito com cuidado
  • 41. Que revela suas intenções
  • 44. “Qualquer tolo consegue escrever código que um computador entenda. Bons programadores escrevem código que humanos possam entender.” (Martin Fowler)
  • 45. Funcionar é o mínimo que se espera.
  • 47. Qualidade externa é aquela que você percebe logo de cara. Se a usabilidade da interface for ruim, a performance for sofrível e defeitos acontecem com frequência, a pessoa logo percebe e sequer compra o software.
  • 48. Qualidade interna é aquela que você só percebe com o tempo. Infelizmente o comercial não vende esse tipo de qualidade. No entanto, é ela que atrasa o negócio e mata a empresa aos poucos, sufoca e aumenta os custos. É ela que gera boa parte da rotatividade.
  • 49. Como medir a qualidade do código?
  • 50. 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? ?
  • 51.
  • 52.
  • 53. WTF?
  • 56.
  • 58. Nível máximo de sujeira
  • 59.
  • 60. Debate: Até que ponto vale a pena continuar mantendo um projeto vivo?
  • 62. O desafio é criar código de qualidade!
  • 63. No entanto, falar é o primeiro passo rumo a melhoria!
  • 64. Quatro estágios necessários para adquirir novos hábitos
  • 65. Estágio 1 “Inconsciente e sem habilidade” Ignoramos o comportamento e o hábito
  • 66. Estágio 2 “Consciente e sem habilidade” Conhecemos o comportamento mas ainda não temos o hábito de aplicá-lo”
  • 67. Estágio 3 “Consciente e habilidoso” Nos sentimos confortáveis com pela prática que vamos adquirindo com o tempo
  • 68. Estágio 4 “Inconsciente e habilidoso” O hábito se torna uma coisa natural
  • 69. Escrever código limpo requer muita prática e habilidade!
  • 73. 1. READ INPUT TAPE A1, B1, C1; 2. 501 FORMAT A1; 3. IF (A1) 777, 777, 777 4. IF (B1) 888, 888, 888 5. IF (C1) 999, 999, 999 6. STOP 1 7. 799 S = FLOATF(A1 + B1 + C1) / 2.0 8. WRITE TO TAPE S 9. END PROCESS As linguagens não ajudavam
  • 74. Os ambientes não ajudavam
  • 77. Aprendendo com os mestres
  • 78. 1. // Descrição da maquina 2. String m_desc; 3. // Resultado parcial da soma 4. int s1; 5. // Cor dos olhos 6. String cOlhos; 7. // Valor do índice temporário 8. int aux;
  • 80. 1. // Descrição da maquina 2. String m_desc; 3. // Resultado parcial da soma 4. int s1; 5. // Cor dos olhos 6. String cOlhos; 7. // Valor do índice temporário 8. int aux;
  • 81. 1. // Descrição da maquina 2. String descricaoDaMaquina; 3. // Resultado parcial da soma 4. int resultadoParcialSoma; 5. // Cor dos olhos 6. String corDosOlhos; 7. // Valor do índice temporário 8. int valorDoIndiceTemporario;
  • 82. 1. 2. String descricaoDaMaquina; 3. 4. int resultadoParcialSoma; 5. 6. String corDosOlhos; 7. 8. int valorDoIndiceTemporario;
  • 83. 1. String descricaoDaMaquina; 2. int resultadoParcialSoma; 3. String corDosOlhos; 4. int valorDoIndiceTemporario;
  • 85. 1. // Processa folha de pagamento 2. void processa(); 3. // Calcula o imposto de renda ret. 4. void calcula(); 5. // Renderiza o relatório de alunos 6. void renderiza(); 7. // Totaliza as estatísticas da ligação 8. void totaliza();
  • 86. 1. // Processa folha de pagamento 2. void processaFolhaPagamento(); 3. // Calcula o imposto de renda ret. 4. void calculaImpostoRetido(); 5. // Renderiza o relatório de alunos 6. void renderizaRelatorioAlunos(); 7. // Totaliza as estatísticas da ligação 8. void totalizaEstatisticasLigacao();
  • 87. 1. 2. void processaFolhaPagamento(); 3. 4. void calculaImpostoRetido(); 5. 6. void renderizaRelatorioAlunos(); 7. 8. void totalizaEstatisticasLigacao();
  • 88. 1. void processaFolhaPagamento(); 2. void calculaImpostoRetido(); 3. void renderizaRelatorioAlunos(); 4. void totalizaEstatisticasLigacao();
  • 90. 1. class Taximetro { 2. ... 3. double calculaValorDaCorrida() { 4. if (hora > 22:00 || hora < 06:00) { 5. return distancia * 3.90; 6. } else { 7. return distancia * 2.10; 8. } 9. } 10. ...
  • 91. 1. class Taximetro { 2. ... 3. double calculaValorDaCorrida() { 4. if () { 5. return distancia * 3.90; 6. } else { 7. return distancia * 2.10; 8. } 9. } 10. ...
  • 92. 1. class Taximetro { 2. ... 3. double calculaValorDaCorrida() { 4. if (ehBandeiraDois()) { 5. return distancia * 3.90; 6. } else { 7. return distancia * 2.10; 8. } 9. } 10. ...
  • 93. 1. ... 2. double calculaValorDaCorrida() { 3. if (ehBandeiraDois()) { 4. return distancia * 3.90; 5. } else { 6. return distancia * 2.10; 7. } 8. boolean ehBandeiraDois() { 9. return hora > 22:00 || hora < 06:00; 10. } 11. ...
  • 95. 1. class Taximetro { 2. ... 3. double calculaValorDaCorrida() { 4. if (ehBandeiraDois()) { 5. return distancia * 3.90; 6. } else { 7. return distancia * 2.10; 8. } 9. } 10. ...
  • 96. 1. class Taximetro { 2. ... 3. double calculaValorDaCorrida() { 4. if (ehBandeiraDois()) { 5. return distancia *; 6. } else { 7. return distancia *; 8. } 9. } 10. ...
  • 97. 1. class Taximetro { 2. ... 3. double calculaValorDaCorrida() { 4. if (ehBandeiraDois()) { 5. return distancia * PRECO_B_2; 6. } else { 7. return distancia * PRECO_B_1; 8. } 9. } 10. ...
  • 98. 1. class Taximetro { 2. ... 3. double calculaValorDaCorrida() { 4. if (ehBandeiraDois()) { 5. return distancia * PRECO_BANDEIRA_2; 6. } else { 7. return distancia * PRECO_BANDEIRA_1; 8. } 9. } 10. ...
  • 100. 1. double calculaValorDaCorrida() { 2. if (hora > 22:00 || hora < 06:00) { 3. return distancia * 3.90; 4. } else { 5. if (diaDaSemana eq Domingo) { 6. return distancia * 2.9; 7. else { 8. return distancia * 2.10; 9. } 10. }
  • 102. 1. double calculaValorDaCorrida() { 2. if (hora > 22:00 || hora < 06:00) { 3. return distancia * 3.90; 4. } else { 5. if (diaDaSemana eq Domingo) { 6. return distancia * 2.9; 7. } else { 8. return distancia * 2.10; 9. } 10. }
  • 103. 1. double calculaValorDaCorrida() { 2. if () { 3. return distancia * 3.90; 4. } else { 5. if () { 6. return distancia * 2.9; 7. } else { 8. return distancia * 2.10; 9. } 10. }
  • 104. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia * 3.90; 4. } else { 5. if (ehHorarioDeDomingo()) { 6. return distancia * 2.9; 7. } else { 8. return distancia * 2.10; 9. } 10. }
  • 105. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia * 3.90; 4. } 5. if (ehHorarioDeDomingo()) { 6. return distancia * 2.9; 7. } else { 8. return distancia * 2.10; 9. } 10.
  • 106. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia * 3.90; 4. } 5. if (ehHorarioDeDomingo()) { 6. return distancia * 2.9; 7. } else { 8. return distancia * 2.10; 9. } 10.
  • 107. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia * 3.90; 4. } 5. if (ehHorarioDeDomingo()) { 6. return distancia * 2.9; 7. } 8. return distancia * 2.10; 9. 10.
  • 108. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia * 3.90; 4. } 5. if (ehHorarioDeDomingo()) { 6. return distancia * 2.9; 7. } 8. return distancia * 2.10; 9. 10.
  • 109. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia * 3.90; 4. } 5. if (ehHorarioDeDomingo()) { 6. return distancia * 2.9; 7. } 8. return distancia * 2.10; 9. }
  • 110. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia *; 4. } 5. if (ehHorarioDeDomingo()) { 6. return distancia *; 7. } 8. return distancia *; 9. }
  • 111. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia * PRECO_BANDEIRA_2; 4. } 5. if (ehHorarioDeDomingo()) { 6. return distancia * PRECO_DE_DOMINGO; 7. } 8. return distancia * PRECO_BANDEIRA_1; 9. }