Você está na página 1de 58

Boas Prticas de Programao, prof.

Eduardo Aranha

PADRES DE CODIFICAO

Padres
O qu se entende por padres? E sobre padres de codificao?

Qual o Melhor Padro de Codificao?


Depende da linguagem de programao No h um consenso O importante ter um padro!

BOAS PRTICAS PARA ORGANIZAO DE COMANDOS CONDICIONAIS

Comandos Condicionais
Comandos usados para controlar a execuo de outros comandos Exemplos comuns: Comando if Comando switch

COMANDOS CONDICIONAIS

Comando if
O qu esse programa faz?
int i = lerNumero(); if (i == 10){ imprimir("i igual a 10"); } else { imprimir("i diferente de 10"); }

Comando if
E agora?
int i = lerNumero(); if (i == 10){ imprimir("i igual a 10"); } else if (i > 10){ imprimir("i maior que 10"); } else if (i < 10){ imprimir("i maior que 10"); }

Boas Prticas para uso do if


Regra 1: Escreva sempre o caminho normal primeiro e, em seguida, os caminhos menos usuais Coloque o caso normal dentro do corpo do if, ao invs do corpo do else
if (i == 10){ // caso esperado ou mais usual } else { // caso mais raro }

Boas Prticas para uso do if


Regra 2: Tenha certeza de tratar corretamente os ramos relacionados a igualdade

if (idade > 12 && idade < 17){ // Adolescente } else if (idade >= 17 && idade < 31) { // Jovem }

Boas Prticas para uso do if


Regra 3: Garanta que o comando if possua um comando significante Exemplo problemtico:
if (algumTest) ; else { // Faa alguma coisa }

Boas Prticas para uso do if


Regra 4: Garanta que durante os testes do seu programa no apenas o comando if testado, mas tambm o comando else Veremos mais sobre testes em outra aula!

Boas Prticas para uso do if


Regra 5: Simplifique testes complicados usando funes com retorno boolean

O Qu Esse Cdigo Faz?


if (0 <= caracterEntrada && caracterEntrada <= 9){ // ... } else if ( (a <= caracterEntrada && caracterEntrada <=z) || (A <= caracterEntrada && caracterEntrada <=Z)) { // ... } else if (...){ }

Boa Prtica
if (ehDigito(caracterEntrada){ // ... } else if (ehLetra(caracterEntrada) { // ... } else if (ehPontuacao) { // ... }

Boas Prticas para Encadeamento de Comandos if


Regra 6: Coloque o caso mais comum primeiro No exemplo anterior, em processamento de texto poderamos mover o teste ehLetra() para ser o primeiro comando if

Boas Prticas para Encadeamento de Comandos if


Regra 7: Tenha certeza que todos os casos (condies) so cobertos uma boa prtica criar um else final para indicar que uma situao inesperada foi alcanada (programao defensiva) Como ficaria o exemplo anterior?

Comando switch
Comandos usados para selecionar uma alternativa entre um conjunto de opes Linguagens C/C++ e Java oferecem suporte apenas para constantes, considerando um valor por vez

Estrutura do switch
switch (expressao){ case constante1: // comandos 1 break; case constante2: // comandos 2 break; default: // comandos }

Exemplo
int numero = lerNumero(); switch (numero){ case 1: imprimir("nmero 1"); break; case 2: imprimir("nmero 2"); break; default: cout << "nmero diferente de 1 e 2"; }

Boas Prticas para comando switch


Opes de Regras para Organizao Melhoram a legibilidade e facilidade de manuteno do cdigo Regra 1: Ordenar os casos (cases) alfabeticamente ou numericamente Regra 2: Colocar o caso normal no incio Casos de excees devem ser colocado depois

Boas Prticas para comando switch


Opes de Regras para Organizao (cont.) Regra 3: Organizar por freqncia Organizar casos mais frequentes no incio e por ltimo casos menos usados Regra 4: Organizar logicamente Organizar casos em grupos relacionados por funcionalidade do sistema, etc.

Exemplo
int numero = lerNumero(); switch (numero){ case 1: case 2: imprimir("numero 1 ou 2"); break; case 3: case 4: imprimir("numero 3 ou 4"); break; default: imprimir("numero diferente de 1 a 4); }

Boas Prticas para comando switch


Regra 5: Simplificar o cdigo relacionado a cada comando case Pouco cdigo, criao de rotinas se necessrio Regra 6: Use a clusula default apenas em casos legtimos (padro para qualquer outro valor)
Inclui valores invlidos

Regra 7: Use a clusula default para detectar erros, se for o caso

Como Melhorar esse Cdigo?


int numero = lerNumero(); switch (numero){ case 1: if (...){ } else if (...){ } else { } break; case 2: ... }

Boa Prtica
int numero = lerNumero(); switch (numero){ case 1: casoOpcao1(numero); break; case 2: ... default: imprimir("numero fora do limite de 1 a 4"); } void casoOpcao1(int numero){ // Comandos que estavam dentro do case 1 }

Boa Prtica
char comando = lerChar(); switch (comando){ case A: abrir(); break; case S: salvar(); break; case F: fechar(); break; default: // tratar comando invlido }

Boas Prticas Adicionais


Ao definir comandos com bloco de cdigos, procurar sempre delimit-lo begin/end ou { } Torna o cdigo mais claro e preparado para receber futuramente novos comandos Ao definir comandos switch, garanta que toda clusula case possui um break implementado Se no precisar, escreva um comentrio explicando

Atividade
Reescrever agora algum programa da disciplina de programao (PCTP, PAED, ) que requereu o uso de comandos if e/ou switch Verificar se todas as prticas apresentadas para tais comandos esto sendo aplicadas em tal programa Fazer um resumo (cdigos ante e depois, justificativa do ajuste realizado, etc.) e submeter via SIGAA

COMANDOS DE ITERAO

Comandos de Iterao
Comandos usados para permitir a repetio sistemtica de um conjunto de passos Exemplos comuns:
Comando for, while Comando do-while

Uso bastante comum


Comando essencial para a elaborao de programas Exemplos de uso:
Processamento de operaes de entidades
Ex: gerao de folha de pagamento

Loop que testa a cada iterao uma dada condio atendida


Ex: realizar pagamentos enquanto h saldo em conta

Quando usar o comando while


Nos casos em que voc no sabe previamente a quantidade de iteraes Testes no loop:
No incio: while No final: do-while No meio: while || do while com break

Comando while
// Inicializacao de variaveis de controle while (condicao){ // Comandos internos ao loop }

Comando do-while
// Inicializacao de variaveis de controle do { // Comandos internos ao loop } while (condicao);

Qual a diferena?

Quando usar o comando for


Para executar um bloco de comandos por um nmero conhecido de vezes Exemplos:

Incrementos/decrementos de uma dada varivel Iterao sobre um vetor, etc.

Comando for
for (inicializacao de variaveis de controle; condicao; incremento de variaveis de controle){ }

Boas Prticas para controlar o loop


Loops aumentam a complexidade do cdigo
importante termos cuidados especiais com eles

Exemplos de Erros Comuns


Erros de inicializao Erros de aninhamento de loops Finalizao incorreta do Loop Erros de incremento de variveis Indexao errada de um dado array

Recomendaes Gerais
Minimize/simplifique os fatores que afetam o loop
Simplifique o mximo possvel seu comando de repetio !!

Trate o seu cdigo interno como se fosse uma rotina


Deve ser possvel entender o loop apenas pela declarao dos seus testes de condio

Exemplo
while (!inputFile.EndOfFile() && moreDataAvailable ) { // Do a lot of things

Boas Prticas para entrar no loop


Regra 1: Colocar cdigo de inicializao antes do loop devido ao princpio de proximidade:
manter cdigos relacionados prximos facilita o entendimento e manuteno do programa

M e Boa Prtica
// cdigo de inicializao xxx // cdigo extra yyy while(condicao){ } // cdigo extra yyy // cdigo de inicializao xxx while(condicao){ }

Boas Prticas para entrar no loop


Regra 2: Usar while(true) para loops infinitos
Evitar o uso de comandos de repetio de valores limites
Varivel x de 1 a 9999999999999 Ou varivel x de 1 a 2, no incrementando x no loop

Em C++, uso de for(;;) aceitvel

Regra 3: No use um comando for onde um comando while parece ser mais apropriado

Qual o problema com esse cdigo?


/* Leitura de todos os registros de um arquivo */ for (inputFile.moveToStart(), recordCount = 0; !inputFile.endOfFile(); recordCount++){ inputFile.getRecord(); }

Mais adequado com while


/* Leitura de todos os registros de um arquivo */ inputFile.moveToStart(); recordCount = 0; while(!inputFile.endOfFile()){ inputFile.getRecord(); recordCount++ }

Boas Prticas para o meio do loop


Regra 1: Use begin-end (chaves) para delimitar o seu loop
Melhora legibilidade, no afeta tempo, ajudam a prevenir erros

Regra 2: Evite loops vazios


Processamento nas condies de continuidade e de incremento

Regra 3: Garanta que cada loop tm apenas um propsito


Desempenho x Legibilidade x Facilidade de manuteno x

Qual o problema com esse cdigo?


/* Leitura de todos os registros de um arquivo */ while ( (inputChar = dataFile.getChar() ) != CharType_Eof) { ; }

Ajustando o cdigo
/* Leitura de todos os registros de um arquivo */ do { inputChar = dataFile.getChar(); } while ( inputChar!= CharType_Eof);

Boas Prticas para sair do loop


Regra 1: Garanta que o loop finaliza Rode e teste seu programa para garantir isso. Execute situaes normais e de casos excepcionais Regra 2: Deixe claras as condies de finalizao do loop Regra 3: No brinque com o ndice de um loop para finaliz-lo

Qual o problema com esse cdigo?


/* Leitura de todos os registros de um arquivo */ for (int i = 0; i < 100; ++i){ // cdigo ... if (condicao){ i = 100; } // mais cdigo ... }

Boas Prticas para sair do loop


Regra 4: Evite cdigo posterior ao loop que dependa do valor final do ndice

Boas Prticas para variveis de um loop


Regra 1: Use variveis inteiras (int, long) ou boolean para condies em loop Regra 2: Use nomes de variveis significativos para tornar loops aninhados legveis
Evitar letras do alfabeto: a, b, c,

Regra 3: Limite o escopo de variveis do loop para o bloco do loop

Qual o problema com esse cdigo?


sum = 0; for (int i=0; i < numPayCodes; ++i){ for (int j=0; j < 12; ++j){ for (int k=0; k < numDivisions; ++k){ sum = sum + transaction[j][i][k]; } } }

Ajustando...
for (int payCodeidX =0; payCodeidX < numPayCodes; ++payCodeidX){ for (int month=0; month < 12; ++month){ for (int divisionIdx=0; divisionIdx < numDivisions; ++divisionIdx){ sum = sum + transaction[month][payCodeidX][divisionIdx]; } } }

Qual o problema com esse cdigo?


/* Leitura de todos os registros de um arquivo */ for (recordCount = 0; recordCount < MAX_RECORDS; recordCount++ ){ if (...){ break; } } ... // Varios trechos de codigo if (recordCount < MAX_RECORDS){ return true; } else { return false; }

Evite cdigo que depende do valor final do ndice fora do loop


/* Leitura de todos os registros de um arquivo */ found = false; for (recordCount = 0; recordCount < MAX_RECORDS; recordCount++ ){ if (...){ found = true; break; } } // Varios trechos de codigo return (found);

Boas Prticas para tamanho de loop


Regra 1: Torne seu loop visvel no seu editor
Idealmente em torno de 15 a 20 linhas, no mximo

Regra 2: Aninhamento mximo em 3 nveis


Uso de rotinas/mtodos em caso de necessidade de mais nveis

Regra 3: Simplifique os loops


Uso de rotinas para melhor estrutur-los (condies, corpo, etc.)

Regra 4: Loops maiores devem ser claros


Cuidado no uso de mltiplas condices de sada (continue/break)

Atividade
Verificar se todas as prticas apresentadas para comandos de iterao, esto sendo aplicadas nos programas de PAED1 ou de outra disciplina Postar resumo (cdigos ante e depois, justificativa do ajuste realizado, etc.) em tarefa no SIGAA

Você também pode gostar