sábado, 30 de agosto de 2014

Algoritmo e Programação - Funções (Conceitos Fundamentais)

   Olá a todos. Hoje eu vou falar genericamente de funções na linguagem C: o que são, para que servem e seus prós e contras. A ideia desse post é que alguém com conhecimento nulo sobre funções (mas com algum conhecimento em linguagem C) possa entender todos os conceitos fundamentais de funções. Em um próximo post trabalharemos exclusivamente com a implementação de funções em um programa simples. Primeiramente vou falar para que servem as funções.

Contextualização

   Imagine que você é um professor de 3 turmas de 60 alunos cada e costuma aplicar três provas durante o semestre para cada turma. Então você terá a maçante tarefa de efetuar o cálculo da média (vamos considerar nesse exemplo a média aritmética) das três notas 180 vezes (uma para cada aluno). Você com certeza não irá escrever no seu código 180 vezes o cálculo da média, que consistiria em (N1+N2+N3)/3. Então você decide usar os laços de repetição apresentados nos últimos posts, dessa forma o programa poderá executar as 180 repetições do cálculo da média de que precisamos.

   Mas você não quer somente calcular a média naquela tela preta de console que vimos nos compiladores usados. Então você estuda um pouco mais e cria uma interface gráfica, com alguns botões e mensagens interativas. Acrescenta algumas funcionalidades extras no seu programa. No final, você acaba com um programa cujo código contém aproximadamente 1000 linhas.

   Então, por uma mudança da instituição onde você trabalha a média deixa de ser aritmética para se tornar harmônica. E, nesse caso, você precisa alterar o código de seu programa. Isso significa que você precisa encontrar e alterar uma expressão específica dentro de 1000 linhas de texto já escrito. Você pode me responder que utilizando um CTRL+F você encontraria rapidamente o trecho procurado. Mas suponha que, por qualquer motivo você precisou escrever a expressão da média aritmética em 10 lugares diferentes de seu código. Nesse caso você deve encontrar todos os locais onde a expressão foi escrita e alterar todos. Mas se você escreveu seu código meses, ou até anos atrás, você se lembrará de quantas vezes diferentes você escreveu a expressão da média?

O que são funções

   Justamente para sanar o problema apresentado anteriormente usa-se as funções da linguagem C. Basicamente uma função nada mais é do que um trecho de código que executa determinadas instruções. Em nosso exemplo inicialmente criaríamos uma função que calculasse a média aritmética. Depois, se precisássemos calcular a média em 10 lugares diferentes do código, simplesmente utilizaríamos a função criada. Quando se utiliza uma função dentro do código nós dizemos que a função foi "chamada". Uma chamada de função nada mais é do que sua utilização dentro do código do programa.

   Assim as funções são trechos de códigos escritos que serão repetidos em diversos lugares do programa que está sendo desenvolvido.

Vantagem das Funções

   Quando fosse necessário efetuar alterações do cálculo da média no programa, simplesmente alteraríamos um único lugar: a função. Uma vez que a função foi alterada (e o projeto compilado novamente), todos os lugares que a utilizavam, sejam 10, 20 ou 100 lugares diferentes do código, passarão a utilizar a nova função. A facilidade em dar manutenção, ou seja, a possibilidade de alterar rapidamente o código é uma das vantagens de utilizar funções.

   Outra vantagem é a facilidade de utilizar trabalho feito em um projeto em outro. Ou seja, imagine que você vá criar outro programa que também necessite efetuar cálculos de médias. Você poderia ir no programa inicial, encontrar os trechos onde foi escrito o cálculo da média e dar um CTRL+C e CTRL+V, copiando-os para o código que está sendo escrito. Mas, se você utilizou funções no primeiro programa, você poderia simplesmente importar a função para o segundo programa ou, no pior caso, dar um CTRL+C e CTRL+V na função, copiando-a para o segundo programa.

   Uma terceira vantagem do uso de função, embora um pouco mais técnica, é a economia de espaço de programa. Não digo apenas da economia de linhas conseguida, já que ao escrever uma função não é necessário escrever 10 vezes a mesma coisa dentro do programa. Refiro-me a economia no espaço de memória ocupado pelo programa. Mas, por que há economia de espaço em memória? Muito simples. Se você repetir 10 vezes o mesmo trecho de código dentro do programa e compilar, o compilador irá gerar instruções todas as vezes que você escreveu determinado trecho de código. Já se, por outro lado, você utilizou funções, o compilador irá gerar instruções apenas uma vez e, toda vez que o programa precisar utilizar essas instruções ele irá "saltar" para o local da memória onde as instruções foram compiladas.

   Embora essa explicação seja um pouco mais técnica e exija alguns conhecimentos sobre organização da memória, resumidamente é isso que acontece. Talvez algum dia (mas não vou prometer nada) exista alguns posts básicos sobre funcionamento de computadores: arquitetura de processadores e organização de memória.

Desvantagem das Funções

   Uma desvantagem das funções, embora relativamente imperceptível com a capacidade atual dos computadores, é a velocidade de execução das funções. Toda vez que o programa acha uma função ele precisa saltar para o trecho da memória que contém as instruções. Esse salto gasta tempo, pois envolve a mudança de valores que estão armazenados nos registradores do processador. Portanto saltar para uma função é mais demorado do que se as instruções tivessem sido repetidas 10 vezes. Porém, como dito, essa demora extra é imperceptível devido à velocidade alta dos computadores modernos.

Quando criar funções?

   Ao escrever o código devemos avaliar quais tarefas são importantes e serão repetidas em nosso programa. Isso serve para não cometermos nem excessos e nem faltas. Não devemos nos exceder e criar funções para tudo dentro do programa, incluindo tarefas que realizamos apenas uma vez no programa. Por outro lado não devemos pecar por falta e não criar nenhuma função dentro de um programa, a menos que ele seja de extrema simplicidade.

   Portanto devemos criar funções para todas as tarefas que:
* Acreditamos que serão utilizadas extensamente dentro de nosso programa;
* Acreditamos que possam ser úteis no futuro para criação de outros programas;

   Esses são os meus critérios para decidir quando criar uma função.

   E por hoje era isto. Nesse post expliquei apenas os conceitos e ideias do uso de funções. No próximo post sobre o assunto falaremos sobre a implementação real de uma função em um exemplo simples. Falaremos sobre a sintaxe da criação de uma função, sobre os parâmetros, sobre o valor de retorno e sobre tudo que for necessário para criação de uma função simples em C. Mais adiante seguiremos com ponteiros e como passar endereços de variáveis para funções. Enfim, temos ainda muito pano para manga e bastante coisa legal para vermos. Sobre este post deixem sugestões e críticas nos comentários. Não hesite em se expressar caso tenha achado algum trecho da explicação confuso. Obrigado a todos e até a próxima!

Nenhum comentário:

Postar um comentário