3.2 Paradigma Procedimental
Apesar dos benefícios relativos ao aumento de legibilidade e manutenção de código proporcionada pela programação estruturada, esta ainda apresenta desvantagens em outros aspectos. Para programas extensos, que se dividem em várias tarefas complexas, por exemplo, é difícil saber quando uma tarefa acaba e outra começa, uma vez que todo o programa está em um código único. Outro ponto fraco é que o paradigma não proporciona reutilização de código. Quando uma tarefa precisa ser executada várias vezes ao longo de um mesmo programa, geralmente, a solução é reescrever a tarefa nos pontos necessários, o que, além de aumentar consideravelmente o tamanho do código, dificulta o entendimento e a manutenção do mesmo.
Como forma de solucionar esses problemas, propôs-se o paradigma procedimental, que é uma derivação do paradigma estruturado. Este novo paradigma agrega o conceito de procedimento (em inglês procedure, termo que dá nome ao paradigma).
Procedimento, também conhecido como rotina, subrotina, ou função, é uma unidade do programa que armazena uma sequência de instruções modularizadas a fim de executar uma tarefa específica. Esta unidade pode então ser chamada em qualquer parte do programa (e.g., ser chamada por outros procedimentos e por si própria) onde aquela determinada tarefa precise ser realizada. Desta forma, o uso de procedimentos possibilita abstrair tarefas específicas, permitindo aos programadores se preocupar em o que será feito, em vez de como.
Considerando que um programa de computador pode ser visto como um conjunto de tarefas, qualquer tarefa complexa pode ser dividida em um conjunto de tarefas menores, até que as tarefas sejam suficientemente pequenas e simples, para que sejam facilmente compreendidas. Sendo assim, o paradigma procedimental torna o código mais compreensível e facilita sua manutenção, uma vez que esse pode ser lido como um conjunto de tarefas simples e independentes. Outro ponto importante é que o paradigma procedimental proporcionou reusabilidade de código, já que um mesmo procedimento pode ser usado em vários programas.
Para ilustrar o uso de procedimentos, o Exemplo 7 mostra a definição de um procedimento em linguagem C que ordena um vetor de números inteiros.
Exemplo 7:
void bubble_sort(long[] list, long n)
{
long c, d, t;
for (c = 0 ; c < ( n - 1 ); c++)
{
for (d = 0 ; d < (n - 1 - c); d++)
{
if (list[d] > list[d+1])
{
t = list[d];
list[d] = list[d+1];
list[d+1] = t;
}
}
}
}
O Exemplo 8 mostra como esse procedimento pode ser usado em no corpo de programa também escrito em linguagem C. Note que o código do programa ficou mais simples e fácil de ler do que se o código de ordenação estivesse diretamente no programa principal. Essa modularização de tarefas em procedimentos permite um desenvolvimento mais produtivo (pois procedimentos já feitos e testados podem ser reusados) e de maior manutenabilidade.
Exemplo 8:
int main()
{
int n= 10;
int[n] array = {0,9,7,5,3,1,2,4,6,8};
bubble_sort(array, n);
printf("Numeros ordenados em ordem ascendente:\n");
for ( int c = 0 ; c < n ; c++ )
printf("%ld\n", array[c]);
return 0;
}