next up previous contents
Next: Software de sistema Up: Desenvolvimento de software Previous: Programação estruturada   Sumário


Codificação

A etapa de codificação traduz a representação do projeto detalhado em termos de uma linguagem de programação. Normalmente são utilizadas linguagens de alto nível, que podem então ser automaticamente traduzidas para a linguagem de máquina pelo processo de compilação. Neste texto, a linguagem C será utilizada nos exemplos e atividades práticas desenvolvidas.

Em uma linguagem de programação procedimental, como C, as construções da programação estruturadas podem ser expressas de forma quase imediata através dos comandos da própria linguagem. Por exemplo, a construção da Figura 1.2 é representada pela simples seqüência de expressões. Associando as tarefas do exemplo a funções, o trecho de código correspondente em C será:

   /* uma seqüência de comandos */
   tarefaA();  // executa esta função
   tarefaB();  // depois de terminar A, executa B

Os pares de caracteres /* e */ delimitam comentários em C, sendo que esses comentários podem se estender por diversas linhas. A outra forma de comentário aceita pela linguagem é a barra dupla, //, que inicia um comentário que termina com o final da linha.

O uso de comentários deve ser usado como forma de documentação interna de um programa. O excesso de comentários não é recomendado, pois pode até prejudicar a leitura de um programa. Entretanto, há comentários que devem estar presentes em qualquer programa, tais como

Comentários de prólogo,
que aparecem no início de cada módulo ou arquivo-fonte. Devem indicar a finalidade do módulo, uma história de desenvolvimento (autor e data de criação e modificações), e uma descrição das variáveis globais (se houver);

Comentários de procedimento,
que aparecem antes da definição de cada função indicando seu propósito, uma descrição dos argumentos e valores de retorno;

Comentários descritivos,
que descrevem blocos de código.
Comentários devem ser facilmente diferenciáveis de código, seja através do uso de linhas em branco, seja através de tabulações. É importante que comentários sejam corretos e coerentes com o código, uma vez que um comentário errôneo pode dificultar mais ainda o entendimento de um programa do que se não houvesse comentário nenhum.

Condições na forma IF são também diretamente suportadas em C. Se a condição x for mapeada para uma função que retorna um valor que será interpretado como verdadeiro ou falso, a construção da Figura 1.3 seria mapeada para o seguinte segmento de código C:

   if ( x() ) {
      tarefaA();
   }
   else {
      tarefaB();
   }

Similarmente, a construção da seleção por SWITCH (Figura 1.4) é suportada pela linguagem C, que oferece um comando para o qual as variáveis sendo testadas podem ser do tipo char ou int:

    switch(y) {
    case 1:  
       tarefaA();
       break;
    case 2:
       tarefaB();
       break;
    case 0:
       tarefaC();
       break;
    default:
       tarefaD();
    }

Em C, há três comandos de controle de execução para indicar repetição. O primeiro, while, é diretamente correspondente à forma expressa na Figura 1.5:

    while ( x() ) {
       tarefaA();
    }

A segunda forma de repetição executa o bloco especificado pelo menos uma vez, repetindo-o se a condição testada ao final for verdadeira (ao contrário da construção da Figura 1.6):

    do {
       tarefaA();
    } while ( x() );

Finalmente, o comando for combina a inicialização, o teste e a atualização da variável (ou variáveis) de condição em uma única expressão. Por exemplo,usando uma variável inteira i para executar uma tarefa 10 vezes:

    for (i = 0 ; i < 10 ; i = i+1) {
      tarefaA();
    }
Essa construção equivale a
    i = 0;
    while (i < 10) {
      tarefaA();
      i = i+1;
    }

A tradução de uma especificação de um programa para uma linguagem de programação pode resultar em programas incompreensíveis se não houver um cuidado na preservação da informação presente. As linhas gerais que estão a seguir buscam estabelecer uma disciplina de codificação que, se seguida, facilita o entendimento e manutenção de programas.

Código deve ser acima de tudo claro. Os compiladores modernos fazem um ótimo trabalho de otimização de código, de forma que não há necessidade do programador ficar se preocupando em usar pequenos ``truques'' para economizar algumas instruções no código de máquina -- provavelmente o compilador já faria isto para o programador1.1. A preocupação com a otimização de código só deve existir após a detecção da necessidade real desta otimização, e ela deve se restringir ao segmento do programa onde o problema de desempenho foi localizado.

Na maior parte das linguagens de programação modernas, a posição exata (em qual coluna) a instrução está localizada é irrelevante. Assim, na codificação das construções estruturadas, diferentes níveis de tabulação devem ser usados para indicar blocos de distintos níveis. Evite sempre que possível o uso de condições de teste complicadas e o aninhamento muito profundo de condições de teste. Use parênteses para deixar claro como expressões lógicas e aritméticas serão computadas.

Com relação a instruções de entrada e saída, todos os dados de entrada devem ser validados. O formato de entrada deve ser tão simples quanto possível e, no caso de entrada interativa, o usuário deve receber uma indicação de que o programa está aguardando dados. Da mesma forma, a apresentação de resultados deve ser clara, com indicação sobre o que está sendo apresentado. O valor de retorno de qualquer rotina que possa retornar um erro deve sempre ser testado, tomando-se as ações que forem necessárias para minimizar o efeito do erro.

Nomes de identificadores (variáveis, procedimentos) devem denotar claramente o significado do identificador. Linguagens de programação modernas raramente limitam o número de caracteres que um identificador pode ter, de forma que não faz sentido restringir este tamanho. Compare as duas linhas de código a seguir e observe como uma boa escolha no nome de variáveis nomes claros pode facilitar a compreensão de um programa:

  d = v * t;
  distancia = velocidade * tempo;


next up previous contents
Next: Software de sistema Up: Desenvolvimento de software Previous: Programação estruturada   Sumário
Ivan L. M. Ricarte 2003-02-14