Codding standards Alfredo Goldman Baseado no padrão da Sun.

39
Codding standards Alfredo Goldman Baseado no padrão da Sun

Transcript of Codding standards Alfredo Goldman Baseado no padrão da Sun.

Page 1: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Codding standards

Alfredo Goldman

Baseado no padrão da Sun

Page 2: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Motivação

• Quem escreveu não deve ser o único a poder ler o código– Ainda mais em um sistema OO

• Regras simples (muito simples) ajudam– Algumas são bem óbvias...

• Criar um padrão (consensual) – Em parte independente da linguagem

Page 3: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Mais razões

• 80% do tempo de desenvolvimento é para manutenção;

• Quase nenhum software é mantido apenas pelo primeiro desenvolvedor;

• Convenções de código melhoram a legibilidade do código;

• Se o código fonte é fornecido com o sistema, ele deve estar bem apresentado.

Page 4: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Porém....

• Para que codding standards funcionem todos os desenvolvedores devem estar de acordo com a convenção, TODOS.

Page 5: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Resumo (baseado no padrão da sun)

• Nome dos arquivos;• Estrutura dos arquivos;• Indentação;• Comentários;• Declarações;• Comandos;• Espaços em branco;• Convenção para nomes;• Práticas (simples e saudáveis) de programação.

Page 6: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Nome dos Arquivos

• Mesmo que a linguagem não exija, use sufixos claros– ex. .java, .c, .cpp, .txt

• Use makefiles com nomes padrão:– ex: Folhamakefile

• Sempre tenha no diretório um README– este arquivo deve conter um resumo do conteúdo

do diretório

Page 7: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Estrutura dos Arquivos

• Arquivos contém seções que devem ser separadas por linhas em branco e por comentários antes de cada seção;

• Deve se evitar arquivos com mais de 2000 linhas.

Page 8: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Classes/Interfaces

• Começam com um comentário do tipo /**...*/• O comando class, ou interface• Comentários sobre a implementação /*...*/• Variáveis estáticas (em ordem de acesso)

• Variáveis da classe (public, protected, friendly,private)• Construtores• Métodos (agrupados por funcionalidade e não por escopo)

Page 9: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Indentação (é bem importante)

• Use apenas espaços (tabs = 4 espaços)• Evite linhas com mais de 80 caracteres• Regras para quebra de linha:

– quebra após vírgula;– quebra antes de operador;– quebra no maior nível possível;– alinhar a quebra com o começo da expressão do mesmo

nível;– Se ficar feio, indentar com 8 espaços.

Page 10: Codding standards Alfredo Goldman Baseado no padrão da Sun.

ExemplossomeMethod(longExpression1, longExpression2, longExpression3,

longExpression4, longExpression5);

var = someMethod1(longExpression1, someMethod2(longExpression2,

longExpression3));

longName1 = longName2 * (longName3 + longName4 - longName5) + 4 *longName6; // melhor

longName1 = longName2 * (longName3 + longName4 -longName5) + 4 *longName6; // pior

Page 11: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Exemplos// indentação tradicionalsomeMethod(int anArg, Object anotherArg, String yetAnotherArg,

Object andStillAnother) { ... }

//Indentação com 8 espaços em certos casosprivate static synchronized horkingLongMethodName(int anArg, Object anotherArg, String yetAnotherArg,

Object andStillAnother) { ...

}

Page 12: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Exemplos

// indentação tradicionalif ((condition1 && condition2) || (condition3 && condition4) ||!(condition5 && condition6)) { //BAD WRAPS doSomethingAboutIt(); //difícil de achar }

// indentação propostaif ((condition1 && condition2) || (condition3 && condition4) ||!(condition5 && condition6)) { doSomethingAboutIt(); }

Em ifs use geralmente a regra de indentar com 8 espaços

Page 13: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Exemplos (cont.)//Ou estaif ((condition1 && condition2) || (condition3 && condition4) ||!(condition5 && condition6)) { doSomethingAboutIt(); } // expressões ternárias

alpha = (aLongBooleanExpression) ? beta : gamma;

//oualpha = (aLongBooleanExpression) ? beta : gamma;//oualpha = (aLongBooleanExpression) ? beta : gamma;

Page 14: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Comentários linhas gerais

• Dois tipos de comentários (da implementação e da documentação)

• Linguagens modernas tem formas específicas– use-as !

• Não adicione comentários redundantes– O excesso de comentários reflete código mal escrito– pense em rescrever o trecho...

Page 15: Codding standards Alfredo Goldman Baseado no padrão da Sun.

ComentáriosIniciar sempre o bloco comentário com uma linha em branco:/* * Here is a block comment. */

Comentários de uma única linha devem ser precedidos por uma linha em branco:if (condicao) {

/* Comentário da condição */ ...}

Page 16: Codding standards Alfredo Goldman Baseado no padrão da Sun.

ComentáriosComentários muito curtos podem estar na mesma linha.Se existem vários os mesmo devem estar alinhados.if (a==2) { return TRUE; /* um caso especial */} else { return isPrime(a); /* funciona para a ímpar */} Comentários com // também podem ser usados:if (foo>2) {

// comentário de linha ...} else { return false; // comentário de fim de linha}//if (outracond==1) {// return true; // trecho de codigo comentado//}

Page 17: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Comentários (em java usar javadoc)Um exemplo:/** * Class description goes here. * * @version 1.82 18 Mar 1999 * @author Firstname Lastname */ public class Blah extends SomeClass { /* A class implementation comment can go here. */

/** classVar1 documentation comment */ public static int classVar1; /** * classVar2 documentation comment that happens to be * more than one line long */ private static Object classVar2;

Page 18: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Comentários (em java usar javadoc) cont.

/** instanceVar1 documentation comment */ public Object instanceVar1;

/** instanceVar2 documentation comment */ protected int instanceVar2;

/** instanceVar3 documentation comment */ private Object[] instanceVar3;

/** * ...constructor Blah documentation comment... */ public Blah() { // ...implementation goes here... }

Page 19: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Comentários (em java usar javadoc) cont. /** * ...method doSomething documentation comment... */ public void doSomething() { // ...implementation goes here... }

/** * ...method doSomethingElse documentation comment... * @param someParam description */ public void doSomethingElse(Object someParam) { // ...implementation goes here... }}

Page 20: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Declarações

• Quantas por linha?– De preferência um por linha (help comments)

int level; // nivel de ruídoint size; // tamanho do buraco

– é melhor que:int level, size;

– Nunca deve se declarar dois tipos na mesma linhaint elemento, vetor[]; // errado!

– Pode-se alinhar declaraçõesint level; // indentation levelint size; // size of tableObject currentEntry; // currently selected table entry

Page 21: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Declarações

• Inicialização– Inicialize sempre as variáveis na hora da

declaração;• Exceção: variáveis que dependem de algum cálculo

Page 22: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Declarações• Localização

– Sempre no início de blocos;• mas podem ser declaradas no início do método.

void myMethod() { int int1 = 0; // beginning of method block

if (condition) { int int2 = 0; // beginning of "if" block ... }}// o for é um caso especialfor (int i=0; i< max; i++) { ... }

• Não use o mesmo nome de variável em blocos internos

Page 23: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Declarações (classes e interfaces)

• Não dê espaço entre antes do “)”;• O “{” deve ficar no final da linha • O “}” deve estar alinhado com o comando;• Métodos devem estar separados por uma

linha em branco;• Comandos vazios podem ser dados por {}.

Page 24: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Declarações (classes e interfaces)

class Sample extends Object { int ivar1; int ivar2;

Sample(int i, int j) { ivar1 = i; ivar2 = j; }

int emptyMethod() {}

... }

Exemplo:

Page 25: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Comandos

• Colocar um comando por linha;• Em um bloco indentar sempre;• Colocar { no final da linha onde começa o

bloco e } alinhado com o início desta.;• Use {} mesmo quando os blocos tiverem

apenas um comando.

Page 26: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Exemplos (if)

if (condition) {

statements;

}

if (condition) {

statements;

} else { statements; }

if (condition) {

statements;

} else if (condition) { statements;

} else {

statements;

}

Page 27: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Exemplos (for)

for (initialization; condition; update) { statements;}for (initialization; condition; update);

// ao invés defor (init1, init2; condition; up1, up2){ statements;}

// fazerinit1;for(init2; condition; up1){ statements; up2;}

Page 28: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Exemplos (while, do while)

while (condition) { statements;}

while (condition);

do { statement;} while (condition);

Page 29: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Exemplos (switch)switch (condition) {case ABC: statements; /* se não houver break, coloque comentário */

case DEF: statements; break;

case XYZ: statements; break;

default: statements; break; // é redundante mas pode evitar erros futuros}

Page 30: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Espaços em Branco

• Use linhas em branco para a separação lógica– duas para

• separar seções do mesmo arquivo;• entre definições de classes e interfaces.

– uma para• entre métodos;• dentro de um método entre as variáveis e o 1º comando;• antes de comentários (de bloco, ou linha);• entre as seções lógicas de um método.

Page 31: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Espaços em branco

• Entre keywords e parênteses;while (true) { ... } // assim fica fácil visualizar métodos (sem espaço)

• Após vírgulas em listas de argumentos;• Antes e depois de operadores binários

a += c + d;a = (a + b) / (c * d);while (d++ = s++) { n++; // mas não para operadores unários} printSize("size is " + foo + "\n");

Page 32: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Espaços em branco

• Entre os comandos de um for;for (expr1; expr2; expr3){ ... }

• Após operações de cast

myMethod((byte) aNum, (Object) x);myMethod((int) (cp+5), ((int) (i + 3)) + 1);

Page 33: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Nomenclatura• Packages

– pode-se usar domínio + subdiretórios;• Classes e Interfaces

– Primeira letra de cada palavra maiúscula;• Métodos

– verbos, com 1ª letra minúscula e letras de cada palavra maiúsculas;

• Variáveis– 1ª letra minúscula, pequenos, se temp. ok i, j, k.

• Constantes– Tudo maiúsculo separado por “_”

Page 34: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Dicas de programação

• Evite usar um objeto para acessar algo estáticoclassMethod(); //okAclass.classMethod(); //okanObject.classMethod(); //evitar

• Atribuições: uma em cada linhax = y = 0; // evitarx = 0;y = 0; // ok

d = (a = b + c) + r; //evitar

a = b + c; d = a + r; //ok

Page 35: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Dicas de programação

• Use parêntesesif (a == b && c == d) //evitar

if ((a == b) && (c == d)) //ok

• Use operadores ternários (em certas situações) if (cond) { return x; } return y;

return (cond ? X : y);

• Coloque o comentário XXX se há algo com problema e FIXME onde existem bugs

Page 36: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Dicas de Programação

• Faça o projeto primeiro em OO, depois implemente-o;

• Se você tem métodos com mais de 80 linhas, provavelmente o código não está bem organizado;

• Se seus arquivos tem mais de 500 linhas veja o item anterior;

• Não use variáveis globais.

Page 37: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Padronizar o cabeçalho

/* * Nome do Arquivo: Teste.java * * Descrição: Este é um arquivo que serve para testar a * classe Cliente.Java * * Projeto: PDAs de venda; * Autor: Eu, tu e eles */

Page 38: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Dicas gerais• Sempre terminar o arquivo com uma linha em branco;• Antes de colocar um comentário para alguém no código, envie-lhe

um e-mail;• Sempre faça uma mensagem de “uso”;• Sempre termine os #endif com um comentário correspondente ao

#if;• Coloque /* */ entre o #include e o nome do arquivo (visual C++);• Defina constantes com um prefixo ligado ao projeto:

ex: IT_MAX_CLIENTE;

• Proteja headers de inclusões múltiplas:• Nunca faça o cast de um ponteiro para um inteiro (use long);• Sempre que usar arquivos, verifique se não ocorreram erros de

abertura, escrita, etc.

Page 39: Codding standards Alfredo Goldman Baseado no padrão da Sun.

Caso particular

• Quais padrões de código seriam úteis no seu caso ?

• Os programas atuais respeitam estes padrões ?

• Na prática, verificar que respeitar os padrões não é tão difícil.