Os benefícios de utilizar SubRotinas

SubRotinaOlá, pessoal, tudo certo?
Antes de se chamar “AndreCelestino.com”, o blog foi originalmente criado com o nome “SubRotina” para fazer alusão às técnicas de programação. Bom, depois de receber algumas sugestões e dúvidas sobre este termo, decidi elaborar esse artigo para apresentar o conceito e as vantagens das SubRotinas e a sua aplicabilidade no código-fonte. Para a maioria dos desenvolvedores não será nenhuma novidade.

 

Afinal, o que é SubRotina?
É o nome do blog, rsrs.
Brincadeiras à parte, SubRotina (também conhecido como Sub-Rotina) é o nome dado a um conjunto de códigos destinado a cumprir uma determinada tarefa dentro do software. São métodos que realizam operações rotineiras em várias partes do sistema, evitando que o código dessas operações sejam duplicados. Normalmente uma SubRotina é criada principalmente para permitir que a mesma tarefa seja reutilizada em vários pontos do software.


Qual a vantagem?

Criar SubRotinas no sistema colabora para a redução da redundância de código e permite que este código seja reutilizado sem a necessidade de reescrevê-lo. Além disso, SubRotinas podem melhorar a visualização e interpretação do código-fonte, já que ele proporciona maior organização das linhas de código. Provavelmente você já usa SubRotinas no seu código e não sabe!


Ainda não vi vantagem…

Talvez com um exemplo fique mais claro!
Imagine um sistema para emissão de pedidos onde, para calcular o total, temos que executar um laço de repetição nos itens adicionados ao pedido:

var
  Total: real;
begin
  Total := 0;
  DataSetItensPedido.First;
  While not (DataSetItensPedido.EOF) do
  begin
    Total := Total + DataSetItensPedidos.FieldByName('Total').AsFloat;
    DataSetItensPedido.Next;
  end;
  Label1.Caption := 'Total do Pedido: ' + FloatToStr(Total);
end;

O código acima soma o total dos itens e em seguida informa o valor total na Label1. Para que o valor exibido na Label1 seja sempre o valor total atualizado, precisamos colocar esse código em três locais diferentes do sistema: ao inserir, excluir e alterar o item, concorda? Lógico, qualquer uma dessas três operações tem influência no valor total do pedido, então é necessário executar o código acima para recalculá-lo.
Pois bem, agora imagine que o nosso cliente solicitou um campo de desconto na tela, e que o total do pedido agora deve calculado respeitando este desconto que ele informar.


Oras, basta alterar o código, não é?

Isso mesmo, mas observe que o código terá que ser alterado três vezes: na inserção, na exclusão e na alteração de itens. Vamos supor que, por uma falha de programação, apenas os códigos de inserção e alteração de itens foram atualizados. Resultado: ao excluir um item, o valor total será calculado de forma errada, já que ele não contempla o valor do desconto! Vixe, que problemão, hein?
Bom, se nós fizermos uma refatoração desse código em uma SubRotina, não teremos este problema!

 

E como faremos isso?
Simples! Vamos criar um método chamado CalcularTotal e colocar todo o código para o cálculo do total do pedido dentro deste método:

procedure CalcularTotal;
var
  Total: real;
  Desconto: real;
begin
  Total := 0;
  Desconto := StrToFloat(edtDesconto.Text); // obtém o desconto informado
  DataSetItensPedido.First;
  While not (DataSetItensPedido.EOF) do
  begin
    Total := Total + DataSetItensPedidos.FieldByName('Total').AsFloat;
    DataSetItensPedido.Next;
  end;
  Total := Total - (Total * (Desconto / 100)); // aplica o desconto
  Label1.Caption := 'Total do Pedido: ' + FloatToStr(Total);
end;

A partir de agora, nos eventos de inserção, alteração e exclusão do item, ao invés de escrever todo o código para calcular o total, basta chamar a André:

CalcularTotal;

Olha só que interessante: reduzimos linhas de código, melhoramos a organização e criamos uma rotina que pode ser chamada em diferentes locais do código! Além disso, se surgir a necessidade de alterar a regra do cálculo do total, basta alterar somente na SubRotina e o resultado será refletido automaticamente para os eventos que a chamarem.


Ouvi falar que existem “tipos” de SubRotinas, é isso mesmo?

Sim. Na verdade são tipos de métodos, ou seja, uma SubRotina pode ser um procedimento ou uma função. Um procedimento apenas executa uma porção de código, sem retornar nenhum valor para o chamador. Já a função retorna um valor, muito útil para regras de validação, formatação de conteúdo e verificação de valores.
Para mostrar na prática, vamos avançar mais um pouco e alterar a nossa SubRotina. No exemplo abaixo, eu forneço o desconto como parâmetro e obtenho o valor total como retorno:

function CalcularTotal(Desconto: real): real;
var
  Total: real;
begin
  Total := 0;
  DataSetItensPedido.First;
  While not (DataSetItensPedido.EOF) do
  begin
    Total := Total + DataSetItensPedidos.FieldByName('Total').AsFloat;
    DataSetItensPedido.Next;
  end;
  Total := Total - (Total * (Desconto / 100));
  result := Total;
end;

Se o cliente conceder 10% de desconto, basta chamar a SubRotina dessa forma:

Label1.Caption := FloatToStr(CalcularTotal(10));

 

Pois bem, pessoal, este foi apenas um breve artigo sobre essa técnica de refatoração de código que pode ajudar (e muito) no desenvolvimento de um software.

 

Semana que vem estou de volta!
Abraços!


 

Compartilhe!
Share on FacebookTweet about this on TwitterShare on LinkedInShare on Google+Pin on PinterestEmail this to someone

8 comentários

  1. Pra quem já sofreu com uma alteração em um sistema, onde o calculo de juros (que tinha umas 30 linhas +/-) estava em cada lugar do sistema, ao invés de uma função. A partir desse momento, utilizo função sempre que for possível.

    Um erro pode dar um baita problema, mas arrumando em apenas um lugar, todo o restante estará resolvido.

  2. Prezado André Luís, hoje comecei materiais para aprender C e C++. Vi tudo muito rapidamente e nesse rapidamente deparei com seu blog. Caso seja possível quero sua ajuda na indicação de materiais para aprender a programar nessas linguagens. O que você recomenda? Grata desde já.

  3. Olá, Boa Tarde.

    Em um trabalho exatamente sobre subrotinas acabei entrando aqui e gostei muito de saber o que é a subrotina, sou iniciante na área de programação e saber que há uma solução para caso o código ser muito grande já é um grande alívio. Gostei da matéria e do blog,Abraço.

    1. Boa tarde, Adelber!
      Exatamente, subrotinas são criadas justamente para reduzir o código e garantir uma implementação mais legível. Boa sorte na sua carreira na área de programação!
      Obrigado pelo comentário! Abraço!

  4. Boa noite, André.
    Desde a primeira vez que vi sub-otinas, na verdade, “gosub” no basic, gostei e comecei a tentar usar. Ajudava, mas o código era confuso. No Dbase já eram procedures. Tudo que vou executar mais de uma vez tento colocar em subrotinas.
    Como já criei muitas com varias funções, reaproveito elas em novos programas. Basta eu colocar a unit (dll.pas) na pasta do projeto e adicionar ela para usar as procedures e funções. Se implemento novas subrotinas ou melhoro alguma, coloco ela na pasta do projeto, atualizo e recompilo. Tem que fazer para todos em uso, mas é bem mais fácil que procurar no código de cada projeto e alterar.
    Na verdade usei esta solução porque tive dificuldade de conseguir retorno de string quando tentei criar uma DLL.
    O que acha dessa prática?

    Abraço.

    1. Muito bom, Gerson! Eu considero que o reaproveitamento de código é uma técnica indispensável em um projeto. Alguns até criam componentes para essa finalidade. 🙂
      Eu também utilizo uma unit com funções comuns, que, na verdade, é uma classe estática que pode ser utilizada em qualquer local da aplicação sem a necessidade de instanciá-la. A maioria das funções de conversão de valores, validações, tratamentos e formatações estão contidas nessa classe. Como você disse, a vantagem é que ela pode ser compartilhada em outros projetos, evitando tempo e esforço nas codificações.
      Criar uma DLL com essas funções também é uma ótima opção, já que permite o compartilhamento não só entre projetos, mas também entre linguagens.

      Abraço!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Preencha o campo abaixo * Time limit is exhausted. Please reload CAPTCHA.