SlideShare uma empresa Scribd logo
1 de 36
Baixar para ler offline
Grupo de Estudos
SAJ-ADV
Tema: Livro Clean Code (Código Limpo) de Robert Martin
Capítulos 3 e 4
Apresentado por: André Justi
Grupo de Estudos
SAJ-ADV
Tema: Livro Clean Code (Código Limpo) de Robert Martin
Capítulos 3 e 4
Apresentado por: André Justi
08/01/2014
Agenda
• Capitulo 3: Funções
• Capitulo 4: Comentários
Funções
“Nos primórdios da programação, formávamos nossos sistemas
com rotinas e sub-rotinas. Já na era do Fortran e do PL/1,
usávamos programas, subprogramas e funções. De tudo isso,
apenas função prevaleceu. As funções são a primeira linha de
organização em qualquer programa.”
Funções: Pequenas
A primeira regra para funções é que elas devem ser pequenas. A
segunda é que a primeira regra nunca deve ser quebrada.
Com pouca experiência podemos perceber que é muito mais
fácil dar manutenção, refatorar, documentar e aplicar testes em
funções pequenas.
Segundo Robert Martin funções devem ter entre 1 a 5 linhas.
Funções: Blocos e endentação
Entro de instruções como if, else, while, for e outros. Devem ter
apenas uma linha. Possivelmente uma chamada de outra função.
Além de manter a função pequena, isso adiciona um valor
significativo, pois a função chamada de entro do bloco pode
receber um nome descritivo, isso também implica que que as
funções não devem ter estruturas aninhadas. Portanto, o nível
de endentação de uma função deve ser de, no máximo, um ou
dois níveis. Isso, é claro, facilita a leitura e compreensão da
funções.
Funções: Blocos e endentação
Exemplo ruim:
private List<String> convertePessoasJaxbParaXml(List<Pessoa> pessoas) {
List<String> pessoaXmls = new ArrayList<>();
for (Pessoa pessoa : pessoas) {
Writer writer = new StringWriter();
try {
JAXB.marshal(pessoa, writer);
pessoaXmls.add(writer.toString());
} catch (DataBindingException dataBindingException) {
throw new HttpErroAoConverterObjetoJaxbParaConteudo(dataBindingException);
} finally {
IOUtils.closeQuietly(writer);
}
}
return pessoaXmls;
Funções: Blocos e endentação
Exemplo bom(Refatorado):
private List<String> convertePessoasJaxbParaXml(List<Pessoa> pessoas) {
List<String> pessoaXmls = new ArrayList<>();
for (Pessoa pessoa : pessoas) {
String pessoaXml = this.parsePessoaJaxbParaXml(pessoa);
pessoaXmls.add(pessoaXml);
}
return pessoaXmls;
}
Funções: Faça apenas uma coisa
As funções devem fazer apenas uma coisa e devem cumprir bem
o objetivo para o qual são destinadas.
O problema dessa declaração é que é difícil saber o que é “uma
coisa”.
Funções: Faça apenas uma coisa
Pense no seguinte cenário:
1. Determina se a página é de teste;
2. Se for, inclui o setUps;
3. Exibe a página em HTML.
Essa descrição é uma ou são três coisas?
Se uma função faz apenas uma série de passos de forma
declarativa, então ela está fazendo uma só coisa. Apesar de tudo
o motivo para criarmos função consiste em decompor um
conceito maior (em outras palavras, o nome da função) em uma
série de passos no próximo nível de abstração.
Funções: Um nível de abstração por função
A fim de certificarmos que nossas funções estão fazendo "uma
coisa", precisamos ter certeza de que toda lógica dentro da
nossa função são todos no mesmo nível de abstração.
É fácil ver como o próximo exemplo viola essa regra. Existem
conceitos de lá que estão em um nível muito alto de abstração,
como “converter o conteúdo dos todos objetos em uma lista de
String em XML” outros que estão em um nível baixo de
abstração, como: “fazer a conversão em si e tratar os possíveis
erros”.
Funções: Um nível de abstração por função
Misturar níveis de abstração dentro de uma função torna as
coisas confusas. Quem está lendo o código não é capaz de dizer
se uma determinada expressão é um conceito essencial ou um
detalhe.
private List<String> convertePessoasJaxbParaXml(List<Pessoa> pessoas) {
List<String> pessoaXmls = new ArrayList<>();
for (Pessoa pessoa : pessoas) {
Writer writer = new StringWriter();
try {
JAXB.marshal(pessoa, writer);
pessoaXmls.add(writer.toString());
} catch (DataBindingException dataBindingException) {
throw new HttpErroAoConverterObjetoJaxbParaConteudo(dataBindingException);
} finally {
IOUtils.closeQuietly(writer);
}
}
return pessoaXmls;
Funções: Ler o código de cima para baixo: Regra
Decrescente
Uma função bem implementada pode ser lida de cima para
baixo, como uma narrativa ou conjunto de tópicos.
private List<PessoaJaxb> consultarPessoasPorNome(String nomePessoa, ParametrosConsulta parametrosConsulta) {
validarParametrosConsultas(parametrosConsulta);
List<Pessoa> pessoas = this.pessoaDao.consultarPessoasPorNome(nomePessoa, parametrosConsulta);
List<PessoaJaxb> pessoasJaxb = converterPessoasParaPessoasJaxb(pessoas);
return pessoasJaxb;
}
Funções: Use nomes descritivos
Não devemos ter medo de fazer uma função com nome longo.
Um nome longo e descritivo é melhor do que um curto e
enigmático. Um nome longo também é melhor do que um
comentário longo descritivo.
Seja consistente em seus nomes. Use as mesmas frases (palavras
conceito/chave) em outros módulos para criar uma convenção.
Isso permite que tenhamos uma de fácil dedução da função.
Funções: Parâmetros de funções
Sempre devemos usar um numero pequeno de parâmetros
tentando não ultrapassar 3 parâmetros. Um numero menor de
parâmetro também facilita o entendimento da função e testes
em cima dela. Funções com muitos parâmetros exigem inúmeros
testes, por existem inúmeras possibilidades.
Funções: Parâmetros lógicos
Essa forma é ruim. Passar um booleano para um função
certamente é uma má pratica, isso mostra explicitamente que a
função faz mais de uma coisa. Normalmente uma se o
parâmetro for verdadeiro e outra se o parâmetro for falso.
Funções: Evite efeitos colaterais
Os efeitos colaterais são mentiras. Sua função promete fazer
uma coisa, mas ele também faz outra.
Às vezes ele vai fazer mudanças inesperadas em variáveis ??da
própria classe.
Às vezes ele vai fazer mudanças inesperadas em parâmetros
passados na função ou parâmetros globais da aplicação.
Em ambos os casos elas são "verdades" enganosas e prejudiciais,
que geralmente resultam em comportamentos estranhos.
Funções: Separação comando/consulta
As funções devem fazer ou responder algo, mas não ambos. Sua
função ou altera o estado de um objeto ou retorna informações
sobre ele. Efetuar as duas tarefas costuma gerar confusão.
Funções: Evite repetição
Evite sempre a repetição. Sempre que uma função ou parte se
repetir, torne elas comuns ou extraia apenas o bloco repetido
para outra função comum.
Comentários
“Não insira cometários em um código ruim, reescreva-o”.
- Brian W. Kernighan
Nada pode ser tão útil quanto um comentário bem colocado,
nada consegue ser tão prejudicial quanto um velho comentário
mal feito e que fala mentiras e informações incorretas.
Comentários: Comentários compensam um código ruim
Uma das motivações mais comuns para criar cometários é um
código ruim, construímos um módulo e sabemos que está
confuso e desorganizado. Estamos cientes da bagunça. Nós
mesmos dizemos “Oh é melhor inserir um comentário!”. Não...
acredite é melhor para e limpar a bagunça.
Comentários: Explique-se no código
Certamente há vezes em que não é possível expressar-se direto
no código. Infelizmente, devido a isso, muitos desenvolvedores
assumiram que o código raramente é, se é que possa ser, um
bom meio para se explicar. Evidentemente isso é falso.
Comentários: Explique-se no código
Oque você preferiria ver?
private void editarPessoa(Pessoa pessoa) {
if (pessoa == null
|| pessoa.getCodigo() == null
|| pessoa.getCodigo() < 1
|| this.pessoaDao.pessoaExiste(pessoa.getCodigo())) {
//Lança erro informando que pessoa não existe.
}
this.pessoaDao.salvarPessoa(pessoa);
}
Comentários: Explique-se no código
Ou isso?
private void editarPessoa(Pessoa pessoa) {
if (this.verificaExistenciaPessoa(pessoa)) {
//Lança erro informando que pessoa não existe.
}
this.pessoaDao.salvarPessoa(pessoa);
}
private boolean verificaExistenciaPessoa(Pessoa pessoa) {
if (pessoa == null) {
return false;
}
Long codigoPessoa = pessoa.getCodigo();
if (pessoa.getCodigo() == null || pessoa.getCodigo() < 1) {
return false;
}
return this.pessoaDao.pessoaExiste(pessoa.getCodigo());
}
Comentários: Comentários informativos
Às vezes é pratico fornecer informações básicas em um
comentário.
/** Regex para identificação do parâmetro 'import' da tag page com case insensitive. */
private static final String REGEX_PARAMETER_IMPORT = "(?i)import=["'].+?(["'])";
Comentários: Alerta sobre consequências
Às vezes é útil alertar outros desenvolvedores sobre certas
consequências. Por exemplo. o comentário abaixo explica
porque um caso de teste em particular está desabilitado.
Mesmos assim sempre existem outras possibilidades.
// Teste está comentado porque demorar muito para ser testado, só execute se tiver tempo.
//
// @Test
// public void verificaPessoasCpfInvalidoTest() {
// //Implementação
// }
@Test
@Ignore("Só execute se tiver tempo")
public void verificaPessoasCpfInvalidoTest() {
//Implementação
}
Comentários: Comentários TODO
Às vezes é cabível deixar notas “TODO” em comentários. TODO
explica por que a função tem uma implementação degradante
ou um ponte de revisão. Vale lembrar que existem outras formas
de prever isso como ferramentas de revisão de código.
Comentários: Javadocs em APIs públicas
Não há nada tão prático e satisfatório como uma API pública
bem descrita. Os Javados para a biblioteca Java padrão são um
exemplo. Mesmo com um código ruim é possível usar seus
artefatos.
Comentários: Comentários ruins
A maioria dos comentários está nessa categoria. Geralmente
eles são suportes ou desculpas para um código de baixa
qualidade ou justificativa para a falta de decisões.
Comentários: Comentários enganadores
Às vezes, com as melhores intenções, um desenvolvedor faz uma
afirmação não muito clara em seus comentários. Lembre-se: se
vai escrevê-los, invista tempo e escreva-os bem.
Comentários: Comentários imperativos
É basicamente tolo ter uma regra dizendo que todo artefato
deve ter um Javadoc. Isso muitas vezes é redundante, torna o
código mais complexo e desorganizado e muitas vezes aumenta
em muito o custo do desenvolvimento.
Comentários: Comentários ruidosos
Às vezes você vê comentários que nada são além de “chiados”.
Eles dizem o óbvio.
/**
* Recupera o código da pessoa.
*
* @return Código da pessoa.
*/
public Long getCodigoPessoa(){
this.codigoPessoa;
}
Comentários: Evite comentários se é possível usar uma
função ou uma variável
Às vezes podemos usar funções ou variáveis bem nomeadas ao
invés de comentários.
Oque você preferiria ver?
private void editarPessoa(Pessoa pessoa) {
//Verifica se pessoa existe
if (pessoa.getCodigo() == null
|| pessoa.getCodigo() < 1
|| this.pessoaDao.pessoaExiste(pessoa.getCodigo())) {
//Lança erro informando que pessoa não existe.
}
this.pessoaDao.salvarPessoa(pessoa);
}
Comentários: Evite comentários se é possível usar uma
função ou uma variável
Ou isso?
private void editarPessoa(Pessoa pessoa) {
if (this.verificaExistenciaPessoa(pessoa)) {
//Lança erro informando que pessoa não existe.
}
this.pessoaDao.salvarPessoa(pessoa);
}
Comentários: Créditos e autoria
Os sistemas de controle e versionamento de código são muito
bons para lembrar quem alterou ou adicionou algo ao código.
Não há necessidade de poluir o código com isso.
/* Adicionar por André Justi */
Comentários: E agora?
Aonde devemos usar comentários e Javadocs?
Livro - código limpo caps (3,4) (clean code)

Mais conteúdo relacionado

Mais procurados

Introdução ao GitHub e Git
Introdução ao GitHub  e GitIntrodução ao GitHub  e Git
Introdução ao GitHub e GitIgor Steinmacher
 
Programação Orientação a Objetos - Herança
Programação Orientação a Objetos - HerançaProgramação Orientação a Objetos - Herança
Programação Orientação a Objetos - HerançaDaniel Brandão
 
Programação Orientada a Objetos
Programação Orientada a ObjetosProgramação Orientada a Objetos
Programação Orientada a ObjetosIgor Takenami
 
Java orientação a objetos (variaveis de instancia e metodos)
Java   orientação a objetos (variaveis de instancia e metodos)Java   orientação a objetos (variaveis de instancia e metodos)
Java orientação a objetos (variaveis de instancia e metodos)Armando Daniel
 
Introducing Clean Architecture
Introducing Clean ArchitectureIntroducing Clean Architecture
Introducing Clean ArchitectureRoc Boronat
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean ArchitectureBadoo
 
Codigo limpo: Nomes Significativos Cap 2
Codigo limpo:  Nomes Significativos Cap 2Codigo limpo:  Nomes Significativos Cap 2
Codigo limpo: Nomes Significativos Cap 2Inael Rodrigues
 
Clean architecture
Clean architectureClean architecture
Clean architectureLieven Doclo
 
Introduction to Java 8
Introduction to Java 8Introduction to Java 8
Introduction to Java 8Knoldus Inc.
 
Spring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosSpring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosphelypploch
 
Encapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosEncapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosDaniel Brandão
 
Poo1 aula 1 - java - história e introdução
Poo1   aula 1 - java -  história e introduçãoPoo1   aula 1 - java -  história e introdução
Poo1 aula 1 - java - história e introduçãoDenis Sobrenome
 
Aula 5 encapsulamento, associação, polimorfismo, interfaces
Aula 5   encapsulamento, associação, polimorfismo, interfacesAula 5   encapsulamento, associação, polimorfismo, interfaces
Aula 5 encapsulamento, associação, polimorfismo, interfacesRafael Pinheiro
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Younghan Kim
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Helder da Rocha
 

Mais procurados (20)

Introdução ao GitHub e Git
Introdução ao GitHub  e GitIntrodução ao GitHub  e Git
Introdução ao GitHub e Git
 
POO - 16 - Polimorfismo
POO - 16 - PolimorfismoPOO - 16 - Polimorfismo
POO - 16 - Polimorfismo
 
Curso de Node JS Básico
Curso de Node JS BásicoCurso de Node JS Básico
Curso de Node JS Básico
 
Programação Orientação a Objetos - Herança
Programação Orientação a Objetos - HerançaProgramação Orientação a Objetos - Herança
Programação Orientação a Objetos - Herança
 
Programação Orientada a Objetos
Programação Orientada a ObjetosProgramação Orientada a Objetos
Programação Orientada a Objetos
 
Java orientação a objetos (variaveis de instancia e metodos)
Java   orientação a objetos (variaveis de instancia e metodos)Java   orientação a objetos (variaveis de instancia e metodos)
Java orientação a objetos (variaveis de instancia e metodos)
 
Java 8 features
Java 8 featuresJava 8 features
Java 8 features
 
Introducing Clean Architecture
Introducing Clean ArchitectureIntroducing Clean Architecture
Introducing Clean Architecture
 
POO - Aula 1
POO - Aula 1POO - Aula 1
POO - Aula 1
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Codigo limpo: Nomes Significativos Cap 2
Codigo limpo:  Nomes Significativos Cap 2Codigo limpo:  Nomes Significativos Cap 2
Codigo limpo: Nomes Significativos Cap 2
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
Introduction to Java 8
Introduction to Java 8Introduction to Java 8
Introduction to Java 8
 
Spring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosSpring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutos
 
Encapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosEncapsulamento em Orientação a Objetos
Encapsulamento em Orientação a Objetos
 
Poo1 aula 1 - java - história e introdução
Poo1   aula 1 - java -  história e introduçãoPoo1   aula 1 - java -  história e introdução
Poo1 aula 1 - java - história e introdução
 
Aula 5 encapsulamento, associação, polimorfismo, interfaces
Aula 5   encapsulamento, associação, polimorfismo, interfacesAula 5   encapsulamento, associação, polimorfismo, interfaces
Aula 5 encapsulamento, associação, polimorfismo, interfaces
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑
 
POO - 17 - Interfaces
POO - 17 - InterfacesPOO - 17 - Interfaces
POO - 17 - Interfaces
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)
 

Destaque

Guidocondoripañuni+#inf
Guidocondoripañuni+#infGuidocondoripañuni+#inf
Guidocondoripañuni+#infguido condori
 
Global prevalence of autism and other pervasive developmental disorders
Global prevalence of autism and other pervasive developmental disordersGlobal prevalence of autism and other pervasive developmental disorders
Global prevalence of autism and other pervasive developmental disordersCristian Sepulveda Zuñiga
 
USO DO GEOGEBRA 3D PARA O ENSINO DE POLIEDROS
USO DO GEOGEBRA 3D PARA O ENSINO DE POLIEDROSUSO DO GEOGEBRA 3D PARA O ENSINO DE POLIEDROS
USO DO GEOGEBRA 3D PARA O ENSINO DE POLIEDROSWendel Silva
 
Word 2 tha mutha.pt.279
Word 2 tha mutha.pt.279Word 2 tha mutha.pt.279
Word 2 tha mutha.pt.279M-Rod
 
ARQUITECTURA BÁSICA DE UNA COMPUTADORA
  ARQUITECTURA BÁSICA DE UNA COMPUTADORA  ARQUITECTURA BÁSICA DE UNA COMPUTADORA
ARQUITECTURA BÁSICA DE UNA COMPUTADORArukapreca
 
биотски фактори
биотски факторибиотски фактори
биотски факториFilip Stojkov
 
Filosofia – Epistemologia moderna
Filosofia – Epistemologia modernaFilosofia – Epistemologia moderna
Filosofia – Epistemologia modernaVictor Cruz
 
Fluxograma filosofia
Fluxograma filosofiaFluxograma filosofia
Fluxograma filosofiakatiagomes89
 
O que é Conhecimento
O que é ConhecimentoO que é Conhecimento
O que é Conhecimentoalbiofabian
 
Apresentação Habermas - Pedagogia
Apresentação Habermas - PedagogiaApresentação Habermas - Pedagogia
Apresentação Habermas - Pedagogiapaulacod_pedagogia
 
Introdução à Teoria do Conhecimento
Introdução à Teoria do ConhecimentoIntrodução à Teoria do Conhecimento
Introdução à Teoria do ConhecimentoCursoDeFerias
 
O que é conhecimento - filosofia
O que é conhecimento - filosofiaO que é conhecimento - filosofia
O que é conhecimento - filosofiaMarcelo Avila
 
Epistemologia Genética de Jean Piaget
Epistemologia Genética de Jean PiagetEpistemologia Genética de Jean Piaget
Epistemologia Genética de Jean PiagetLucila Pesce
 
O conhecimento slides
O conhecimento   slidesO conhecimento   slides
O conhecimento slidesUFMS
 

Destaque (20)

Guidocondoripañuni+#inf
Guidocondoripañuni+#infGuidocondoripañuni+#inf
Guidocondoripañuni+#inf
 
Global prevalence of autism and other pervasive developmental disorders
Global prevalence of autism and other pervasive developmental disordersGlobal prevalence of autism and other pervasive developmental disorders
Global prevalence of autism and other pervasive developmental disorders
 
USO DO GEOGEBRA 3D PARA O ENSINO DE POLIEDROS
USO DO GEOGEBRA 3D PARA O ENSINO DE POLIEDROSUSO DO GEOGEBRA 3D PARA O ENSINO DE POLIEDROS
USO DO GEOGEBRA 3D PARA O ENSINO DE POLIEDROS
 
Word 2 tha mutha.pt.279
Word 2 tha mutha.pt.279Word 2 tha mutha.pt.279
Word 2 tha mutha.pt.279
 
Test for proportion
Test for proportionTest for proportion
Test for proportion
 
T distribution
T distributionT distribution
T distribution
 
ARQUITECTURA BÁSICA DE UNA COMPUTADORA
  ARQUITECTURA BÁSICA DE UNA COMPUTADORA  ARQUITECTURA BÁSICA DE UNA COMPUTADORA
ARQUITECTURA BÁSICA DE UNA COMPUTADORA
 
биотски фактори
биотски факторибиотски фактори
биотски фактори
 
Epistemologia
EpistemologiaEpistemologia
Epistemologia
 
Filosofia – Epistemologia moderna
Filosofia – Epistemologia modernaFilosofia – Epistemologia moderna
Filosofia – Epistemologia moderna
 
Fluxograma filosofia
Fluxograma filosofiaFluxograma filosofia
Fluxograma filosofia
 
Epistemologia
Epistemologia Epistemologia
Epistemologia
 
O que é Conhecimento
O que é ConhecimentoO que é Conhecimento
O que é Conhecimento
 
Epistemologia
Epistemologia Epistemologia
Epistemologia
 
Apresentação Habermas - Pedagogia
Apresentação Habermas - PedagogiaApresentação Habermas - Pedagogia
Apresentação Habermas - Pedagogia
 
Introdução à Teoria do Conhecimento
Introdução à Teoria do ConhecimentoIntrodução à Teoria do Conhecimento
Introdução à Teoria do Conhecimento
 
O que é conhecimento - filosofia
O que é conhecimento - filosofiaO que é conhecimento - filosofia
O que é conhecimento - filosofia
 
Epistemologia Genética de Jean Piaget
Epistemologia Genética de Jean PiagetEpistemologia Genética de Jean Piaget
Epistemologia Genética de Jean Piaget
 
O conhecimento slides
O conhecimento   slidesO conhecimento   slides
O conhecimento slides
 
Epistemologia
EpistemologiaEpistemologia
Epistemologia
 

Semelhante a Livro - código limpo caps (3,4) (clean code)

TDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersTDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersStefan Teixeira
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao javaArmando Daniel
 
Código limpo: Funções Capítulo 3
Código limpo: Funções  Capítulo 3Código limpo: Funções  Capítulo 3
Código limpo: Funções Capítulo 3Inael Rodrigues
 
Apostila ph pwamp_parte5
Apostila ph pwamp_parte5Apostila ph pwamp_parte5
Apostila ph pwamp_parte5Ilton Barbosa
 
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
 
Apostila PhP com Wamp, 4a Parte
Apostila PhP com Wamp, 4a ParteApostila PhP com Wamp, 4a Parte
Apostila PhP com Wamp, 4a ParteIlton Barbosa
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade IIIJoão Lourenço
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Luís Cobucci
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Introdução à programação funcional
Introdução à programação funcionalIntrodução à programação funcional
Introdução à programação funcionalGabriel Schade Cardoso
 
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
 
Apostila PhP com Wamp 3a Parte
Apostila PhP com Wamp 3a ParteApostila PhP com Wamp 3a Parte
Apostila PhP com Wamp 3a ParteIlton Barbosa
 
Testando Rails apps com RSpec
Testando Rails apps com RSpecTestando Rails apps com RSpec
Testando Rails apps com RSpecNando Vieira
 

Semelhante a Livro - código limpo caps (3,4) (clean code) (20)

TDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersTDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para Testers
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
 
Código limpo: Funções Capítulo 3
Código limpo: Funções  Capítulo 3Código limpo: Funções  Capítulo 3
Código limpo: Funções Capítulo 3
 
Apostila ph pwamp_parte5
Apostila ph pwamp_parte5Apostila ph pwamp_parte5
Apostila ph pwamp_parte5
 
Shell script
Shell script Shell script
Shell script
 
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
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
 
Apostila PhP com Wamp, 4a Parte
Apostila PhP com Wamp, 4a ParteApostila PhP com Wamp, 4a Parte
Apostila PhP com Wamp, 4a Parte
 
Aula5
Aula5Aula5
Aula5
 
Clean Code
Clean CodeClean Code
Clean Code
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade III
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Aula2
Aula2Aula2
Aula2
 
Introdução à programação funcional
Introdução à programação funcionalIntrodução à programação funcional
Introdução à programação funcional
 
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
 
Aula javascript
Aula  javascriptAula  javascript
Aula javascript
 
Apostila PhP com Wamp 3a Parte
Apostila PhP com Wamp 3a ParteApostila PhP com Wamp 3a Parte
Apostila PhP com Wamp 3a Parte
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Testando Rails apps com RSpec
Testando Rails apps com RSpecTestando Rails apps com RSpec
Testando Rails apps com RSpec
 

Mais de André Justi

Grupo de estudo - Kotlin
Grupo de estudo - KotlinGrupo de estudo - Kotlin
Grupo de estudo - KotlinAndré Justi
 
Treinamento Docker Básico
Treinamento Docker BásicoTreinamento Docker Básico
Treinamento Docker BásicoAndré Justi
 
Apresentação Docker
Apresentação DockerApresentação Docker
Apresentação DockerAndré Justi
 
Apresentação maven
Apresentação mavenApresentação maven
Apresentação mavenAndré Justi
 

Mais de André Justi (6)

Java VS Kotlin
Java VS KotlinJava VS Kotlin
Java VS Kotlin
 
Grupo de estudo - Kotlin
Grupo de estudo - KotlinGrupo de estudo - Kotlin
Grupo de estudo - Kotlin
 
Intro à Graphql
Intro à GraphqlIntro à Graphql
Intro à Graphql
 
Treinamento Docker Básico
Treinamento Docker BásicoTreinamento Docker Básico
Treinamento Docker Básico
 
Apresentação Docker
Apresentação DockerApresentação Docker
Apresentação Docker
 
Apresentação maven
Apresentação mavenApresentação maven
Apresentação maven
 

Livro - código limpo caps (3,4) (clean code)

  • 1. Grupo de Estudos SAJ-ADV Tema: Livro Clean Code (Código Limpo) de Robert Martin Capítulos 3 e 4 Apresentado por: André Justi Grupo de Estudos SAJ-ADV Tema: Livro Clean Code (Código Limpo) de Robert Martin Capítulos 3 e 4 Apresentado por: André Justi 08/01/2014
  • 2. Agenda • Capitulo 3: Funções • Capitulo 4: Comentários
  • 3. Funções “Nos primórdios da programação, formávamos nossos sistemas com rotinas e sub-rotinas. Já na era do Fortran e do PL/1, usávamos programas, subprogramas e funções. De tudo isso, apenas função prevaleceu. As funções são a primeira linha de organização em qualquer programa.”
  • 4. Funções: Pequenas A primeira regra para funções é que elas devem ser pequenas. A segunda é que a primeira regra nunca deve ser quebrada. Com pouca experiência podemos perceber que é muito mais fácil dar manutenção, refatorar, documentar e aplicar testes em funções pequenas. Segundo Robert Martin funções devem ter entre 1 a 5 linhas.
  • 5. Funções: Blocos e endentação Entro de instruções como if, else, while, for e outros. Devem ter apenas uma linha. Possivelmente uma chamada de outra função. Além de manter a função pequena, isso adiciona um valor significativo, pois a função chamada de entro do bloco pode receber um nome descritivo, isso também implica que que as funções não devem ter estruturas aninhadas. Portanto, o nível de endentação de uma função deve ser de, no máximo, um ou dois níveis. Isso, é claro, facilita a leitura e compreensão da funções.
  • 6. Funções: Blocos e endentação Exemplo ruim: private List<String> convertePessoasJaxbParaXml(List<Pessoa> pessoas) { List<String> pessoaXmls = new ArrayList<>(); for (Pessoa pessoa : pessoas) { Writer writer = new StringWriter(); try { JAXB.marshal(pessoa, writer); pessoaXmls.add(writer.toString()); } catch (DataBindingException dataBindingException) { throw new HttpErroAoConverterObjetoJaxbParaConteudo(dataBindingException); } finally { IOUtils.closeQuietly(writer); } } return pessoaXmls;
  • 7. Funções: Blocos e endentação Exemplo bom(Refatorado): private List<String> convertePessoasJaxbParaXml(List<Pessoa> pessoas) { List<String> pessoaXmls = new ArrayList<>(); for (Pessoa pessoa : pessoas) { String pessoaXml = this.parsePessoaJaxbParaXml(pessoa); pessoaXmls.add(pessoaXml); } return pessoaXmls; }
  • 8. Funções: Faça apenas uma coisa As funções devem fazer apenas uma coisa e devem cumprir bem o objetivo para o qual são destinadas. O problema dessa declaração é que é difícil saber o que é “uma coisa”.
  • 9. Funções: Faça apenas uma coisa Pense no seguinte cenário: 1. Determina se a página é de teste; 2. Se for, inclui o setUps; 3. Exibe a página em HTML. Essa descrição é uma ou são três coisas? Se uma função faz apenas uma série de passos de forma declarativa, então ela está fazendo uma só coisa. Apesar de tudo o motivo para criarmos função consiste em decompor um conceito maior (em outras palavras, o nome da função) em uma série de passos no próximo nível de abstração.
  • 10. Funções: Um nível de abstração por função A fim de certificarmos que nossas funções estão fazendo "uma coisa", precisamos ter certeza de que toda lógica dentro da nossa função são todos no mesmo nível de abstração. É fácil ver como o próximo exemplo viola essa regra. Existem conceitos de lá que estão em um nível muito alto de abstração, como “converter o conteúdo dos todos objetos em uma lista de String em XML” outros que estão em um nível baixo de abstração, como: “fazer a conversão em si e tratar os possíveis erros”.
  • 11. Funções: Um nível de abstração por função Misturar níveis de abstração dentro de uma função torna as coisas confusas. Quem está lendo o código não é capaz de dizer se uma determinada expressão é um conceito essencial ou um detalhe. private List<String> convertePessoasJaxbParaXml(List<Pessoa> pessoas) { List<String> pessoaXmls = new ArrayList<>(); for (Pessoa pessoa : pessoas) { Writer writer = new StringWriter(); try { JAXB.marshal(pessoa, writer); pessoaXmls.add(writer.toString()); } catch (DataBindingException dataBindingException) { throw new HttpErroAoConverterObjetoJaxbParaConteudo(dataBindingException); } finally { IOUtils.closeQuietly(writer); } } return pessoaXmls;
  • 12. Funções: Ler o código de cima para baixo: Regra Decrescente Uma função bem implementada pode ser lida de cima para baixo, como uma narrativa ou conjunto de tópicos. private List<PessoaJaxb> consultarPessoasPorNome(String nomePessoa, ParametrosConsulta parametrosConsulta) { validarParametrosConsultas(parametrosConsulta); List<Pessoa> pessoas = this.pessoaDao.consultarPessoasPorNome(nomePessoa, parametrosConsulta); List<PessoaJaxb> pessoasJaxb = converterPessoasParaPessoasJaxb(pessoas); return pessoasJaxb; }
  • 13. Funções: Use nomes descritivos Não devemos ter medo de fazer uma função com nome longo. Um nome longo e descritivo é melhor do que um curto e enigmático. Um nome longo também é melhor do que um comentário longo descritivo. Seja consistente em seus nomes. Use as mesmas frases (palavras conceito/chave) em outros módulos para criar uma convenção. Isso permite que tenhamos uma de fácil dedução da função.
  • 14. Funções: Parâmetros de funções Sempre devemos usar um numero pequeno de parâmetros tentando não ultrapassar 3 parâmetros. Um numero menor de parâmetro também facilita o entendimento da função e testes em cima dela. Funções com muitos parâmetros exigem inúmeros testes, por existem inúmeras possibilidades.
  • 15. Funções: Parâmetros lógicos Essa forma é ruim. Passar um booleano para um função certamente é uma má pratica, isso mostra explicitamente que a função faz mais de uma coisa. Normalmente uma se o parâmetro for verdadeiro e outra se o parâmetro for falso.
  • 16. Funções: Evite efeitos colaterais Os efeitos colaterais são mentiras. Sua função promete fazer uma coisa, mas ele também faz outra. Às vezes ele vai fazer mudanças inesperadas em variáveis ??da própria classe. Às vezes ele vai fazer mudanças inesperadas em parâmetros passados na função ou parâmetros globais da aplicação. Em ambos os casos elas são "verdades" enganosas e prejudiciais, que geralmente resultam em comportamentos estranhos.
  • 17. Funções: Separação comando/consulta As funções devem fazer ou responder algo, mas não ambos. Sua função ou altera o estado de um objeto ou retorna informações sobre ele. Efetuar as duas tarefas costuma gerar confusão.
  • 18. Funções: Evite repetição Evite sempre a repetição. Sempre que uma função ou parte se repetir, torne elas comuns ou extraia apenas o bloco repetido para outra função comum.
  • 19. Comentários “Não insira cometários em um código ruim, reescreva-o”. - Brian W. Kernighan Nada pode ser tão útil quanto um comentário bem colocado, nada consegue ser tão prejudicial quanto um velho comentário mal feito e que fala mentiras e informações incorretas.
  • 20. Comentários: Comentários compensam um código ruim Uma das motivações mais comuns para criar cometários é um código ruim, construímos um módulo e sabemos que está confuso e desorganizado. Estamos cientes da bagunça. Nós mesmos dizemos “Oh é melhor inserir um comentário!”. Não... acredite é melhor para e limpar a bagunça.
  • 21. Comentários: Explique-se no código Certamente há vezes em que não é possível expressar-se direto no código. Infelizmente, devido a isso, muitos desenvolvedores assumiram que o código raramente é, se é que possa ser, um bom meio para se explicar. Evidentemente isso é falso.
  • 22. Comentários: Explique-se no código Oque você preferiria ver? private void editarPessoa(Pessoa pessoa) { if (pessoa == null || pessoa.getCodigo() == null || pessoa.getCodigo() < 1 || this.pessoaDao.pessoaExiste(pessoa.getCodigo())) { //Lança erro informando que pessoa não existe. } this.pessoaDao.salvarPessoa(pessoa); }
  • 23. Comentários: Explique-se no código Ou isso? private void editarPessoa(Pessoa pessoa) { if (this.verificaExistenciaPessoa(pessoa)) { //Lança erro informando que pessoa não existe. } this.pessoaDao.salvarPessoa(pessoa); } private boolean verificaExistenciaPessoa(Pessoa pessoa) { if (pessoa == null) { return false; } Long codigoPessoa = pessoa.getCodigo(); if (pessoa.getCodigo() == null || pessoa.getCodigo() < 1) { return false; } return this.pessoaDao.pessoaExiste(pessoa.getCodigo()); }
  • 24. Comentários: Comentários informativos Às vezes é pratico fornecer informações básicas em um comentário. /** Regex para identificação do parâmetro 'import' da tag page com case insensitive. */ private static final String REGEX_PARAMETER_IMPORT = "(?i)import=["'].+?(["'])";
  • 25. Comentários: Alerta sobre consequências Às vezes é útil alertar outros desenvolvedores sobre certas consequências. Por exemplo. o comentário abaixo explica porque um caso de teste em particular está desabilitado. Mesmos assim sempre existem outras possibilidades. // Teste está comentado porque demorar muito para ser testado, só execute se tiver tempo. // // @Test // public void verificaPessoasCpfInvalidoTest() { // //Implementação // } @Test @Ignore("Só execute se tiver tempo") public void verificaPessoasCpfInvalidoTest() { //Implementação }
  • 26. Comentários: Comentários TODO Às vezes é cabível deixar notas “TODO” em comentários. TODO explica por que a função tem uma implementação degradante ou um ponte de revisão. Vale lembrar que existem outras formas de prever isso como ferramentas de revisão de código.
  • 27. Comentários: Javadocs em APIs públicas Não há nada tão prático e satisfatório como uma API pública bem descrita. Os Javados para a biblioteca Java padrão são um exemplo. Mesmo com um código ruim é possível usar seus artefatos.
  • 28. Comentários: Comentários ruins A maioria dos comentários está nessa categoria. Geralmente eles são suportes ou desculpas para um código de baixa qualidade ou justificativa para a falta de decisões.
  • 29. Comentários: Comentários enganadores Às vezes, com as melhores intenções, um desenvolvedor faz uma afirmação não muito clara em seus comentários. Lembre-se: se vai escrevê-los, invista tempo e escreva-os bem.
  • 30. Comentários: Comentários imperativos É basicamente tolo ter uma regra dizendo que todo artefato deve ter um Javadoc. Isso muitas vezes é redundante, torna o código mais complexo e desorganizado e muitas vezes aumenta em muito o custo do desenvolvimento.
  • 31. Comentários: Comentários ruidosos Às vezes você vê comentários que nada são além de “chiados”. Eles dizem o óbvio. /** * Recupera o código da pessoa. * * @return Código da pessoa. */ public Long getCodigoPessoa(){ this.codigoPessoa; }
  • 32. Comentários: Evite comentários se é possível usar uma função ou uma variável Às vezes podemos usar funções ou variáveis bem nomeadas ao invés de comentários. Oque você preferiria ver? private void editarPessoa(Pessoa pessoa) { //Verifica se pessoa existe if (pessoa.getCodigo() == null || pessoa.getCodigo() < 1 || this.pessoaDao.pessoaExiste(pessoa.getCodigo())) { //Lança erro informando que pessoa não existe. } this.pessoaDao.salvarPessoa(pessoa); }
  • 33. Comentários: Evite comentários se é possível usar uma função ou uma variável Ou isso? private void editarPessoa(Pessoa pessoa) { if (this.verificaExistenciaPessoa(pessoa)) { //Lança erro informando que pessoa não existe. } this.pessoaDao.salvarPessoa(pessoa); }
  • 34. Comentários: Créditos e autoria Os sistemas de controle e versionamento de código são muito bons para lembrar quem alterou ou adicionou algo ao código. Não há necessidade de poluir o código com isso. /* Adicionar por André Justi */
  • 35. Comentários: E agora? Aonde devemos usar comentários e Javadocs?