SlideShare uma empresa Scribd logo
1 de 31
qualidade
Escrevendo código limpo
Sumário
Escrevendo Código Limpo | LidianeTaquehara
Introdução
Nomes Significativos
Funções
Comentários
Formatação
Introdução
Escrevendo Código Limpo | LidianeTaquehara
O Que é Código Limpo?
Introdução
Escrevendo Código Limpo | LidianeTaquehara
private void btnProb_Click(object sender, RoutedEventArgs e) {
double dQ = 1 - dPSucesso;
double X = double.Parse(tbX.Text);
double dNMenosX = dN-dX;
int i, iNFat=1, iXFat=1, iNMenoxXFat=1;
for (i = 1; i <= dN; i++) {
iNFat = iNFat * i;
}
for (i = 1; i <= dX; i++) {
iXFat = iXFat * i;
}
for (i = 1; i <= dNMenosX; i++) {
iNMenoxXFat = iNMenoxXFat * i;
}
double dProb = ((iNFat) / (iXFat * iNMenoxXFat)) *
(Math.Pow(dPSucesso, dX)) * (Math.Pow(dQ, dNMenosX));
tbProb.Text = Math.Round((dProb * 100), 2).ToString() + " %";
}
Introdução
Escrevendo Código Limpo | LidianeTaquehara
private void btnProb_Click(object sender, RoutedEventArgs e) {
double dQ = 1 - dPSucesso;
double X = double.Parse(tbX.Text);
double dNMenosX = dN-dX;
int i, iNFat=1, iXFat=1, iNMenoxXFat=1;
for (i = 1; i <= dN; i++) {
iNFat = iNFat * i;
}
for (i = 1; i <= dX; i++) {
iXFat = iXFat * i;
}
for (i = 1; i <= dNMenosX; i++) {
iNMenoxXFat = iNMenoxXFat * i;
}
double dProb = ((iNFat) / (iXFat * iNMenoxXFat)) *
(Math.Pow(dPSucesso, dX)) * (Math.Pow(dQ, dNMenosX));
tbProb.Text = Math.Round((dProb * 100), 2).ToString() + " %";
}
Introdução
Escrevendo Código Limpo | LidianeTaquehara
5s seiri :: ordenação
seiton :: organização
seiso :: limpeza
seiketsu :: padronização
shitsuke :: disciplina
Escrevendo Código Limpo | LidianeTaquehara
Mais
tarde
Nunca
Introdução
Produtividade vs. Tempo
Escrevendo Código Limpo | LidianeTaquehara
Utilize nomes que revelem a intenção
Escrevendo Código Limpo | LidianeTaquehara
int d; // tempo decorrido em dias
int tempoDecorridoEmDias;
int diasAposCriacao;
int diasAposModificacao;
Faça distinções significativas
Escrevendo Código Limpo | LidianeTaquehara
public static void copiarCaracteres(char
a1[], char a2[]) {
for (int i = 0; i < a1.length; i++) {
a2[i] = a1[i];
}
}
Faça distinções significativas
Escrevendo Código Limpo | LidianeTaquehara
public static void copiarCaracteres(char
origem[], char destino[]) {
for (int i = 0; i < origem.length;
i++) {
destino[i] = origem[i];
}
}
Escrevendo Código Limpo | LidianeTaquehara
Funções
Devem executar uma ação
Devem executá-la bem
Devem executar somente isso
Funções devem executar uma única ação
Escrevendo Código Limpo | LidianeTaquehara
public static String
renderizarPaginaComConfiguracoes(PageDate
pageData, boolean isSuite) throws Exception
{
if (eUmaPaginaTeste(pageData))
incluirConfiguracoes(pageData, isSuite);
return pageData.getHTML();
}
Comentários
Escrevendo Código Limpo | LidianeTaquehara
“Não comente código ruim – reescreva-o.”
- BrianW. Kernighan e P. J. Plaugher
Comentários servem para compensar o nosso
fracasso ao nos expressarmos em código.
Se expresse em código
Escrevendo Código Limpo | LidianeTaquehara
// Checar se o funcionário é elegível
// para receber benefícios
if (funcionario.flags & FLAG_HORA) &&
(salario.idade > 65)
if (funcionario.eElegivelParaBeneficios())
Escrevendo Código Limpo | LidianeTaquehara
Comentários Legais
Comentários Informativos
Explicação de intenção
Esclarecimento
Aviso de Consequência
Comentários Bons
Amplificação
Javadocs em APIs públicas
Comentários Legais
Escrevendo Código Limpo | LidianeTaquehara
// Copyright (C) 2003 , 2004, 2005 by Object Mentor,
// Inc. All rights reserved.
// Release under the terms of the GNU General Public
// License version 2 or later.
Comentários Informativos
// formato kk:mm:ss EEE, MMM dd, YYYY
Pattern timeMatcher = Pattern.compile(
“d*:d*:d* w*, w* d*, d*”);
Escrevendo Código Limpo | LidianeTaquehara
Esclarecimento
public void test CompareTo() throws Exception
{
WikiPagePath a = PathParser.parse(“PageA”);
WikiPagePath b = PathParser.parse(“PageB”);
assertTrue (a.compareTo(a) == 0); // a == a
assertTrue (a.compareTo(b) != 0); // a != b
assertTrue (a.compareTo(b) == -1); // a < b
assertTrue (b.compareTo(a) == 1); // b > a
}
Escrevendo Código Limpo | LidianeTaquehara
Comentários Redundantes
Marcadores de posição
Encerramento de chaves
Código comentado
Comentários HTML
Comentários Ruins
Informações em excesso
Cabeçalhos de função
Escrevendo Código Limpo | LidianeTaquehara
Comentários redundantes
// Método utilitário que retorna quando
// this.close é verdadeiro.
// Lança uma exceção em caso de timeout.
public synchronized void waitForClose (final
long timeoutMilis) throws Exception {
if (!closed) {
wait(timeoutMilis);
if (!closed)
throw new Exception(“MockResponseSender
não pôde ser encerrado”);
}
}
Marcadores de posição
Escrevendo Código Limpo | LidianeTaquehara
// Ações //////////////////////////////
Código comentado
InputStreamResponse response = new InputStreamResponse();
response.setBody(formatter.getResulStream(),
formatter.getByteCount())
// InputStream resultsStream = formatter.getResultStream();
// StreamReader reader = new StreamReader(resultsStream);
//response.setContent(reader.read(formatter.getByteCount()));
Escrevendo Código Limpo | LidianeTaquehara
Tamanho do arquivo
Formatação vertical
Escrevendo Código Limpo | LidianeTaquehara
package fitnesse.wikitext.widgets;
import java.util.regex.*;
public class BoldWidget extends ParentWidget {
public static final String REGEXP = “ ‘’’.+?’’’ ”;
private static final Pattern pattern =
Pattern.compile(“ ‘’’ (.+?) ‘’’ ”,
Pattern.MULTILINE + Pattern.DOTALL);
public BoldWidget (ParentWidget parent, String
text) throws Exception {
super(parent);
Matcher match = pattern.matcher(text);
match.find();
addChildWidgets(match.group(1));}
}
EspaçoVertical Entre Conceitos
Escrevendo Código Limpo | LidianeTaquehara
EspaçoVertical Entre Conceitos
package fitnesse.wikitext.widgets;
import java.util.regex.*;
public class BoldWidget extends ParentWidget {
public static final String REGEXP = “ ‘’’.+?’’’ ”;
private static final Pattern pattern =
Pattern.compile(“ ‘’’ (.+?) ‘’’ ”,
Pattern.MULTILINE + Pattern.DOTALL
);
public BoldWidget (ParentWidget parent, String text)
throws Exception {
super(parent);
Matcher match = pattern.matcher(text);
match.find();
addChildWidgets(match.group(1));
}
}
Escrevendo Código Limpo | LidianeTaquehara
DensidadeVertical
public class ReporterConfig {
/**
* The class name of the reporter listener
*/
private String m_className;
/**
* The properties of the reporter listener
*/
private List<Property> m_properties = new
ArrayList<Property>();
public void addProperty(Property property) {
m_properties.add(property);
}
}
Escrevendo Código Limpo | LidianeTaquehara
DensidadeVertical
public class ReporterConfig {
private String m_className;
private List<Property> m_properties = new
ArrayList<Property>();
public void addProperty(Property property) {
m_properties.add(property);
}
}
Escrevendo Código Limpo | LidianeTaquehara
“Largura” do arquivo
Formatação horizontal
Escrevendo Código Limpo | Lidiane Taquehara
Espaço Horizontal
private void measureLine(String line) {
lineCount++;
int lineSize = line.length();
totalChars += lineSize;
lineWidthHistogram.addLine(lineSize,
lineCount);
recordWidestLine(lineSize);
}
Escrevendo Código Limpo | LidianeTaquehara
Espaço Horizontal
public class Quadratic {
public static double root1(double a, double b,
double c) {
double determinant = determinant(a, b, c);
return (-b + Math.sqrt(determinant)) / (2*a);
}
public static double root2(int a, int b, int c) {
double determinant = determinant(int a, int b,
int c);
return (-b – Math.sqrt(determinant)) / (2*a);
}
private static double determinant(double a, double
b, double c) {
return b*b – 4*a*c;
}
}
Referência
Clean Code
A Handbook of Agile
Software Craftmanship
Robert C. Martin
Escrevendo Código Limpo | Lidiane Taquehara
lmayra@caiena.net

Mais conteúdo relacionado

Semelhante a Qualidade de Software: Escrevendo Código Limpo

Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Luis Gustavo Almeida
 
Funções inline e Recursivas
Funções inline e RecursivasFunções inline e Recursivas
Funções inline e RecursivasKadzuwa Kuyeri
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4CDS
 
BDD in .NET projects
BDD in .NET projectsBDD in .NET projects
BDD in .NET projectsrodrigodealer
 
Minicurso kotlin no desenvolvimento mobile - UTFPR
Minicurso kotlin no desenvolvimento mobile - UTFPRMinicurso kotlin no desenvolvimento mobile - UTFPR
Minicurso kotlin no desenvolvimento mobile - UTFPRLucas Antonio Ramos Sartori
 
AspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em JavaAspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em Javaelliando dias
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoPaulo Morgado
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaEduardo Bregaida
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOLgrupoweblovers
 
Minicurso de Django - Desenvolvimento ágil web com Django e Python
Minicurso de Django - Desenvolvimento ágil web com Django e PythonMinicurso de Django - Desenvolvimento ágil web com Django e Python
Minicurso de Django - Desenvolvimento ágil web com Django e PythonGuilherme Garcia
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Minicurso Python
Minicurso PythonMinicurso Python
Minicurso Pythonguestac3de
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoronaldoferraz
 
aula09-redux-firebase-auth.pdf
aula09-redux-firebase-auth.pdfaula09-redux-firebase-auth.pdf
aula09-redux-firebase-auth.pdfBrunoTorres978388
 

Semelhante a Qualidade de Software: Escrevendo Código Limpo (20)

Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
 
Introdução ao C#
Introdução ao C#Introdução ao C#
Introdução ao C#
 
Funções inline e Recursivas
Funções inline e RecursivasFunções inline e Recursivas
Funções inline e Recursivas
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4
 
BDD in .NET projects
BDD in .NET projectsBDD in .NET projects
BDD in .NET projects
 
Minicurso kotlin UTFPR
Minicurso kotlin UTFPR Minicurso kotlin UTFPR
Minicurso kotlin UTFPR
 
Minicurso kotlin no desenvolvimento mobile - UTFPR
Minicurso kotlin no desenvolvimento mobile - UTFPRMinicurso kotlin no desenvolvimento mobile - UTFPR
Minicurso kotlin no desenvolvimento mobile - UTFPR
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
AspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em JavaAspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em Java
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPonto
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
 
Python Emsl2009
Python Emsl2009Python Emsl2009
Python Emsl2009
 
Minicurso de Django - Desenvolvimento ágil web com Django e Python
Minicurso de Django - Desenvolvimento ágil web com Django e PythonMinicurso de Django - Desenvolvimento ágil web com Django e Python
Minicurso de Django - Desenvolvimento ágil web com Django e Python
 
04_Introducao_JavaScript.pdf
04_Introducao_JavaScript.pdf04_Introducao_JavaScript.pdf
04_Introducao_JavaScript.pdf
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Minicurso Python
Minicurso PythonMinicurso Python
Minicurso Python
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programação
 
aula09-redux-firebase-auth.pdf
aula09-redux-firebase-auth.pdfaula09-redux-firebase-auth.pdf
aula09-redux-firebase-auth.pdf
 
Aula javascript
Aula  javascriptAula  javascript
Aula javascript
 

Qualidade de Software: Escrevendo Código Limpo

  • 2. Sumário Escrevendo Código Limpo | LidianeTaquehara Introdução Nomes Significativos Funções Comentários Formatação
  • 3. Introdução Escrevendo Código Limpo | LidianeTaquehara O Que é Código Limpo?
  • 4. Introdução Escrevendo Código Limpo | LidianeTaquehara private void btnProb_Click(object sender, RoutedEventArgs e) { double dQ = 1 - dPSucesso; double X = double.Parse(tbX.Text); double dNMenosX = dN-dX; int i, iNFat=1, iXFat=1, iNMenoxXFat=1; for (i = 1; i <= dN; i++) { iNFat = iNFat * i; } for (i = 1; i <= dX; i++) { iXFat = iXFat * i; } for (i = 1; i <= dNMenosX; i++) { iNMenoxXFat = iNMenoxXFat * i; } double dProb = ((iNFat) / (iXFat * iNMenoxXFat)) * (Math.Pow(dPSucesso, dX)) * (Math.Pow(dQ, dNMenosX)); tbProb.Text = Math.Round((dProb * 100), 2).ToString() + " %"; }
  • 5. Introdução Escrevendo Código Limpo | LidianeTaquehara private void btnProb_Click(object sender, RoutedEventArgs e) { double dQ = 1 - dPSucesso; double X = double.Parse(tbX.Text); double dNMenosX = dN-dX; int i, iNFat=1, iXFat=1, iNMenoxXFat=1; for (i = 1; i <= dN; i++) { iNFat = iNFat * i; } for (i = 1; i <= dX; i++) { iXFat = iXFat * i; } for (i = 1; i <= dNMenosX; i++) { iNMenoxXFat = iNMenoxXFat * i; } double dProb = ((iNFat) / (iXFat * iNMenoxXFat)) * (Math.Pow(dPSucesso, dX)) * (Math.Pow(dQ, dNMenosX)); tbProb.Text = Math.Round((dProb * 100), 2).ToString() + " %"; }
  • 6. Introdução Escrevendo Código Limpo | LidianeTaquehara 5s seiri :: ordenação seiton :: organização seiso :: limpeza seiketsu :: padronização shitsuke :: disciplina
  • 7. Escrevendo Código Limpo | LidianeTaquehara Mais tarde Nunca Introdução
  • 8. Produtividade vs. Tempo Escrevendo Código Limpo | LidianeTaquehara
  • 9. Utilize nomes que revelem a intenção Escrevendo Código Limpo | LidianeTaquehara int d; // tempo decorrido em dias int tempoDecorridoEmDias; int diasAposCriacao; int diasAposModificacao;
  • 10. Faça distinções significativas Escrevendo Código Limpo | LidianeTaquehara public static void copiarCaracteres(char a1[], char a2[]) { for (int i = 0; i < a1.length; i++) { a2[i] = a1[i]; } }
  • 11. Faça distinções significativas Escrevendo Código Limpo | LidianeTaquehara public static void copiarCaracteres(char origem[], char destino[]) { for (int i = 0; i < origem.length; i++) { destino[i] = origem[i]; } }
  • 12. Escrevendo Código Limpo | LidianeTaquehara Funções Devem executar uma ação Devem executá-la bem Devem executar somente isso
  • 13. Funções devem executar uma única ação Escrevendo Código Limpo | LidianeTaquehara public static String renderizarPaginaComConfiguracoes(PageDate pageData, boolean isSuite) throws Exception { if (eUmaPaginaTeste(pageData)) incluirConfiguracoes(pageData, isSuite); return pageData.getHTML(); }
  • 14. Comentários Escrevendo Código Limpo | LidianeTaquehara “Não comente código ruim – reescreva-o.” - BrianW. Kernighan e P. J. Plaugher Comentários servem para compensar o nosso fracasso ao nos expressarmos em código.
  • 15. Se expresse em código Escrevendo Código Limpo | LidianeTaquehara // Checar se o funcionário é elegível // para receber benefícios if (funcionario.flags & FLAG_HORA) && (salario.idade > 65) if (funcionario.eElegivelParaBeneficios())
  • 16. Escrevendo Código Limpo | LidianeTaquehara Comentários Legais Comentários Informativos Explicação de intenção Esclarecimento Aviso de Consequência Comentários Bons Amplificação Javadocs em APIs públicas
  • 17. Comentários Legais Escrevendo Código Limpo | LidianeTaquehara // Copyright (C) 2003 , 2004, 2005 by Object Mentor, // Inc. All rights reserved. // Release under the terms of the GNU General Public // License version 2 or later. Comentários Informativos // formato kk:mm:ss EEE, MMM dd, YYYY Pattern timeMatcher = Pattern.compile( “d*:d*:d* w*, w* d*, d*”);
  • 18. Escrevendo Código Limpo | LidianeTaquehara Esclarecimento public void test CompareTo() throws Exception { WikiPagePath a = PathParser.parse(“PageA”); WikiPagePath b = PathParser.parse(“PageB”); assertTrue (a.compareTo(a) == 0); // a == a assertTrue (a.compareTo(b) != 0); // a != b assertTrue (a.compareTo(b) == -1); // a < b assertTrue (b.compareTo(a) == 1); // b > a }
  • 19. Escrevendo Código Limpo | LidianeTaquehara Comentários Redundantes Marcadores de posição Encerramento de chaves Código comentado Comentários HTML Comentários Ruins Informações em excesso Cabeçalhos de função
  • 20. Escrevendo Código Limpo | LidianeTaquehara Comentários redundantes // Método utilitário que retorna quando // this.close é verdadeiro. // Lança uma exceção em caso de timeout. public synchronized void waitForClose (final long timeoutMilis) throws Exception { if (!closed) { wait(timeoutMilis); if (!closed) throw new Exception(“MockResponseSender não pôde ser encerrado”); } }
  • 21. Marcadores de posição Escrevendo Código Limpo | LidianeTaquehara // Ações ////////////////////////////// Código comentado InputStreamResponse response = new InputStreamResponse(); response.setBody(formatter.getResulStream(), formatter.getByteCount()) // InputStream resultsStream = formatter.getResultStream(); // StreamReader reader = new StreamReader(resultsStream); //response.setContent(reader.read(formatter.getByteCount()));
  • 22. Escrevendo Código Limpo | LidianeTaquehara Tamanho do arquivo Formatação vertical
  • 23. Escrevendo Código Limpo | LidianeTaquehara package fitnesse.wikitext.widgets; import java.util.regex.*; public class BoldWidget extends ParentWidget { public static final String REGEXP = “ ‘’’.+?’’’ ”; private static final Pattern pattern = Pattern.compile(“ ‘’’ (.+?) ‘’’ ”, Pattern.MULTILINE + Pattern.DOTALL); public BoldWidget (ParentWidget parent, String text) throws Exception { super(parent); Matcher match = pattern.matcher(text); match.find(); addChildWidgets(match.group(1));} } EspaçoVertical Entre Conceitos
  • 24. Escrevendo Código Limpo | LidianeTaquehara EspaçoVertical Entre Conceitos package fitnesse.wikitext.widgets; import java.util.regex.*; public class BoldWidget extends ParentWidget { public static final String REGEXP = “ ‘’’.+?’’’ ”; private static final Pattern pattern = Pattern.compile(“ ‘’’ (.+?) ‘’’ ”, Pattern.MULTILINE + Pattern.DOTALL ); public BoldWidget (ParentWidget parent, String text) throws Exception { super(parent); Matcher match = pattern.matcher(text); match.find(); addChildWidgets(match.group(1)); } }
  • 25. Escrevendo Código Limpo | LidianeTaquehara DensidadeVertical public class ReporterConfig { /** * The class name of the reporter listener */ private String m_className; /** * The properties of the reporter listener */ private List<Property> m_properties = new ArrayList<Property>(); public void addProperty(Property property) { m_properties.add(property); } }
  • 26. Escrevendo Código Limpo | LidianeTaquehara DensidadeVertical public class ReporterConfig { private String m_className; private List<Property> m_properties = new ArrayList<Property>(); public void addProperty(Property property) { m_properties.add(property); } }
  • 27. Escrevendo Código Limpo | LidianeTaquehara “Largura” do arquivo Formatação horizontal
  • 28. Escrevendo Código Limpo | Lidiane Taquehara Espaço Horizontal private void measureLine(String line) { lineCount++; int lineSize = line.length(); totalChars += lineSize; lineWidthHistogram.addLine(lineSize, lineCount); recordWidestLine(lineSize); }
  • 29. Escrevendo Código Limpo | LidianeTaquehara Espaço Horizontal public class Quadratic { public static double root1(double a, double b, double c) { double determinant = determinant(a, b, c); return (-b + Math.sqrt(determinant)) / (2*a); } public static double root2(int a, int b, int c) { double determinant = determinant(int a, int b, int c); return (-b – Math.sqrt(determinant)) / (2*a); } private static double determinant(double a, double b, double c) { return b*b – 4*a*c; } }
  • 30. Referência Clean Code A Handbook of Agile Software Craftmanship Robert C. Martin Escrevendo Código Limpo | Lidiane Taquehara