Programação Modular em C

Pré-processador C: x macros; Alocação Dinâmica

Olá, caro leitor! Este artigo reúne informações importantes sobre programação modular que já foram apresentadas em outros artigos. O principal objetivo é fundamentar os conceitos necessários para organizar uma aplicação em linguagem C em um conjunto de módulos funcionais.

 

 

A Linguagem C

 

A característica especial de uma linguagem estruturada é a compartimentalização do código e dos dados, isto é, a capacidade de seccionar e encapsular partes do programa. Diante disso, o principal componente em C que possui essa característica é a função. Com a função é possível modularizar um programa, permitindo codificar, separadamente, uma determinada tarefa [1]. Além disso, tal procedimento traz algumas vantagens como a reutilização de código, compilação individual de código, e a estrutura do código fica mais clara, por exemplo.

 

 

O Design Estruturado

 

O projeto de um programa em C segue uma abordagem Top-Down. Essa abordagem é caracterizada por estruturar o projeto a partir da rotina de nível mais alto até as rotinas de nível mais baixo. Um esboço de uma determinada parte do programa começa com uma descrição geral e caminha em direção da particularização [1]. Vale a pena conferir o artigo do Felipe Lavratti sobre abordagem Top-Down.

 

Programação Modular
Figura 1: Decomposição funcional de uma aplicação.

 

Diante disso, o design estruturado corresponde a uma decomposição funcional de uma aplicação num conjunto de módulos bem definidos. Esses módulos cooperam para desempenhar a funcionalidade definida pela aplicação, conforme ilustrado na Figura 1.

 

Programação Estruturada: Um método de escrever um programa que utiliza (1) análise Top-Down para solução de problemas, (2) modularização para estruturar e organizar o programa, e (3) estruturação do código em módulos individuais [2].

 

 

Módulos

 

Um módulo na linguagem C pode ser criado utilizando arquivos de cabeçalho e de implementação. Abaixo segue a definição de cada tipo de arquivo:

 

Arquivo de cabeçalho: Os arquivos ‘.h’ são utilizados para especificar assinatura de funções, definições de constantes, tipos de dados criados pelo usuário etc. De modo geral, os arquivos de cabeçalho têm como função definir a interface de um módulo.

 

Arquivo de implementação: Os arquivos ‘.c’ implementam as funções definidas na interface. De modo geral, esses arquivos são compostos por diversas funções e estruturas de dados utilizadas internamente.

 

Para criar aplicações seguras que não entrem em conflito com outros módulos, os conceitos apresentados sobre modificadores de armazenamento e o pré-processador podem ser aplicados. Exemplo disso é a utilização de header guards, outro é a utilização de modificadores static e extern.

 

O conceito de header guards pode ser visto aqui. Basicamente, a aplicação de header guards é realizada para evitar que o código presente no arquivo de cabeçalho seja copiado para o fonte que fez sua inclusão. Já os modificadores podem ser empregados para limitar o escopo de funções e variáveis que são utilizadas somente dentro do módulo, tornando "público" somente o que é necessário.

 

 

Aplicação Modular na Prática

 

Esses conceitos podem ser vistos no módulo slist criado pelo Felipe Neves e apresentado neste artigo. Todas as funções e definições de dados pertencentes ao módulo estão dentro de uma estrutura de compilação condicional.

 

 

Já o arquivo fonte contém a implementação das funções definidas e também funções internas do próprio módulo. Observe que para essas funções internas o modificador static foi utilizado para limitar seu escopo. Isso também pode ser aplicado em variáveis internas do módulo.

 

 

Dessa maneira, tudo que é relativo ao módulo fica encapsulado, isto é, restrito ao escopo do arquivo fonte.

 

 

Referências

 

[1] Livro: C, completo e total – 3ª edição revista e atualizada. Herbert Schildt.

[2] John Dalbey – Structured Programming.

Figura 1 – http://www.tenouk.com/Module4.html

Imagem destacada.

Licença Creative Commons
Programação Modular em C por Fernando Deluno Garcia. Esta obra está licenciado com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
  • Guilherme Abraham

    Excelente artigo. Uma coisa que sinto falta nas disciplinas de engenharia de software são técnicas para projetos que não sejam orientados a objeto. Vou ler os links disponibilizados nesse artigo mas já deixo uma sugestão de uma série focada em técnicas pra projetos de software no paradigma estruturado/funcional.

    Vou tomar a liberdade de apontar 2 erros no texto:

    [...] Um método de escrever um programa que utiliza
    (1) (anÁlise) Top-Down para solução de problemas [...]

    [...] Basicamente, a aplicação de header guards é realizada para evitar (quer) o
    código presente no arquivo [...]

    • Fernando Deluno Garcia

      Olá, Guilherme. Obrigado pelo retorno!

      Pois é, as linguagens estruturadas acabam ficando apenas nas matérias de introdução e restritas ao console preto...

      Eu escrevi outro artigo que também trata esse tipo de assunto, mas ficou vinculado a série de ponteiros. Se quiser conferir: https://www.embarcados.com.br/ponteiro-em-c-tipo-de-dado-abstrato/