Cenário Inicial
Um sistema de vendas Delphi possui uma tela principal de pedidos (TFormPedidos) responsável por validar, processar e salvar pedidos, além de atualizar diversas partes da interface. Toda a lógica está centralizada, dificultando manutenção, testes e evolução.
Código legado:
procedure TFormPedidos.BtnProcessarClick(Sender: TObject); begin // Validação if EdtCliente.Text = '' then ShowMessage('Selecione o cliente!') else if EdtValor.Text = '' then ShowMessage('Informe o valor!') else begin // Processar pedido DMBaseDados.qryPedidos.Append; DMBaseDados.qryPedidos.FieldByName('CLIENTE').AsString := EdtCliente.Text; DMBaseDados.qryPedidos.FieldByName('VALOR').AsFloat := StrToFloat(EdtValor.Text); DMBaseDados.qryPedidos.Post; // Atualizar interface LblStatus.Caption := 'Pedido processado!'; EdtCliente.Text := ''; EdtValor.Text := ''; end; end;
Problemas:
Código misturando UI, validação, acesso a dados.
Lógica duplicada em outros formulários.
Dificuldade para testar sem interface.
Diagnóstico das Principais Dores
"God Form": uma única tela faz tudo.
Dependência direta do DataModule, dificultando troca da fonte de dados.
Lógica de negócios espalhada na interface.
Etapa 1: Separação da Lógica de Negócio
Crie uma classe dedicada para processar o pedido, realizando validação e salvando dados.
type TPedidoService = class public function ValidarPedido(const Cliente, Valor: string): Boolean; procedure SalvarPedido(const Cliente: string; Valor: Double); end; function TPedidoService.ValidarPedido(const Cliente, Valor: string): Boolean; begin Result := (Cliente <> '') and (Valor <> ''); end; procedure TPedidoService.SalvarPedido(const Cliente: string; Valor: Double); begin DMBaseDados.qryPedidos.Append; DMBaseDados.qryPedidos.FieldByName('CLIENTE').AsString := Cliente; DMBaseDados.qryPedidos.FieldByName('VALOR').AsFloat := Valor; DMBaseDados.qryPedidos.Post; end;
Etapa 2: Refatorando o Formulário
O formulário agora apenas orquestra a interação, utilizando o serviço dedicado.
procedure TFormPedidos.BtnProcessarClick(Sender: TObject); var PedidoService: TPedidoService; begin PedidoService := TPedidoService.Create; try if not PedidoService.ValidarPedido(EdtCliente.Text, EdtValor.Text) then ShowMessage('Preencha os dados corretamente!') else begin PedidoService.SalvarPedido(EdtCliente.Text, StrToFloat(EdtValor.Text)); LblStatus.Caption := 'Pedido processado!'; EdtCliente.Text := ''; EdtValor.Text := ''; end; finally PedidoService.Free; end; end;
Etapa 3: Modularizando Acesso aos Dados
Separe o acesso ao banco em um DataModule dedicado.
type TDMPedidos = class(TDataModule) qryPedidos: TFDQuery; procedure SalvarPedido(const Cliente: string; Valor: Double); end; procedure TDMPedidos.SalvarPedido(const Cliente: string; Valor: Double); begin qryPedidos.Append; qryPedidos.FieldByName('CLIENTE').AsString := Cliente; qryPedidos.FieldByName('VALOR').AsFloat := Valor; qryPedidos.Post; end;
O serviço chama o DataModule, facilitando testes e futura troca da persistência.
procedure TPedidoService.SalvarPedido(const Cliente: string; Valor: Double); begin DMPedidos.SalvarPedido(Cliente, Valor); end;
Etapa 4: Testando a Lógica Fora da Interface
Agora é possível testar a regra de negócio sem interface gráfica:
procedure TestePedido; var PedidoService: TPedidoService; begin PedidoService := TPedidoService.Create; try if PedidoService.ValidarPedido('João', '100') then PedidoService.SalvarPedido('João', 100); finally PedidoService.Free; end; end;
Resultado Final: Ganhos
Manutenção simplificada: cada parte do sistema tem uma responsabilidade clara.
Testes mais fáceis: regras de negócio podem ser testadas isoladamente.
Reutilização: lógica do pedido pode ser usada em automações, serviços, sem depender da UI.
Escalabilidade: possibilita incluir novas regras ou alterar a persistência sem mexer em dezenas de formulários.
Este caso pode ser adaptado para qualquer regra de negócio: basta substituir “Pedido” e seus campos pelas funcionalidades desejadas. Podemos explorar exemplos mais avançados, como uso de interfaces, events ou patterns, além de dicas para modularizar grandes sistemas reais de legado!
Assista o vídeo sobre o tema: https://youtu.be/aUOWe_fhesY
Comentários (0)
Deixe um Comentário
Seja o primeiro a comentar!
Compartilhe sua opinião sobre este artigo.