Sub-Rotina: Chame-me quando precisar

Introdução

A criação e utilização de sub-rotina é uma das técnicas de programação mais antigas. Mesmo tendo suas origens em meados dos anos de 1960, a sua utilização continua sendo muito importante. No decorre deste artigo será feita uma abordagem inicial sobre sub-rotinas, além de apresentar a sintaxe e utilização das mesmo nas linguagens de programação PASCALDELPHIC/C++JAVA e PHP.

Rápida explicação

Neste artigo serão utilizadas as linguagens de programação PASCALDELPHIC/C++JAVA e PHP por um motivo simples, mostrar para o iniciante em programação que a maioria das ideias e conceitos vistos no decorrer da aprendizagem existem em diversas linguagens de programação, sendo mais importante aprender a lógica de programação que apenas a sintaxe da linguagem escolhida, pois a sintaxe pode mudar de uma linguagem para outra, mas para ser um bom desenvolvedor é necessário entender a semântica, independente da linguagem.

Mas o leitor pode sentir-se a vontade para se concentrar apenas na linguagem que mais lhe agrade, pois o artigo foi escrito de uma maneira que permita esse olhar direcionado a apenas uma das linguagens.

Definição

As sub-rotinas são blocos de comandos que realizam tarefas específicas, em outra palavras, são conjuntos de instruções projetadas cumprir uma atividade singular. Uma analogia possível entre uma sub-rotina e um objeto do mundo real, seria compara-la a um relógio. O relógio é criado para atender uma necessidade bem específica, mostrar as horas sempre que for solicitado, e independente de quem está solicitando. Da mesma maneira uma sub-rotina deve atender uma necessidade, independente de quando, onde ou quem a solicitar.

De uma forma geral, uma sub-rotina permitir abstrair muitos detalhes do programa, melhorando a legibilidade e facilitando a manutenção do código.

As sub-rotinas recebem diversos nomes dependendo da linguagem, paradigma ou da visão, alguns desses nomes são (i) sub-programas, (ii) função, (iii) procedimento, (iv) método. O nome método, em particular, é usado para designar uma sub-rotina de uma classe nas linguagens orientadas a objetos, assunto que será aprofundado em outro artigo.

Tipos de Sub-rotinas

Existem quatro tipos bem distintos de sub-rotinas.

1º - Sub-rotina sem retorno e sem parâmetros; 2º - Sub-rotina sem retorno e com parâmetros; 3º - Sub-rotina com retorno e sem parâmetros; 4º - Sub-rotina com retorno e com parâmetros.

Obs.: Embora usados muitas vezes como sinónimos, parâmetros e argumentos têm uma diferença básica. Ao se definir uma sub-rotinas são definidos os parâmetros. Mas quando a sub-rotina é chamada, passa-se os valores como argumentos para os parâmetros.

Exemplo

No decorrer desse artigo serão apresentados três tipos de sub-rotinas, sendo eles o 1º (primeiro), 2º (segundo) e 4º (quarto) tipos. O 3º (terceiro) tipo é uma mesclagem entre o 1º (primeiro) e 4º (quarto) tipo.

O exemplo básico que será utilizado está descrito abaixo, mas a cada novo tipo de sub-rotina haverá um refinamento no código.

Exemplo básico: Criar uma sub-rotina para calcular o fatorial de um número natural.

Sub-rotina sem retorno e sem parâmetros

Nesse caso, a sub-rotina será chamada e já saberá qual o número natural que será utilizado para calcular o fatorial.

Sintaxe em PASCAL e DELPHI

// Criação da sub-rotina
procedure NOME_SUB_ROTINA; // ou procedure NOME_SUB_ROTINA();
begin
  // bloco de comandos
end;

// Chamada da sub-rotina
NOME_SUB_ROTINA; // ou NOME_SUB_ROTINA();

Utilização em PASCAL:

// Criação da sub-rotina
procedure Fatorial; // ou procedure Fatorial();
var
  i, num, fat: integer;
begin
  num := 5;
  fat := 1;
  for i := 1 to num do
    begin
      fat := fat * i;
    end;
  writeln(fat);
end;

// Chamada da sub-rotina
Fatorial; // ou Fatorial;

Utilização em DELPHI:

// Criação da sub-rotina como biblioteca
procedure Fatorial; // ou procedure Fatorial();
var
  i, num, fat: integer;
begin
  num := 5;
  fat := 1;
  for i := 1 to num do
    begin
      fat := fat * i;
    end;
  ShowMessage(IntToStr(fat)); // A função IntToStr() converte um valor inteiro numa string 
end;

// Chamada da sub-rotina como biblioteca
Fatorial; // ou Fatorial();

// Criação da sub-rotina como método da classe TMinhaClasse
procedure TMinhaClasse.Fatorial; // ou procedure TMinhaClasse.Fatorial();
var
  i, num, fat: integer;
begin
  num := 5;
  fat := 1;
  for i := 1 to num do
    begin
      fat := fat * i;
    end;
  ShowMessage(IntToStr(fat)); // A função IntToStr() converte um valor inteiro numa string 
end;

// Chamada da sub-rotina como método do objeto meuObjeto
meuObjeto.Fatorial; // ou meuObjeto.Fatorial();

Sintaxe em C/C++ e JAVA

// Criação da sub-rotina
void NOME_SUB_ROTINA() {
    // bloco de comandos
}

// Chamada da sub-rotina
NOME_SUB_ROTINA();

Utilização em C/C++:

// Criação da sub-rotina
void fatorial() {
    int i, num, fat;
    num = 5;
    fat = 1; 
    for (i = 1; i <= num; i++) {
        fat = fat * i;
    }
    printf("%d\n", fat);  // A máscara %d informa a função printf() que irá receber um valor inteiro
}

// Chamada da sub-rotina
fatorial();

// Criação da sub-rotina como método da classe MinhaClasse no C++
void MinhaClasse::fatorial() {
    int i, num, fat;
    num = 5;
    fat = 1; 
    for (i = 1; i <= num; i++) {
        fat = fat * i;
    }
    printf("%d\n", fat);  // A máscara %d informa a função printf() que irá receber um valor inteiro
}

// Chamada da sub-rotina como método do objeto meuObjeto no C++
meuObjeto.fatorial();

Utilização em JAVA:

// Criação da sub-rotina como método da classe MinhaClasse
public void fatorial() {
    int i, num, fat;
    num = 5;
    fat = 1; 
    for (i = 1; i <= num; i++) {
        fat = fat * i;
    }
    System.out.println(fat);
}

// Chamada da sub-rotina como método do objeto meuObjeto
meuObjeto.fatorial();

Sintaxe em PHP

// Criação da sub-rotina
function NOME_SUB_ROTINA(){
    // bloco de comandos
}

// Chamada da sub-rotina
NOME_SUB_ROTINA();

Utilização em PHP:

// Criação da sub-rotina
function fatorial() {
    $num = 5;
    $fat = 1;
    for ($i = 1; $i <= $num; $i++) {
        $fat = $fat * $i;
    }
    print $fat; // ou echo $fat;
}

// Chamada da sub-rotina
fatorial();

Sub-rotina sem retorno e com parâmetros

Nesse caso, ao chamar a sub-rotina, será passado um número natural como argumento para calcular o fatorial.

Obs.: Na sintaxe, os COLCHETES denotam uma parte opcional e as CHAVES indicam que partes podem ser repetidas indefinidamente ou omitidas completamente.

Sintaxe em PASCAL e DELPHI

// Criação da sub-rotina
procedure NOME_SUB_ROTINA(PARAMETRO: TIPO [{; PARAMETRO: TIPO}]);
begin
  // bloco de comandos
end;

// Chamada da sub-rotina
NOME_SUB_ROTINA(ARGUMENTO [{, ARGUMENTO}]);

Utilização em PASCAL:

// Criação da sub-rotina
procedure Fatorial(num: integer);
var
  i, fat: integer;
begin
  fat := 1;
  for i := 1 to num do
    begin
      fat := fat * i;
    end;
  writeln(fat);
end;

// Chamada da sub-rotina
Fatorial(5); // O número pode ser substituído por uma variável inteira

Utilização em DELPHI:

// Criação da sub-rotina como biblioteca
procedure Fatorial(num: integer);
var
  i, fat: integer;
begin
  fat := 1;
  for i := 1 to num do
    begin
      fat := fat * i;
    end;
  ShowMessage(IntToStr(fat)); // A função IntToStr() converte um valor inteiro numa string 
end;

// Chamada da sub-rotina como biblioteca
Fatorial(5); // O número pode ser substituído por uma variável inteira

// Criação da sub-rotina como método da classe TMinhaClasse
procedure TMinhaClasse.Fatorial(num: integer);
var
  i, fat: integer;
begin
  fat := 1;
  for i := 1 to num do
    begin
      fat := fat * i;
    end;
  ShowMessage(IntToStr(fat)); // A função IntToStr() converte um valor inteiro numa string 
end;

// Chamada da sub-rotina como método do objeto meuObjeto
meuObjeto.Fatorial(5); // O número pode ser substituído por uma variável inteira

Sintaxe em C/C++ e JAVA

// Criação da sub-rotina
void NOME_SUB_ROTINA(TIPO PARAMETRO [{, TIPO PARAMETRO}]) {
    // bloco de comandos
}

// Chamada da sub-rotina
NOME_SUB_ROTINA(ARGUMENTO, [{, ARGUMENTO}]);

Utilização em C/C++:

// Criação da sub-rotina
void fatorial(int num) {
    int i, fat;
    fat = 1; 
    for (i = 1; i <= num; i++) {
        fat = fat * i;
    }
    printf("%d\n", fat);  // A máscara %d informa a função printf() que irá receber um valor inteiro
}

// Chamada da sub-rotina
fatorial(5); // O número pode ser substituído por uma variável inteira

// Criação da sub-rotina como método da classe MinhaClasse no C++
void MinhaClasse::fatorial(int num) {
    int i, fat;
    fat = 1; 
    for (i = 1; i <= num; i++) {
        fat = fat * i;
    }
    printf("%d\n", fat);  // A máscara %d informa a função printf() que irá receber um valor inteiro
}

// Chamada da sub-rotina como método do objeto meuObjeto no C++
meuObjeto.fatorial(5); // O número pode ser substituído por uma variável inteira

Utilização em JAVA:

// Criação da sub-rotina como método da classe MinhaClasse
public void fatorial(int num) {
    int fat;
    fat = 1; 
    for (int i = 1; i <= num; i++) {
        fat = fat * i;
    }
    System.out.println(fat);
}

// Chamada da sub-rotina como método do objeto meuObjeto
meuObjeto.fatorial(5); // O número pode ser substituído por uma variável inteira

Sintaxe em PHP

// Criação da sub-rotina
function NOME_SUB_ROTINA(PARAMETRO [{, PARAMETRO}]){
    // bloco de comandos
}

// Chamada da sub-rotina
NOME_SUB_ROTINA(ARGUMENTO [{, ARGUMENTO}]);

Utilização em PHP:

// Criação da sub-rotina
function fatorial($num) {
    $fat = 1;
    for ($i = 1; $i <= $num; $i++) {
        $fat = $fat * $i;
    }
    print $fat; // ou echo $fat;
}

// Chamada da sub-rotina
fatorial(5); // O número pode ser substituído por uma variável inteira

Sub-rotina com retorno e com parâmetros

Nesse caso, ao chamar a sub-rotina, será passado um número natural como argumento para calcular o fatorial. Ao terminar o calculo, a sub-rotina retornará o valor que foi calculado e este valor será atribuído a variável inteira resultado.

Obs.: Na sintaxe, os COLCHETES denotam uma parte opcional e as CHAVES indicam que partes podem ser repetidas indefinidamente ou omitidas completamente.

Sintaxe em PASCAL e DELPHI

// Criação da sub-rotina
function NOME_SUB_ROTINA(PARAMETRO: TIPO [{; PARAMETRO: TIPO}]): TIPO;
begin
  // bloco de comandos
  NOME_SUB_ROTINA := VALOR_RETORNO;
end;

// Chamada da sub-rotina
RETORNO := NOME_SUB_ROTINA(ARGUMENTO [{, ARGUMENTO}]);

Utilização em PASCAL:

// Criação da sub-rotina
function Fatorial(num: integer): integer;
var
  i, fat: integer;
begin
  fat := 1;
  for i := 1 to num do
    begin
      fat := fat * i;
    end;
  Fatorial := fat;
end;

// Chamada da sub-rotina
resultado := Fatorial(5); // O número pode ser substituído por uma variável inteira

Utilização em DELPHI:

// Criação da sub-rotina como biblioteca
function Fatorial(num: integer): integer;
var
  i, fat: integer;
begin
  fat := 1;
  for i := 1 to num do
    begin
      fat := fat * i;
    end;
  Fatorial := fat;
end;

// Chamada da sub-rotina como biblioteca
resultado := Fatorial(5); // O número pode ser substituído por uma variável inteira

// Criação da sub-rotina como método da classe TMinhaClasse
function TMinhaClasse.Fatorial(num: integer): integer;
var
  i, fat: integer;
begin
  fat := 1;
  for i := 1 to num do
    begin
      fat := fat * i;
    end;
  Fatorial := fat;
end;

// Chamada da sub-rotina como método do objeto meuObjeto
resultado := meuObjeto.Fatorial(5); // O número pode ser substituído por uma variável inteira

Sintaxe em C/C++ e JAVA

// Criação da sub-rotina
TIPO NOME_SUB_ROTINA(TIPO PARAMETRO [{, TIPO PARAMETRO}]) {
    // bloco de comandos
    return VALOR_RETORNO;
}

// Chamada da sub-rotina
RETORNO = NOME_SUB_ROTINA(ARGUMENTO, [{, ARGUMENTO}]);

Utilização em C/C++:

// Criação da sub-rotina
int fatorial(int num) {
    int i, fat;
    fat = 1; 
    for (i = 1; i <= num; i++) {
        fat = fat * i;
    }
    return fat;
}

// Chamada da sub-rotina
resultado = fatorial(5); // O número pode ser substituído por uma variável inteira

// Criação da sub-rotina como método da classe MinhaClasse no C++
int MinhaClasse::fatorial(int num) {
    int i, fat;
    fat = 1; 
    for (i = 1; i <= num; i++) {
        fat = fat * i;
    }
    return fat;
}

// Chamada da sub-rotina como método do objeto meuObjeto no C++
resultado = meuObjeto.fatorial(5); // O número pode ser substituído por uma variável inteira

Utilização em JAVA:

// Criação da sub-rotina como método da classe MinhaClasse
public int fatorial(int num) {
    int fat;
    fat = 1; 
    for (int i = 1; i <= num; i++) {
        fat = fat * i;
    }
    return fat;
}

// Chamada da sub-rotina como método do objeto meuObjeto
resultado = meuObjeto.fatorial(5); // O número pode ser substituído por uma variável inteira

Sintaxe em PHP

// Criação da sub-rotina
function NOME_SUB_ROTINA(PARAMETRO [{, PARAMETRO}]){
    // bloco de comandos
    return VALOR_RETORNO;
}

// Chamada da sub-rotina
RETORNO = NOME_SUB_ROTINA(ARGUMENTO [{, ARGUMENTO}]);

Utilização em PHP:

// Criação da sub-rotina
function fatorial($num) {
    $fat = 1;
    for ($i = 1; $i <= $num; $i++) {
        $fat = $fat * $i;
    }
    return $fat;
}

// Chamada da sub-rotina
resultado = fatorial(5); // O número pode ser substituído por uma variável inteira

Conclusão

As sub-rotinas são utilizadas para manter um conjunto de comandos que realizam determinadas tarefas em um único local, sempre que o desenvolvedor desejar executar a tarefa contida na sub-rotina basta fazer uma chamada a mesma. Essa técnica aumenta a legibilidade do código, facilitando futuras manutenções, sendo esse um dos grandes impulsionadores das sub-rotinas. Esse artigo apresentou os tipos de sub-rotinas, não se aprofundando em detalhes. Em artigos futuros serão apresentados exemplos mais detalhados.

Até o próximo artigo.