Redes sociais

[Basics] Métodos, procedures e funções

01 junho 2023 -

Fala, Pessoal! Tudo bem com vocês?

Hoje vamos conhecer um pouco dos conceitos básicos e diferenças entre métodos, procedures e funções. Bora conferir?!

Rotinas 


Um conceito importante no Object Pascal (assim como em outras linguagens, como o C, por exemplo) são as rotinas. As rotinas são, basicamente, uma série de comandos agrupados com um nome único, na qual pode ser chamado quantas vezes for necessário, evitando, assim, a escrita do mesmo código várias vezes.
”Dessa forma, você pode pensar nas rotinas como um mecanismo de encapsular códigos básicos.” (Marco Cantú)

Procedures e Functions


Em Object Pascal, as rotinas podem assumir duas formas: procedure ou function

A diferença básica entre elas está no fato de que a função nos retorna um valor ou um tipo, enquanto o procedimento não tem nenhum retorno. Ambos podem ter múltiplos parâmetros de qualquer tipo, e são a base dos métodos de classe.

Sintaxe 


Os procedimentos são especificados pela palavra chave procedure. Abaixo um pequeno exemplo de um procedimento:
procedure OlaMundo;
begin
  Writeln('Olá Mundo!');
end;
Já as funções, são especificadas pela palavra chave function e sempre retornam um valor com um tipo especificado no cabeçalho da função. O seu retorno pode ser feito de duas formas diferentes: uma é atribuindo o valor de retorno ao nome da função, a outra forma é atribuindo o valor de retorno à palavra chave Result. Veja os exemplos:
// Exemplo com Result
function SomaValores(Valor1: Integer; Valor2: Integer): Integer;
begin
  Result := Valor1 + Valor2;
end;
// Exemplo com o nome da função
function MultiplicaValores(Valor1: Integer; Valor2: Integer): Integer;
begin
  MultiplicaValores := Valor1 * Valor2;
end;
O Result e o nome da função sempre representarão o mesmo valor, como podemos ver no exemplo abaixo, na qual retornará o valor 11.
// Exemplo com o nome da função e Result
function MisturaValores(): Integer;
begin
  Result := 5;
  MisturaValores := Result * 2;
  Result := Result + 1;
end
Mas, é importante salientar a diferença entre os dois:
  • O Result representa uma variável e pode ser utilizado nos dois lados da sinal de atribuição, ou seja, ele pode receber a atribuição de um valor (como acontece em Result := 5;) ou, ter seu valor utilizado para atribuir em outra variável (como acontece nas outras linhas), além de poder ser passado por parâmetro para outros métodos, por exemplo;
  • Já o nome da função quando utilizado do lado esquerdo no sinal de atribuição, o compilador assumirá que ele está sendo utilizado como forma de rastrear o retorno da função, e quando usado em qualquer outro lugar, o compilador interpretará como uma chamada recursiva ao próprio método.
O uso do nome da função para retornar o seu valor é uma notação clássica do Pascal que é raramente usada nos dias de hoje. Já o uso do Result é a forma mais comum de retornar o seu valor.
 

Mas, como podemos fazer uso dos procedimentos e funções?


Para usar os procedimentos e as funções basta informar seu nome seguido dos parâmetros entre parênteses. Nos casos em que não houver parâmetros, os parênteses podem ser omitidos. Veja:
  // Chama o procedimento
  OlaMundo;
  // Chama as funções
  X := SomaValores(23, 15);
  Y := MultiplicaValores(3, 15);
  Y := MultiplicaValores(X, 2);    
  
Observe que a função MultiplicaValores foi chamada duas vezes no código sendo cada chamada com valores diferentes na passagem dos parâmetros, exemplificando, assim, a reutilização do código. Além disso, podemos acrescentar o conceito de encapsulamento, já que quando chamamos a função MultiplicaValores não precisamos saber qual foi o algoritmo criado internamente para implementá-la.

Com o uso das funções e procedimentos, caso no futuro a gente descubra uma forma melhor de implementar o código, ou ainda, caso a regra daquela rotina venha a mudar, basta ajustar o código dentro dela e os pontos em que as chamam não terão necessidade de ajustes.

Sobrecarga de métodos


No Delphi, pode-se declarar mais de um método com o mesmo nome. Isso é o que chamamos de sobrecarga de métodos, ou overloding.

Para serem sobrecarregados, os métodos precisam utilizar a diretiva overload; e precisam ter uma lista de parâmetros distintos. Por exemplo:
function DivideValores(X, Y: Real): Real; overload;
begin
 Result := X/Y;
end;

function DivideValores(X, Y: Integer): Integer; overload;
begin
 Result := X div Y;
end;
Veja, que foram declarados duas funções com mesmo nome, porém com parâmetros distintos em seu tipo. Assim, quando fizermos a chamada da função, passando por parâmetro os valores (10, 2.5) o compilador automaticamente chamará a primeira declaração da procedure, já que o 2.5 representa um Real.
Outros pontos devem ser considerados no overload de métodos. Mas deixaremos para abordar esse assunto em um próximo artigo 😉.
Por fim, podemos concluir que:
  • Métodos são rotinas (uma série de comandos agrupados com um nome único) que podem assumir duas formas: procedure ou function;
  • As functions se distinguem das procedures pelo seu retorno;
  • Os métodos nos auxiliam a organizar nosso código-fonte, e, além de facilitar uma futura manutenção, nos ajudam a encapsular e reutilizar códigos sem necessidade de reescrita.

E se você quiser saber mais sobre as procedures e funções, sugiro a leitura da documentação oficial no site da Embarcadero.

Forte abraço e nos vemos no próximo post! ;) 

Autor: Flávia Melo 

Esse exemplo e tantos outros disponíveis aqui no blog, você pode conferir acessando meu repositório no github.

Postar um comentário