Refatorando Delphi: Como Desmontar o "God Form" (Objeto Deus) e Salvar Seu Projeto da Dívida Técnica!

Vamos montar um caso prático completo de refatoração e modularização em Delphi, iniciando com um problema real e mostrando as etapas de diagnóstico, refatoração e resultado final, com exemplos de código em cada fase.

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.

30%
OFF

🔥 BLACK FRIDAY

Componentes Delphi
com desconto imperdível!

APROVEITAR AGORA
Válido até 29/11/2025
Produtos em promoção:
TPagSeguro TMercadoPago TAsaas TGroq E mais...