Olá, 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 sub-rotinas e a sua aplicabilidade no código-fonte. Para a maioria dos desenvolvedores não será nenhuma novidade.
Introdução
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 sub-rotina é criada principalmente para permitir que a mesma tarefa seja reutilizada em vários pontos do software.
Criar sub-rotinas 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, Sub-rotinas 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 Sub-rotinas no seu código e não sabe!
Exemplo de sub-rotina
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:
1 2 3 4 5 6 7 8 9 10 11 12 |
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.
Bom, basta alterar o código, certo? Porém, 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! Que problemão, hein?
No entanto, se nós fizermos uma refatoração desse código em uma sub-rotina, não teremos este problema!
Para isso, criaremos um método chamado CalcularTotal
e colocar todo o código para o cálculo do total do pedido dentro deste método:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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 o método recém-criado:
1 |
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 sub-rotina e o resultado será refletido automaticamente para os eventos que a chamarem.
Tipos de sub-rotina
Uma sub-rotina 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 apresentar na prática, vamos avançar um pouco mais e alterar a nossa SubRotina. No exemplo abaixo, eu forneço o desconto como parâmetro e obtenho o valor total como retorno:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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:
1 |
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!
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.
Exatamente, André. Essa é a grande vantagem de refatorar a regra de negócio em apenas um método. Obrigado pelo comentário!
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á.
Olá, Juliana! Em primeiro lugar, obrigado pela visita e pelo comentário. Vou entrar em contato com você por e-mail, ok?
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.
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!
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.
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!
Eu li em muitos locais na internet sobre o assunto, e posso dizer que esse foi o artigo sobre o assunto bem conciso e claro
Muito obrigado, FabrÃcio! 🙂
Aproveite para ler também outros artigos relacionados com Clean Code!
Abraço!
Bom dia, André. Ontem fui sacar o pagamento do meu pai. E na tela do caixa econômica saiu um texto com as seguintes palavras Sub rotina Bcotcao oq quer dizer?
Olá, Josiane.
Parece ter sido um problema técnico do sistema da Caixa Econômica.
Mas não se preocupe: normalmente os sistemas bancários são capazes de abortar qualquer operação em caso de erro, justamente para não prejudicar o dinheiro do cliente.
No entanto, se você estiver insegura, sugiro ir até à agência. Se você tiver uma foto do erro é melhor ainda.
Abraço!