SlideShare une entreprise Scribd logo
1  sur  64
CLEAN CODEpor Robert c. martin
O qUEsentimos quando encontramos código ruim? dor tempo gasto decepção frustração incerteza
O que é Código limpo? Uma coisa sem duplicidade cuidado simples direto eficiente elegante
Meaningfulnames Nós escolhemos nomes para tudo.  Então nós temos que fazer isto bem feito. O nome deve nos dizer: ,[object Object]
 O que ele faz.
 Como ele é usado.,[object Object]
Meaningfulnames Evite desinformação ,[object Object]
 Evite dar nomes como “listaDeContas” (com o tipo no nome)- Evite usar ´L´ minusculo ou ´o´ maiusculo, eles parecem com 1 e 0.
Meaningfulnames Faça distinções significativas ,[object Object],for(int i = 0; i < a1.length; i++) { 	a2[i] = a1[i];     }
Meaningfulnames Use nomes pronunciáveis ,[object Object],private Date genymdhms; Aoinvés de.. private Date generationTimestamp;
Meaningfulnames Use nomes fáceis de procurar ,[object Object],for (int j=0; j<34; j++) { 	s += (t[j]*4)/5; }
Meaningfulnames Quando há sobrecarga do construtor, tente usar métodos estáticos que descrevem os parâmetros. Por exemplo:  Complex fulcrumPoint = new Complex(23.0); Pode ser assim..  Complex fulcrumPoint = Complex.FromRealNumber(23.0);
Meaningfulnames Não use trocadilhos ,[object Object]
Não use palavrasapenaspor “consistência”.Porexemplo, não use “add” se nãoestárealmenteadicionandoalgo.
Meaningfulnames Boas práticas - Nomes de classes devem ser substantivos e nunca devem conter verbos. ,[object Object],  Os mutators e accessors devem ser nomeados com os prefixos “get” e “set” de acordo com o padrão javabean.
functions ,[object Object]
 Como podemos fazer com que um método transmita sua intenção?
 Que atributos podemos passar para nossos métodos que permitam que um leitor saiba o que se passa dentro dele ?Métodos e funções são a primeira linha de organização de qualquer programa.
functions Pequenos A primeiraregra dos métodos e funções é queelesdevem ser pequenos. A segundaregra, é queelesdevem ser menoresainda. ,[object Object],- Linhasnãodevemcontermaisque 100 caracteres. - Seunível de identaçãonãodeve ser maiorquedois, o quefaz ser maisfácil de entender.
functions Fazer UMA coisa “Métodos e funçõesdevemfazerapenasumacoisa,  devemfazê-la certa e devemsomentefazê-la.” É difícil saber o que é “umacoisa”. Tentarextrairoutrométodo de um primeiro com o nomedizendo o queeleestáfazendo.
functions Use nomes claros Use váriaspalavrasparaque o métodosejafacilmenteentendido e possa dizer o queelerealmentefaz.
functions Parâmetros O número ideal de parâmetros de um métodooufunção é zero. Depoisvem um e dois. Trêsdeve ser evitado. Mais do quetrêsdeveteruma boa justificativaparatê-lo, poisnãodevem ser usados.
functions Parâmetros do tipo boolean Passar um booleanparaumafunção é umaterrívelprática. ,[object Object],- Claramenteestádizendoque a funçãofazmais de umacoisa.
functions Efeitos colaterais Efeitoscolateraissãomentiras. Suafunçãodizquefaráumacoisa, masfazoutras “escondidas”. publicbooleancheckPassword(String username, String password) {    String passwordStatus = cryptographer.decrypt(password); if(passwordStatus.equals(“OK”)) { Session.initialize(); returntrue;    }	 returnfalse; }
functions Commandqueryseparation Métodosdevemfazeralgumacoisaouretornaralgumacoisa. Masnãoosdois, poisissogeraconfusão. Don´t repeatyourself Presteatenção no códigorepetido. Eviteduplicidade.
COMmentS - Comentáriospodem ser bastanteúteis se colocadosnoslugarescertos. - Podem ser mentirosos e trazerdesinformação, mesmosemintenção. ,[object Object],- Apenas o códigopode dizer o queelerealmentefaz!
COMmentS Comments do notmakeup for badcode Um dos motivosmaiscomunspara se escrevercomentários é códigoruim. Entãoquandovocêpensaremescrever um comentário, é sinalqueeledeve ser refatorado.
COMmentS Explainyourself in code // Check if the employee is eligible for benefits if((employee.flags==100) && (employee.age > 65)) Ou isso if(employee.isEligibleForBenefits())
COMmentS Goodcomments: Alguns comentários são necessários  ou benéficos. Mas o melhor é o que você não precisa escrever. Explanationofintent: Outros fornecem a intenção por trás de uma decisão tomada, e não só pela informação. Warningofconsequences: As vezes é útil avisar outros  desenvolvedores sobre algumas consequências.
COMmentS Badcomments: “Qualquer comentário que força você  a olhar em outra parte do código para entende-lo,  não vale os bits que consome.”  Redundantcomments: Não diz nada a mais que o próprio Código. Misleadingcomments: Quando um desenvolvedor declara algo e seu comentário que não é preciso o bastante para  ser exato. Noisecomments: Declaram o óbvio.
COMmentS Não use comentários quando você pode usar métodos ou variáveis. // does the module from list depend on the  // system we are part of? if(smodule.getDependSystems().contains(subSysMod.getSystem())) Use assim... ArrayListmoduleDependees = smodule.getDependSystems();    String ourSystem = subSysMod.getSystem();    if (moduleDependees.contains(ourSystem))
COMmentS Closingbracecomments try{ 	String nada;	while(i=3) {i++;		 	 ... 	 ... 	} // end while    } // end try
COMmentS Código comentado Nunca faça isso!! Quando alguém vê um código comentado, não tem a coragem de apagá-lo. Vão pensar que há uma razão para estar ali. Inobvious connection Quando um comentário precisa ser explicado.
Formatting Formatação é importante, pois se trata de comunicação. E comunicação é a primeira ordem para os desenvolvedores profissionais. A legibilidade do seu código terá profundo efeito em todas as mudanças que serão feitas. Seu estilo e disciplina sobrevive mesmo se o código original for alterado.
Formatting Vertical formating Não é uma regra, mas geralmente uma classe tem 200 linhas, com um limite de 500 linhas. Classes menores são mais fáceis de entender. Vertical distanceandordering Conceitos que estão relacionados devem ficar verticalmente próximos uns dos outros.
Formatting Horizontal formating Alguns desenvolvedores sugerem um limite de 120 caracteres em uma linha. Identação Uma boa identação do código ajuda a visualizar todo o escopo.  Identificar as situações e regras relevantes mais rápido.
Formatting Sempre use espaços entre operadores, parâmetros e vírgulas. public double(inta,intb,int c) {    Double sum=number+(one*two); } Melhor assim... public double(int a, int b, int c) {    Double sum = number + (one * two); }
Objectsand data structures Objetos  x  Estrutura de dados Objetos - Escondem os dados por abstração. - Expõem métodos que operam nos dados. Estrutura de dados - Expõem seus dados. - Não possuem métodos significativos.
Objectsand data structures Data abstraction public interface Vehicle {    double getFuelTankCapacity();    double getGallonsOfGasoline(); } Escondendo detalhes dos dados... public interface Vehicle { 	double getPercentFuelRemaining(); }
Errorhandling Tratar erros é umas das coisas que todos nós temos que fazer quando estamos programando. As coisas podem dar errado e nós temos que estar certos que nosso código fará o que deve fazer.
Errorhandling Use exceptions ratherthanreturncodes O problema desses retornos é que eles desorganizam a chamada. Quem fez a chamada deve verificar se há erros no retorno, e isso pode ser fácil de se esquecer. Por isso que é melhor lançar uma exception.
Errorhandling Providecontextwith exceptions  Crie mensagens informativas para os erros. Mencionando a operação que falhou  e o tipo de falha.
Errorhandling Defina seu fluxo Separe as regras de negócio de erros ou outras situações. try { MealExpenses expenses = expensesDao.getMeals();    total += expenses.getTotal(); } catch(MealExceptionNotFound e) {    total += getMealPerDiem(); }
Errorhandling Don´t returnnull: Evite retornar null em seus métodos. Prefira retornar SPECIAL CASE object ou vazio no caso de listas. List<Employees> employees = getEmployees(); if(employees != null) {    for(Employee employee : employees) { 	...    } } List<Employees> employees = getEmployees(); for(Employee employee : employees) { 	... }
Errorhandling Don´t passnull Evite passar null para seus métodos. Isso pode gerar as famosas NullPointerExceptions.
unittests Testes Garantir que cada pedaço do código esteja fazendo o esperado Criar mocks para os elementos com qual tenho o controle. Criar comandos para setar valores booleanos e garantir meu retorno quando aplicasse o valor correto. Uma vez passando, garantir que os testes serão úteis para qualquer um que trabalhar com esse código.
unittests Três Leis do TDD Primeira: Vocênãopodeescrever o códigoatéquevocêtenhacriado um testefalhando. Segunda: Vocênãopodeescrevermais testes do quesejasuficienteparafalhar. Terceira: Vocênãopodeescrevermaiscódigo do que o suficienteparapassar o testequeestáfalhando.
unittests Mantenhaseus testes limpos ,[object Object]
Quantomaissujo o testemaisdificil de darmanutenção.- Se vocênãomantê-los limpos, vocêiráperdê-los. E semelesvocêperderá o quedeixaseucódigo de produçãoflexível. “O código do teste é tãoimportantequanto o códigodaprodução.”
unittests Testes limpos ,[object Object], A Legibilidade do código. ,[object Object],O mesmoquefaztodocódigolegível: ,[object Object]
Simplicidade
Códigoexpressivo,[object Object]
Facilite o entendimento de cadateste.,[object Object]
unittests F.I.R.S.T. Repeatable:  Devem ser repetitivos, estardisponíveispararoda-los emqualquerambiente. Self-Validating:  Elesdevempossuirumarespostabooleana. Semprecisarleroucompararresultadospara saber se o testepassou. Timely:  O testedeve ser escrito um pouco antes do código. Apósele, serámaisdificilparafazer o teste.
unittests Clean tests Testes são importantes para a saúde do sistema, preservam e mantém a flexibilidade, manutenabilidade e reusabilidade do código. “Se você deixar seus testes apodrecerem, seu código também apodrecerá”
 classes Organizaçãodaclasse Seguindoospadrões do Java, a classedeveriacomeçar com umalista de variáveis. ,[object Object]
 private static variables
 private instance variables  Publicfunctions vêm depois das variavéis. E os métodos privados chamados de um publico, logo após o mesmo, seguindo a “stepdownrule”.
 classes Classes devem ser pequenas Como para os métodos, a regra é a mesma. Devem ser pequenos. Para saber se o tamanho da classe é o ideal, analisamos suas responsabilidades.  Nomear a classe também ajuda a determinar o tamanho e a responsabilidade dela.
 classes Princípiodaúnicaresponsabilidade (SRP) O princípio da única responsabilidade diz que uma classe deve ter uma, e apenas uma razão para mudar. Ele nos dá definições de responsabilidade e uma diretriz para o tamanho de uma classe. Tentar identificar responsabilidades nos ajuda a melhorar nosso código e criar melhores abstrações.
 classes Princípiodaúnicaresponsabilidade (SRP) O SRP é um dos conceitos mais importantes em Orientação a objetos. Também um dos mais simples de entender e aderir. O problema é que muitos temem o número de pequenas classes que são criadas. Precisam navegar entre as classes
 classes Coesão ,[object Object]
 Cada método deve manipular uma ou mais variáveis.
Geralmente quanto mais variáveis um método manipula, mais coeso ele é para a classe.

Contenu connexe

Tendances

Desvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptDesvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptRodrigo Branas
 
Aula 12 - Diagrama de Atividades.pdf
Aula 12 - Diagrama de Atividades.pdfAula 12 - Diagrama de Atividades.pdf
Aula 12 - Diagrama de Atividades.pdfIvanFontainha
 
Diagrama de Atividades - UML
Diagrama de Atividades - UMLDiagrama de Atividades - UML
Diagrama de Atividades - UMLVinícius Barros
 
Aula 03 - Introdução aos Diagramas de Atividade
Aula 03 - Introdução aos Diagramas de AtividadeAula 03 - Introdução aos Diagramas de Atividade
Aula 03 - Introdução aos Diagramas de AtividadeAlberto Simões
 
03 - Orientação a objetos e classes em C# v1.0
03 - Orientação a objetos e classes em C# v1.003 - Orientação a objetos e classes em C# v1.0
03 - Orientação a objetos e classes em C# v1.0César Augusto Pessôa
 
02 - Orientação a objetos e revisão de C# v1.5
02 - Orientação a objetos e revisão de C# v1.502 - Orientação a objetos e revisão de C# v1.5
02 - Orientação a objetos e revisão de C# v1.5César Augusto Pessôa
 
Diagrama de Estados
Diagrama de EstadosDiagrama de Estados
Diagrama de EstadosMaikynata
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em PythonLuciano Ramalho
 
Arquitetura de Software
Arquitetura de SoftwareArquitetura de Software
Arquitetura de Softwareelliando dias
 
Modelos de Processo de Software Parte 3
Modelos de Processo de Software Parte 3Modelos de Processo de Software Parte 3
Modelos de Processo de Software Parte 3Elaine Cecília Gatto
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POODaniel Brandão
 
Java: Composicao e Array List
Java: Composicao e Array ListJava: Composicao e Array List
Java: Composicao e Array ListArthur Emanuel
 
Estrutura de Dados Apoio (Tabela Hash)
Estrutura de Dados Apoio (Tabela Hash)Estrutura de Dados Apoio (Tabela Hash)
Estrutura de Dados Apoio (Tabela Hash)Leinylson Fontinele
 
Padrões de Projeto - Design Patterns e Anti-Patterns
Padrões de Projeto - Design Patterns e Anti-PatternsPadrões de Projeto - Design Patterns e Anti-Patterns
Padrões de Projeto - Design Patterns e Anti-PatternsRodrigo Kono
 
Aula 02 - Escolha caso
Aula 02 - Escolha casoAula 02 - Escolha caso
Aula 02 - Escolha casoEder Samaniego
 
Clean Code (Robert C. Martin)
Clean Code (Robert C. Martin)Clean Code (Robert C. Martin)
Clean Code (Robert C. Martin)Yasser Veleda
 

Tendances (20)

Desvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptDesvendando a linguagem JavaScript
Desvendando a linguagem JavaScript
 
Aula 12 - Diagrama de Atividades.pdf
Aula 12 - Diagrama de Atividades.pdfAula 12 - Diagrama de Atividades.pdf
Aula 12 - Diagrama de Atividades.pdf
 
Diagrama de Atividades - UML
Diagrama de Atividades - UMLDiagrama de Atividades - UML
Diagrama de Atividades - UML
 
Aula 03 - Introdução aos Diagramas de Atividade
Aula 03 - Introdução aos Diagramas de AtividadeAula 03 - Introdução aos Diagramas de Atividade
Aula 03 - Introdução aos Diagramas de Atividade
 
Fundamentos da Engenharia de Software
Fundamentos da Engenharia de SoftwareFundamentos da Engenharia de Software
Fundamentos da Engenharia de Software
 
03 - Orientação a objetos e classes em C# v1.0
03 - Orientação a objetos e classes em C# v1.003 - Orientação a objetos e classes em C# v1.0
03 - Orientação a objetos e classes em C# v1.0
 
02 - Orientação a objetos e revisão de C# v1.5
02 - Orientação a objetos e revisão de C# v1.502 - Orientação a objetos e revisão de C# v1.5
02 - Orientação a objetos e revisão de C# v1.5
 
Diagrama de Estados
Diagrama de EstadosDiagrama de Estados
Diagrama de Estados
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
 
Arquitetura de Software
Arquitetura de SoftwareArquitetura de Software
Arquitetura de Software
 
Modelos de Processo de Software Parte 3
Modelos de Processo de Software Parte 3Modelos de Processo de Software Parte 3
Modelos de Processo de Software Parte 3
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POO
 
Java: Composicao e Array List
Java: Composicao e Array ListJava: Composicao e Array List
Java: Composicao e Array List
 
Aula4 levantamento requisitos
Aula4 levantamento requisitosAula4 levantamento requisitos
Aula4 levantamento requisitos
 
Estrutura de Dados Apoio (Tabela Hash)
Estrutura de Dados Apoio (Tabela Hash)Estrutura de Dados Apoio (Tabela Hash)
Estrutura de Dados Apoio (Tabela Hash)
 
Padrões de Projeto - Design Patterns e Anti-Patterns
Padrões de Projeto - Design Patterns e Anti-PatternsPadrões de Projeto - Design Patterns e Anti-Patterns
Padrões de Projeto - Design Patterns e Anti-Patterns
 
Aula 02 - Escolha caso
Aula 02 - Escolha casoAula 02 - Escolha caso
Aula 02 - Escolha caso
 
Aula 09 - introducao oo
Aula 09 - introducao ooAula 09 - introducao oo
Aula 09 - introducao oo
 
clean code
clean codeclean code
clean code
 
Clean Code (Robert C. Martin)
Clean Code (Robert C. Martin)Clean Code (Robert C. Martin)
Clean Code (Robert C. Martin)
 

Similaire à Código limpo - Princípios e boas práticas

Clean Code - Fork In Tuba
Clean Code - Fork In TubaClean Code - Fork In Tuba
Clean Code - Fork In TubaRafael Paz
 
Clean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisClean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisRogerio Fontes
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareFelipe
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshopguestd37c23
 
Não existe feedback melhor do que o do seu código
Não existe feedback melhor do que o do seu códigoNão existe feedback melhor do que o do seu código
Não existe feedback melhor do que o do seu códigoRenan Carvalho
 
Minicurso Ruby on Rails Dextra
Minicurso Ruby on Rails DextraMinicurso Ruby on Rails Dextra
Minicurso Ruby on Rails DextraDextra
 
Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Thiago Faria de Andrade
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoJuciellen Cabrera
 
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
 
Guia Rápido de Referência Java
Guia Rápido de Referência JavaGuia Rápido de Referência Java
Guia Rápido de Referência JavaMario Jorge Pereira
 

Similaire à Código limpo - Princípios e boas práticas (20)

Clean code
Clean codeClean code
Clean code
 
Clean Code - Fork In Tuba
Clean Code - Fork In TubaClean Code - Fork In Tuba
Clean Code - Fork In Tuba
 
Código limpo
Código limpoCódigo limpo
Código limpo
 
Clean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisClean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everis
 
FC-Logic
FC-LogicFC-Logic
FC-Logic
 
Código limpo
Código limpoCódigo limpo
Código limpo
 
O que é código bonito?
O que é código bonito?O que é código bonito?
O que é código bonito?
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
 
Código Limpo
Código LimpoCódigo Limpo
Código Limpo
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshop
 
Não existe feedback melhor do que o do seu código
Não existe feedback melhor do que o do seu códigoNão existe feedback melhor do que o do seu código
Não existe feedback melhor do que o do seu código
 
Minicurso Ruby on Rails Dextra
Minicurso Ruby on Rails DextraMinicurso Ruby on Rails Dextra
Minicurso Ruby on Rails Dextra
 
Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no código
 
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
 
Guia Rápido de Referência Java
Guia Rápido de Referência JavaGuia Rápido de Referência Java
Guia Rápido de Referência Java
 
Modulo02
Modulo02Modulo02
Modulo02
 
Código Limpo
Código LimpoCódigo Limpo
Código Limpo
 

Plus de Bruno Lui

Functional Programming
Functional ProgrammingFunctional Programming
Functional ProgrammingBruno Lui
 
Introdução ao Android
Introdução ao AndroidIntrodução ao Android
Introdução ao AndroidBruno Lui
 
Inversion of control
Inversion of controlInversion of control
Inversion of controlBruno Lui
 
Passionate programmer - Parte 1
Passionate programmer - Parte 1Passionate programmer - Parte 1
Passionate programmer - Parte 1Bruno Lui
 

Plus de Bruno Lui (6)

Functional Programming
Functional ProgrammingFunctional Programming
Functional Programming
 
Switch
SwitchSwitch
Switch
 
Refactoring
RefactoringRefactoring
Refactoring
 
Introdução ao Android
Introdução ao AndroidIntrodução ao Android
Introdução ao Android
 
Inversion of control
Inversion of controlInversion of control
Inversion of control
 
Passionate programmer - Parte 1
Passionate programmer - Parte 1Passionate programmer - Parte 1
Passionate programmer - Parte 1
 

Código limpo - Princípios e boas práticas

  • 2. O qUEsentimos quando encontramos código ruim? dor tempo gasto decepção frustração incerteza
  • 3. O que é Código limpo? Uma coisa sem duplicidade cuidado simples direto eficiente elegante
  • 4.
  • 5. O que ele faz.
  • 6.
  • 7.
  • 8. Evite dar nomes como “listaDeContas” (com o tipo no nome)- Evite usar ´L´ minusculo ou ´o´ maiusculo, eles parecem com 1 e 0.
  • 9.
  • 10.
  • 11.
  • 12. Meaningfulnames Quando há sobrecarga do construtor, tente usar métodos estáticos que descrevem os parâmetros. Por exemplo: Complex fulcrumPoint = new Complex(23.0); Pode ser assim.. Complex fulcrumPoint = Complex.FromRealNumber(23.0);
  • 13.
  • 14. Não use palavrasapenaspor “consistência”.Porexemplo, não use “add” se nãoestárealmenteadicionandoalgo.
  • 15.
  • 16.
  • 17. Como podemos fazer com que um método transmita sua intenção?
  • 18. Que atributos podemos passar para nossos métodos que permitam que um leitor saiba o que se passa dentro dele ?Métodos e funções são a primeira linha de organização de qualquer programa.
  • 19.
  • 20. functions Fazer UMA coisa “Métodos e funçõesdevemfazerapenasumacoisa, devemfazê-la certa e devemsomentefazê-la.” É difícil saber o que é “umacoisa”. Tentarextrairoutrométodo de um primeiro com o nomedizendo o queeleestáfazendo.
  • 21. functions Use nomes claros Use váriaspalavrasparaque o métodosejafacilmenteentendido e possa dizer o queelerealmentefaz.
  • 22. functions Parâmetros O número ideal de parâmetros de um métodooufunção é zero. Depoisvem um e dois. Trêsdeve ser evitado. Mais do quetrêsdeveteruma boa justificativaparatê-lo, poisnãodevem ser usados.
  • 23.
  • 24. functions Efeitos colaterais Efeitoscolateraissãomentiras. Suafunçãodizquefaráumacoisa, masfazoutras “escondidas”. publicbooleancheckPassword(String username, String password) { String passwordStatus = cryptographer.decrypt(password); if(passwordStatus.equals(“OK”)) { Session.initialize(); returntrue; } returnfalse; }
  • 25. functions Commandqueryseparation Métodosdevemfazeralgumacoisaouretornaralgumacoisa. Masnãoosdois, poisissogeraconfusão. Don´t repeatyourself Presteatenção no códigorepetido. Eviteduplicidade.
  • 26.
  • 27. COMmentS Comments do notmakeup for badcode Um dos motivosmaiscomunspara se escrevercomentários é códigoruim. Entãoquandovocêpensaremescrever um comentário, é sinalqueeledeve ser refatorado.
  • 28. COMmentS Explainyourself in code // Check if the employee is eligible for benefits if((employee.flags==100) && (employee.age > 65)) Ou isso if(employee.isEligibleForBenefits())
  • 29. COMmentS Goodcomments: Alguns comentários são necessários ou benéficos. Mas o melhor é o que você não precisa escrever. Explanationofintent: Outros fornecem a intenção por trás de uma decisão tomada, e não só pela informação. Warningofconsequences: As vezes é útil avisar outros desenvolvedores sobre algumas consequências.
  • 30. COMmentS Badcomments: “Qualquer comentário que força você a olhar em outra parte do código para entende-lo, não vale os bits que consome.” Redundantcomments: Não diz nada a mais que o próprio Código. Misleadingcomments: Quando um desenvolvedor declara algo e seu comentário que não é preciso o bastante para ser exato. Noisecomments: Declaram o óbvio.
  • 31. COMmentS Não use comentários quando você pode usar métodos ou variáveis. // does the module from list depend on the // system we are part of? if(smodule.getDependSystems().contains(subSysMod.getSystem())) Use assim... ArrayListmoduleDependees = smodule.getDependSystems(); String ourSystem = subSysMod.getSystem(); if (moduleDependees.contains(ourSystem))
  • 32. COMmentS Closingbracecomments try{ String nada; while(i=3) {i++; ... ... } // end while } // end try
  • 33. COMmentS Código comentado Nunca faça isso!! Quando alguém vê um código comentado, não tem a coragem de apagá-lo. Vão pensar que há uma razão para estar ali. Inobvious connection Quando um comentário precisa ser explicado.
  • 34. Formatting Formatação é importante, pois se trata de comunicação. E comunicação é a primeira ordem para os desenvolvedores profissionais. A legibilidade do seu código terá profundo efeito em todas as mudanças que serão feitas. Seu estilo e disciplina sobrevive mesmo se o código original for alterado.
  • 35. Formatting Vertical formating Não é uma regra, mas geralmente uma classe tem 200 linhas, com um limite de 500 linhas. Classes menores são mais fáceis de entender. Vertical distanceandordering Conceitos que estão relacionados devem ficar verticalmente próximos uns dos outros.
  • 36. Formatting Horizontal formating Alguns desenvolvedores sugerem um limite de 120 caracteres em uma linha. Identação Uma boa identação do código ajuda a visualizar todo o escopo. Identificar as situações e regras relevantes mais rápido.
  • 37. Formatting Sempre use espaços entre operadores, parâmetros e vírgulas. public double(inta,intb,int c) { Double sum=number+(one*two); } Melhor assim... public double(int a, int b, int c) { Double sum = number + (one * two); }
  • 38. Objectsand data structures Objetos x Estrutura de dados Objetos - Escondem os dados por abstração. - Expõem métodos que operam nos dados. Estrutura de dados - Expõem seus dados. - Não possuem métodos significativos.
  • 39. Objectsand data structures Data abstraction public interface Vehicle { double getFuelTankCapacity(); double getGallonsOfGasoline(); } Escondendo detalhes dos dados... public interface Vehicle { double getPercentFuelRemaining(); }
  • 40. Errorhandling Tratar erros é umas das coisas que todos nós temos que fazer quando estamos programando. As coisas podem dar errado e nós temos que estar certos que nosso código fará o que deve fazer.
  • 41. Errorhandling Use exceptions ratherthanreturncodes O problema desses retornos é que eles desorganizam a chamada. Quem fez a chamada deve verificar se há erros no retorno, e isso pode ser fácil de se esquecer. Por isso que é melhor lançar uma exception.
  • 42. Errorhandling Providecontextwith exceptions Crie mensagens informativas para os erros. Mencionando a operação que falhou e o tipo de falha.
  • 43. Errorhandling Defina seu fluxo Separe as regras de negócio de erros ou outras situações. try { MealExpenses expenses = expensesDao.getMeals(); total += expenses.getTotal(); } catch(MealExceptionNotFound e) { total += getMealPerDiem(); }
  • 44. Errorhandling Don´t returnnull: Evite retornar null em seus métodos. Prefira retornar SPECIAL CASE object ou vazio no caso de listas. List<Employees> employees = getEmployees(); if(employees != null) { for(Employee employee : employees) { ... } } List<Employees> employees = getEmployees(); for(Employee employee : employees) { ... }
  • 45. Errorhandling Don´t passnull Evite passar null para seus métodos. Isso pode gerar as famosas NullPointerExceptions.
  • 46. unittests Testes Garantir que cada pedaço do código esteja fazendo o esperado Criar mocks para os elementos com qual tenho o controle. Criar comandos para setar valores booleanos e garantir meu retorno quando aplicasse o valor correto. Uma vez passando, garantir que os testes serão úteis para qualquer um que trabalhar com esse código.
  • 47. unittests Três Leis do TDD Primeira: Vocênãopodeescrever o códigoatéquevocêtenhacriado um testefalhando. Segunda: Vocênãopodeescrevermais testes do quesejasuficienteparafalhar. Terceira: Vocênãopodeescrevermaiscódigo do que o suficienteparapassar o testequeestáfalhando.
  • 48.
  • 49. Quantomaissujo o testemaisdificil de darmanutenção.- Se vocênãomantê-los limpos, vocêiráperdê-los. E semelesvocêperderá o quedeixaseucódigo de produçãoflexível. “O código do teste é tãoimportantequanto o códigodaprodução.”
  • 50.
  • 52.
  • 53.
  • 54. unittests F.I.R.S.T. Repeatable: Devem ser repetitivos, estardisponíveispararoda-los emqualquerambiente. Self-Validating: Elesdevempossuirumarespostabooleana. Semprecisarleroucompararresultadospara saber se o testepassou. Timely: O testedeve ser escrito um pouco antes do código. Apósele, serámaisdificilparafazer o teste.
  • 55. unittests Clean tests Testes são importantes para a saúde do sistema, preservam e mantém a flexibilidade, manutenabilidade e reusabilidade do código. “Se você deixar seus testes apodrecerem, seu código também apodrecerá”
  • 56.
  • 57. private static variables
  • 58. private instance variables Publicfunctions vêm depois das variavéis. E os métodos privados chamados de um publico, logo após o mesmo, seguindo a “stepdownrule”.
  • 59. classes Classes devem ser pequenas Como para os métodos, a regra é a mesma. Devem ser pequenos. Para saber se o tamanho da classe é o ideal, analisamos suas responsabilidades. Nomear a classe também ajuda a determinar o tamanho e a responsabilidade dela.
  • 60. classes Princípiodaúnicaresponsabilidade (SRP) O princípio da única responsabilidade diz que uma classe deve ter uma, e apenas uma razão para mudar. Ele nos dá definições de responsabilidade e uma diretriz para o tamanho de uma classe. Tentar identificar responsabilidades nos ajuda a melhorar nosso código e criar melhores abstrações.
  • 61. classes Princípiodaúnicaresponsabilidade (SRP) O SRP é um dos conceitos mais importantes em Orientação a objetos. Também um dos mais simples de entender e aderir. O problema é que muitos temem o número de pequenas classes que são criadas. Precisam navegar entre as classes
  • 62.
  • 63. Cada método deve manipular uma ou mais variáveis.
  • 64. Geralmente quanto mais variáveis um método manipula, mais coeso ele é para a classe.
  • 65. Quando há coesão, significa que métodos e variáveis são co-dependentes.- Quando aparecem muitas variáveis que são usadas por alguns métodos, talvez seja uma classe mais coesa tentando sair de uma maior.
  • 66. classes Mantendoresultadoscoesosem classes pequenas Quando a classe perde coesão, reparta-a. Quando quebramos um método grande em menores podemos ter a oportunidade de separar em classes menores também, o que nos proporciona mais organização e transparência.
  • 67. Emergente E se houvessem quatro regras que você pudesse seguir para ajudá-lo a criar bons designs de código e estrutura sendo mais fácil de aplicar princípios como SRP e DIP, e assim facilitar a criação de um de bom design de software. Pois aqui estão as 4 regras de Simple Design de Kent Beck: - Rode todos os testes; - Remova duplicação; - Expresse sua intenção; - Diminua o número de classes e métodos.
  • 68. Emergente Rode todosos testes Fazendo um sistema testável nos obriga e usar boas práticas como classes e métodos pequenos de apenas uma responsabilidade. Quanto mais testes fazermos, mais boas maneiras e princípios seguiremos para evitar o acoplamento de nosso código. Escrever testes nos leva a criar melhores designs.
  • 69. Emergente Semduplicação Duplicação é o primeiro inimigo de um bom design. Ela representa trabalho e riscos adicionais e uma maior e desnecessária complexidade. Ela se manifesta em linhas de códigos iguais ou parecidas e também nas implementações. booleanisEmpty() { returnsize == 0; } booleanisEmpty() {} intgetSize() {}
  • 70. Emergente Expresse-se Muitos de nós já nos deparamos e produzimos código confuso. Expressar-se bem no código pode trazer grandes benefícios para o desenvolvimento de um sistema. Além de poupar tempo de quem o mantém. Você pode expressar bem escolhendo bons nomes, deixando métodos e classes pequenas, separando responsabilidades. Lembre-se que você pode sem o próximo a ler este código.
  • 71. Emergente Menos classes e métodos Sempre que possível, nosso objetivo é manter nosso sistema pequeno enquanto ao mesmo tempo mantemos nossos métodos e classes pequenas. Essa é a última das quatro regras em questão de importância.
  • 72.
  • 75. Testes que requerem mais de um passo
  • 76. Muitos parâmetros ou parâmetros boolean
  • 77.
  • 81. Variáveis e funções inexpressivas
  • 83.
  • 85. Nomes pequenos e inexpressivos
  • 87.