SlideShare uma empresa Scribd logo
Clean Code
Francisco Clauvane
Sobre
   Esta apresentacao teve como base o livro
Clean Code, minha experiencia profissional e
as dicas dadas por profissionais mais
experientes. Onde o objetivo da mesma e
mostrar na teoria e na pratica o que e um
codigo limpo.
Sumario
1.   Tratamento de erro
2.   Limites
3.   Teste de unidade
4.   Classes
5.   Sistemas
6.   Emergencia
7.   Concorrencia
8.   Refinamento Sucessivo
1-Tratamento de erro
● Tratamento de erro em codigo limpo?
● Esse recurso e importante, mas se
  obscurecer a logica, esta errado.
● O tio bob nos traz algumas tecnicas e
  consideracoes para que voce crie um codigo
  limpo e robusto e que trate os erro com
  estilo e elegancia.
1-Tratamento de erro
Use excecoes ao inves de retornar codigo.

public class AppVenda{
     public static void main (String args []){
           Produto produto = produtoServise.load(produto.getCodigo());
           seters...      if(produto.getStatus().equals(StatusProduto.
PRAZO_DE_VALIDADE_EXPIRADO)){
                System.out.println("Erro ao salvar o pedido: Prazo de validade expirado");
           }else {
                produto.save();
           }
     }
}
1-Tratamento de erro
Use excecoes ao inves de retornar codigo.

public class AppVenda{
     public static void main (String args []){
           Produto produto = produtoServise.load(produto.getCodigo());
           seters...      if(produto.getStatus().equals(StatusProduto.
PRAZO_DE_VALIDADE_EXPIRADO)){
                throw new Exception("Prazo de validade expirado");
           }else {
                produto.save();
           }
     }
}
1-Tratamento de erro
● Crie primeiro sua estrutura try-catch-finally
  para depois construir o codigo.
   ○ TDD
● Use excecoes nao verificadas
   ○ Excecoes verificadas sao 'CARAS'
   ○ Use excecoes verficadas apenas em situacoes
     criticas, por exemplo: Biblioteca
   ○ De maneira geral, o custo da dependencia e maior
     que o das vantagens.
● Forneca excecoes com contexto
   ○ Nao use Exception no seu catch.
   ○ Use mensagens informativas.
1-Tratamento de erro
● Defina as classes de excecoes segundo as
  necessidades do chamador.
  ○ Transformar varios catch em um tipo comum.
● Defina o fluxo normal
  ○   try{
  ○   MealExpenses expenses = dao.load(employee.getId);
  ○   m_total += expenses.getTotal();
  ○   }
  ○   catch {
  ○   m_total += getMealPerDiem();
  ○   }
1-Tratamento de erro
● Nao retorne NULL
● Nao passe NULL
2-Limites
● Raramente controlamos todos os softwares
  em nossos sistemas.
  ○ Compramos pacotes de outros fabricantes
  ○ codigos livres
  ○ outras equipes
● O uso do codigo de terceiros
  ○ Ha uma tensao natural entre os fornecedores e o
    seu usuario.
  ○ java.util.Map
● Nao use os limites
  ○ Evite retorna-los ou aceita-los como parametros em
    APIs publicas.
2-Limites
Explorando e aprendendo sobre limites
● Codigo de terceiros nos ajudam a obter mais
  funcionalidades em menos tempo.
● Por onde comecar com codigo de terceiros?
● Problemas ao integrar com codigo de terceiros:
   ○ tempo para ler a documentacao
   ○ escrever codigo para testar se a funcionalidade
     executa como esperavamos
   ○ deuparacao para descobrir se os bugs sao do nosso
     codigo ou do codigo do terceiro
2-Limites
Explorando e aprendendo sobre limites
● Problemas ao integrar com codigo de terceiros:
   ○ Entender codigo de terceito e dificil.
   ○ Integra-lo ao seu e mais ainda.
   ○ Fazer os dois anteriores ao mesmo tempo e muito
     mais ainda
   ○ Solucao: Testes!
   ○ Testes de aprendizagem
      ■ Gratuito
      ■ Robutez quanto a novas distribuicoes
2-Limites
Uso de codigo que nao existe ainda
● Novo tipo de limite: Separa o conhecido do
  desconhecido.

Limites Limpos
● E melhor depender de algo que voce
   controle do que pegar algo que controle
   voce.
3-Teste de unidade
Evolucao da nossa profissao
● Testes

TDD
● As tres leis que a regem
  ○ Nao se deve escrever o codigo de producao ate que
    o primeiro teste de falha tenha sido criado
  ○ Nao se deve escrever mais de um teste do que o
    necessario para falhar, e nao compilar e falhar.
  ○ Nao se deve escrever mais teste de produco do que
    o necessario para aplicar ao teste de falha atual.
3-Teste de unidade
Testes limpos
● "Os codigos de testes sao tao importantes
  quanto o codigo de producao. Ele nao e
  componente secundario. Ele requer
  raciocinio, planejamento e cuidado. E
  preciso mante-lo tao limpo quanto o codigo
  de producao."
● O que torna um teste limpo?
  ○ Tres regras:
    ■ Legibilidade,legibilidade e legibilidade.
3-Teste de unidade
Padrao duplo
● Um teste nao precisa ser mais eficiente que
  um codigo de producao.
  ○ Ambiente de teste e ambiente de producao sao dois
    ambiente que possuem requisitos diferentes.


Uma afirmacao por teste

Um unico conceito por teste
3-Teste de unidade
F.I.R.S.T.
● First
● Independent
● Repeatable
● Self-Validating
● Timely
4-Classes
Organizacao das classes
● Toda classe deve comecar com uma lista de
  variaveis
  ○ public,public static e constantes devem vir primeiro
  ○ private static, privates devem vir depois
● Encapsulamento
  ○ Protected, somente quando for o ultimo recurso.
● Classes deve ser pequenas
  ○ Diferentemente das funcoes as classes nao sao
    medidas atraves da quantidade de linhas, mas sim
    atraves da sua quantidade de responsabilidades.
    ■ Responsabilidade != metodos
4-Classes
● O nome da classe e muito importante
  ○ Se o nome for generico entao provavelmente sua
    classe tera muitas responsabilidades
  ○ Principio da responsabilidade unica
    ■ Devemos escrever um texto descritivo da classe
        sem utilizar as palavras: 'se','e','ou','mas'. O uso
        destas palavras sao um indicio de excesso de
        responsabilidade
    ■ Melhor um sistema com muitas classes
        pequenas do que um sistema com poucas
        classes grandes
    ■ Coesao
5-Sistemas
"Complexidade mata. Ela suga a vida dos
desenvolvedores, dificulta o planejamento, a
construcao e o teste dos produtos."

● Nivel de abstracao mais alto
  ○ O nivel de sistema


Separe a construcao e uso do sistema
● Cosntrucao != utilizacao
5-Sistemas
Comecaremos pela construcao:

public Service getService(){
  if(service == null){
      service = new MyServiceImpl(...);
  }
  return service;
}
5-Sistemas
● Possui uma dependencia da classe
  MyServiceImpl
● Possui uma violacao ao principio da
  resposabilidade unica
● Possivel dificuldade para Testar
  ○ Mock para a classe MyServiceImpl
● Nao temos garantia alguma que a classe
  MyServiceImpl sera sempre correta.
● Injecao de dependencia
5-Sistemas
Desenvolvimento gradual
● Analogia a construcao de um pequeno
  vilarejo que se torna uma grande cidade
6-Emergencia
Segundo Kent, um projeto e "simples" se
seguir as seguintes regras:

1.   Efetuar todos os testes
2.   Sem duplicacao de codigo
3.   Expressar o proposito do programador
4.   Minimizar o numero de classes e metodos

Estas regras estao em ordem de relevancia
7-Concorrencia
● Muito dificil escrever programas
  concorrentes limpos
● Estrategia de desacoplamento
  ○ Separa o que e executado de quando e executado
● Mitos e conceitos equivocados
  ○ A concorrencia sempre melhora o desempenho
  ○ O projeto nao muda ao criar programas concorrentes
  ○ Entender as questoes de concorrencia nao e
    importante quando se trabalhacom um conteiner
  ○ A concorrencia gera um certo aumento, tanto no
    desempenho como na criacao de codigo adicional
  ○ Uma concorrencia e complexa, mesmo para
    problemas simples
7-Concorrencia
● Mitos e conceitos equivocados
  ○ Os bugs de concorrencia geralmente nao se repetem,
    portanto sao frequentemente ignorados como casos
    unicos em vez dos defeitos que realmente sao
  ○ A concorrencia geralmente requer uma mudanca
    essencial na estrategia do projeto.


Desafios
● A seguir um trecho de codigo para
  exemplificar os possiveis problemas em
  concorrencia
7-Concorrencia
public class X{
  private int ultimoIdUsado = 42;

    public int getProximoIdUsado(){
      return ++ultimoIdUsado;
    }
}

O que Aconteceria se duas threads usassem o
este metodo ao mesmo tempo?
7-Concorrencia
Possiveis resultados:
1.   Thread A recebe 43, Thread B recebe 44 e o ultimoIdUsado e 44
2.   Thread A recebe 44, Thread B recebe 43 e o ultimoIdUsado e 44
3.   Thread A recebe 43, Thread B recebe 43 e o ultimoIdUsado e 43

O incrivel terceiro resultado ocorre quando as threads se cruzam. Isto ocorre
po r que elas possuem inumeros caminhos a percorrer onde alguns destes
caminhos podem retornar resultados incorretos.

para o tipo int sao 12.870 caminho possiveis
para o tipo long sao 2.704.156 caminho possiveis
8-Refinamento sucessivo
Como ja foi visto e quaseimpossivel encontrar
a melhor solucao na primeira tentativa. O mais
natural e que durante o dia-a-dia voce melhore
sempre que possivel ou necessario o seu
codigo aplicando as boas praticas de
desenvolvimento, desta forma voce em algum
periodo de tempo ira encontrar um codigo bem
"simples" e que atenda todas as necessidades.

Mais conteúdo relacionado

Mais procurados

Estratégias de testes em 10 passos, step by step!
Estratégias de testes em 10 passos, step by step!Estratégias de testes em 10 passos, step by step!
Estratégias de testes em 10 passos, step by step!Ariane Izac
 
Abordagem Funcional para Gerenciamento de Erros em .NET
Abordagem Funcional para Gerenciamento de Erros em .NETAbordagem Funcional para Gerenciamento de Erros em .NET
Abordagem Funcional para Gerenciamento de Erros em .NETGabriel Schade Cardoso
 
Aula 28,29 e 30 w3 c, versões, html5
Aula 28,29 e 30   w3 c, versões, html5Aula 28,29 e 30   w3 c, versões, html5
Aula 28,29 e 30 w3 c, versões, html5Jolvani Morgan
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...Renato Groffe
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...Renato Groff
 
Livro Código Limpo: Tratamento de Erros - Cap 7
Livro Código Limpo: Tratamento de Erros - Cap 7Livro Código Limpo: Tratamento de Erros - Cap 7
Livro Código Limpo: Tratamento de Erros - Cap 7Inael Rodrigues
 
Introdução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnitIntrodução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnitelliando dias
 
P01 - Como ser um desenvolvedor melhor
P01 - Como ser um desenvolvedor melhorP01 - Como ser um desenvolvedor melhor
P01 - Como ser um desenvolvedor melhorLeandro Ferreira
 

Mais procurados (19)

Codigo limpo
Codigo limpoCodigo limpo
Codigo limpo
 
Estratégias de testes em 10 passos, step by step!
Estratégias de testes em 10 passos, step by step!Estratégias de testes em 10 passos, step by step!
Estratégias de testes em 10 passos, step by step!
 
Code Smells
Code SmellsCode Smells
Code Smells
 
Abordagem Funcional para Gerenciamento de Erros em .NET
Abordagem Funcional para Gerenciamento de Erros em .NETAbordagem Funcional para Gerenciamento de Erros em .NET
Abordagem Funcional para Gerenciamento de Erros em .NET
 
Complexidade Ciclomática
Complexidade CiclomáticaComplexidade Ciclomática
Complexidade Ciclomática
 
Python tdc2019
Python tdc2019 Python tdc2019
Python tdc2019
 
Teste Driven Development
Teste Driven DevelopmentTeste Driven Development
Teste Driven Development
 
Aula 28,29 e 30 w3 c, versões, html5
Aula 28,29 e 30   w3 c, versões, html5Aula 28,29 e 30   w3 c, versões, html5
Aula 28,29 e 30 w3 c, versões, html5
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...
 
TDD na Prática
TDD na PráticaTDD na Prática
TDD na Prática
 
Minicurso de TDD
Minicurso de TDDMinicurso de TDD
Minicurso de TDD
 
Livro Código Limpo: Tratamento de Erros - Cap 7
Livro Código Limpo: Tratamento de Erros - Cap 7Livro Código Limpo: Tratamento de Erros - Cap 7
Livro Código Limpo: Tratamento de Erros - Cap 7
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
Introdução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnitIntrodução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnit
 
P01 - Como ser um desenvolvedor melhor
P01 - Como ser um desenvolvedor melhorP01 - Como ser um desenvolvedor melhor
P01 - Como ser um desenvolvedor melhor
 
JUnit
JUnitJUnit
JUnit
 
TDD do seu jeito
TDD do seu jeitoTDD do seu jeito
TDD do seu jeito
 

Semelhante a Clean code part 2

Testes e depuração de código com Python
Testes e depuração de código com PythonTestes e depuração de código com Python
Testes e depuração de código com PythonDorneles Treméa
 
Treinamento TDD - Atech
Treinamento TDD - AtechTreinamento TDD - Atech
Treinamento TDD - Atechcesarcneto
 
Desenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitDesenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitAdolfo Neto
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de softwareHeider Lopes
 
Clean Code - Fork In Tuba
Clean Code - Fork In TubaClean Code - Fork In Tuba
Clean Code - Fork In TubaRafael Paz
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Claudinei Brito Junior
 
Test-Driven Development with PHP
Test-Driven Development with PHPTest-Driven Development with PHP
Test-Driven Development with PHPCezar Souza
 
TDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de TestesTDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de TestesSandro Giacomozzi
 
Clean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisClean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisRogerio Fontes
 
TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"Cesar Romero
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasRafael Chinelato Del Nero
 

Semelhante a Clean code part 2 (20)

Testes e depuração de código com Python
Testes e depuração de código com PythonTestes e depuração de código com Python
Testes e depuração de código com Python
 
Treinamento TDD - Atech
Treinamento TDD - AtechTreinamento TDD - Atech
Treinamento TDD - Atech
 
Desenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitDesenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com Junit
 
Clean code em C#
Clean code em C#Clean code em C#
Clean code em C#
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software
 
Overview de QA
Overview de QA Overview de QA
Overview de QA
 
Clean Code - Fork In Tuba
Clean Code - Fork In TubaClean Code - Fork In Tuba
Clean Code - Fork In Tuba
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
 
Test-Driven Development with PHP
Test-Driven Development with PHPTest-Driven Development with PHP
Test-Driven Development with PHP
 
TDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de TestesTDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
 
Clean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisClean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everis
 
01-Paradigmas.pdf
01-Paradigmas.pdf01-Paradigmas.pdf
01-Paradigmas.pdf
 
TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"
 
Testes Unitários
Testes UnitáriosTestes Unitários
Testes Unitários
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivas
 
TDD (Resumo)
TDD (Resumo)TDD (Resumo)
TDD (Resumo)
 
Revisão de C# 4.0
Revisão de C# 4.0Revisão de C# 4.0
Revisão de C# 4.0
 
Clean Code
Clean CodeClean Code
Clean Code
 
Refatoração
RefatoraçãoRefatoração
Refatoração
 

Clean code part 2

  • 2. Sobre Esta apresentacao teve como base o livro Clean Code, minha experiencia profissional e as dicas dadas por profissionais mais experientes. Onde o objetivo da mesma e mostrar na teoria e na pratica o que e um codigo limpo.
  • 3. Sumario 1. Tratamento de erro 2. Limites 3. Teste de unidade 4. Classes 5. Sistemas 6. Emergencia 7. Concorrencia 8. Refinamento Sucessivo
  • 4. 1-Tratamento de erro ● Tratamento de erro em codigo limpo? ● Esse recurso e importante, mas se obscurecer a logica, esta errado. ● O tio bob nos traz algumas tecnicas e consideracoes para que voce crie um codigo limpo e robusto e que trate os erro com estilo e elegancia.
  • 5. 1-Tratamento de erro Use excecoes ao inves de retornar codigo. public class AppVenda{ public static void main (String args []){ Produto produto = produtoServise.load(produto.getCodigo()); seters... if(produto.getStatus().equals(StatusProduto. PRAZO_DE_VALIDADE_EXPIRADO)){ System.out.println("Erro ao salvar o pedido: Prazo de validade expirado"); }else { produto.save(); } } }
  • 6. 1-Tratamento de erro Use excecoes ao inves de retornar codigo. public class AppVenda{ public static void main (String args []){ Produto produto = produtoServise.load(produto.getCodigo()); seters... if(produto.getStatus().equals(StatusProduto. PRAZO_DE_VALIDADE_EXPIRADO)){ throw new Exception("Prazo de validade expirado"); }else { produto.save(); } } }
  • 7. 1-Tratamento de erro ● Crie primeiro sua estrutura try-catch-finally para depois construir o codigo. ○ TDD ● Use excecoes nao verificadas ○ Excecoes verificadas sao 'CARAS' ○ Use excecoes verficadas apenas em situacoes criticas, por exemplo: Biblioteca ○ De maneira geral, o custo da dependencia e maior que o das vantagens. ● Forneca excecoes com contexto ○ Nao use Exception no seu catch. ○ Use mensagens informativas.
  • 8. 1-Tratamento de erro ● Defina as classes de excecoes segundo as necessidades do chamador. ○ Transformar varios catch em um tipo comum. ● Defina o fluxo normal ○ try{ ○ MealExpenses expenses = dao.load(employee.getId); ○ m_total += expenses.getTotal(); ○ } ○ catch { ○ m_total += getMealPerDiem(); ○ }
  • 9. 1-Tratamento de erro ● Nao retorne NULL ● Nao passe NULL
  • 10. 2-Limites ● Raramente controlamos todos os softwares em nossos sistemas. ○ Compramos pacotes de outros fabricantes ○ codigos livres ○ outras equipes ● O uso do codigo de terceiros ○ Ha uma tensao natural entre os fornecedores e o seu usuario. ○ java.util.Map ● Nao use os limites ○ Evite retorna-los ou aceita-los como parametros em APIs publicas.
  • 11. 2-Limites Explorando e aprendendo sobre limites ● Codigo de terceiros nos ajudam a obter mais funcionalidades em menos tempo. ● Por onde comecar com codigo de terceiros? ● Problemas ao integrar com codigo de terceiros: ○ tempo para ler a documentacao ○ escrever codigo para testar se a funcionalidade executa como esperavamos ○ deuparacao para descobrir se os bugs sao do nosso codigo ou do codigo do terceiro
  • 12. 2-Limites Explorando e aprendendo sobre limites ● Problemas ao integrar com codigo de terceiros: ○ Entender codigo de terceito e dificil. ○ Integra-lo ao seu e mais ainda. ○ Fazer os dois anteriores ao mesmo tempo e muito mais ainda ○ Solucao: Testes! ○ Testes de aprendizagem ■ Gratuito ■ Robutez quanto a novas distribuicoes
  • 13. 2-Limites Uso de codigo que nao existe ainda ● Novo tipo de limite: Separa o conhecido do desconhecido. Limites Limpos ● E melhor depender de algo que voce controle do que pegar algo que controle voce.
  • 14. 3-Teste de unidade Evolucao da nossa profissao ● Testes TDD ● As tres leis que a regem ○ Nao se deve escrever o codigo de producao ate que o primeiro teste de falha tenha sido criado ○ Nao se deve escrever mais de um teste do que o necessario para falhar, e nao compilar e falhar. ○ Nao se deve escrever mais teste de produco do que o necessario para aplicar ao teste de falha atual.
  • 15. 3-Teste de unidade Testes limpos ● "Os codigos de testes sao tao importantes quanto o codigo de producao. Ele nao e componente secundario. Ele requer raciocinio, planejamento e cuidado. E preciso mante-lo tao limpo quanto o codigo de producao." ● O que torna um teste limpo? ○ Tres regras: ■ Legibilidade,legibilidade e legibilidade.
  • 16. 3-Teste de unidade Padrao duplo ● Um teste nao precisa ser mais eficiente que um codigo de producao. ○ Ambiente de teste e ambiente de producao sao dois ambiente que possuem requisitos diferentes. Uma afirmacao por teste Um unico conceito por teste
  • 17. 3-Teste de unidade F.I.R.S.T. ● First ● Independent ● Repeatable ● Self-Validating ● Timely
  • 18. 4-Classes Organizacao das classes ● Toda classe deve comecar com uma lista de variaveis ○ public,public static e constantes devem vir primeiro ○ private static, privates devem vir depois ● Encapsulamento ○ Protected, somente quando for o ultimo recurso. ● Classes deve ser pequenas ○ Diferentemente das funcoes as classes nao sao medidas atraves da quantidade de linhas, mas sim atraves da sua quantidade de responsabilidades. ■ Responsabilidade != metodos
  • 19. 4-Classes ● O nome da classe e muito importante ○ Se o nome for generico entao provavelmente sua classe tera muitas responsabilidades ○ Principio da responsabilidade unica ■ Devemos escrever um texto descritivo da classe sem utilizar as palavras: 'se','e','ou','mas'. O uso destas palavras sao um indicio de excesso de responsabilidade ■ Melhor um sistema com muitas classes pequenas do que um sistema com poucas classes grandes ■ Coesao
  • 20. 5-Sistemas "Complexidade mata. Ela suga a vida dos desenvolvedores, dificulta o planejamento, a construcao e o teste dos produtos." ● Nivel de abstracao mais alto ○ O nivel de sistema Separe a construcao e uso do sistema ● Cosntrucao != utilizacao
  • 21. 5-Sistemas Comecaremos pela construcao: public Service getService(){ if(service == null){ service = new MyServiceImpl(...); } return service; }
  • 22. 5-Sistemas ● Possui uma dependencia da classe MyServiceImpl ● Possui uma violacao ao principio da resposabilidade unica ● Possivel dificuldade para Testar ○ Mock para a classe MyServiceImpl ● Nao temos garantia alguma que a classe MyServiceImpl sera sempre correta. ● Injecao de dependencia
  • 23. 5-Sistemas Desenvolvimento gradual ● Analogia a construcao de um pequeno vilarejo que se torna uma grande cidade
  • 24. 6-Emergencia Segundo Kent, um projeto e "simples" se seguir as seguintes regras: 1. Efetuar todos os testes 2. Sem duplicacao de codigo 3. Expressar o proposito do programador 4. Minimizar o numero de classes e metodos Estas regras estao em ordem de relevancia
  • 25. 7-Concorrencia ● Muito dificil escrever programas concorrentes limpos ● Estrategia de desacoplamento ○ Separa o que e executado de quando e executado ● Mitos e conceitos equivocados ○ A concorrencia sempre melhora o desempenho ○ O projeto nao muda ao criar programas concorrentes ○ Entender as questoes de concorrencia nao e importante quando se trabalhacom um conteiner ○ A concorrencia gera um certo aumento, tanto no desempenho como na criacao de codigo adicional ○ Uma concorrencia e complexa, mesmo para problemas simples
  • 26. 7-Concorrencia ● Mitos e conceitos equivocados ○ Os bugs de concorrencia geralmente nao se repetem, portanto sao frequentemente ignorados como casos unicos em vez dos defeitos que realmente sao ○ A concorrencia geralmente requer uma mudanca essencial na estrategia do projeto. Desafios ● A seguir um trecho de codigo para exemplificar os possiveis problemas em concorrencia
  • 27. 7-Concorrencia public class X{ private int ultimoIdUsado = 42; public int getProximoIdUsado(){ return ++ultimoIdUsado; } } O que Aconteceria se duas threads usassem o este metodo ao mesmo tempo?
  • 28. 7-Concorrencia Possiveis resultados: 1. Thread A recebe 43, Thread B recebe 44 e o ultimoIdUsado e 44 2. Thread A recebe 44, Thread B recebe 43 e o ultimoIdUsado e 44 3. Thread A recebe 43, Thread B recebe 43 e o ultimoIdUsado e 43 O incrivel terceiro resultado ocorre quando as threads se cruzam. Isto ocorre po r que elas possuem inumeros caminhos a percorrer onde alguns destes caminhos podem retornar resultados incorretos. para o tipo int sao 12.870 caminho possiveis para o tipo long sao 2.704.156 caminho possiveis
  • 29. 8-Refinamento sucessivo Como ja foi visto e quaseimpossivel encontrar a melhor solucao na primeira tentativa. O mais natural e que durante o dia-a-dia voce melhore sempre que possivel ou necessario o seu codigo aplicando as boas praticas de desenvolvimento, desta forma voce em algum periodo de tempo ira encontrar um codigo bem "simples" e que atenda todas as necessidades.