TheCodeNaked

Execução paralela com elegância no Delphi - Episódio 4 (Copy)

Criando plugins de tarefa: reuso, clareza e padrão

No episódio anterior, mostramos como o TTaskChain permite encadear execuções assíncronas com controle total: progresso, cancelamento, erros e sincronização com a UI. Agora vamos dar um passo além:

Como reaproveitar tarefas que se repetem? Como evitar escrever a mesma lógica (baixar imagem, mostrar progresso, tratar erro) várias vezes?

A resposta: criando tarefas plugináveis, como se fossem módulos reutilizáveis para cada etapa.


O conceito de tarefa pluginável

Uma tarefa plugin é uma função que recebe os callbacks padrões OnSuccess e OnError e já encapsula toda a lógica interna:

type
  TChainTask = reference to procedure(
    const TaskName: string;
    OnTaskSuccess: TProc;
    OnTaskError: TErrorCallback
  );

Com isso, você pode transformar qualquer padrão em uma tarefa reusável:

function CreateDownloadImageTask(const URL: string; BitmapTarget: TBitmap): TChainTask;
begin
  Result := procedure(const TaskName: string; OnSuccess: TProc; OnError: TErrorCallback)
  begin
    var Params := TSafeThreadParams.New
      .SetOnExecute(
        procedure(Context: TThreadContext)
        begin
          // Download da imagem aqui
          // Em caso de sucesso: OnSuccess()
          // Em caso de erro: OnError('Erro ao baixar imagem')
        end)
      .SetOnError(OnError)
      .SetOnSuccess(procedure(Context: TThreadContext)
        begin
          OnSuccess();
        end);

    TSafeThread.ExecuteThread(Params);
  end;
end;

Montando a cadeia com plugins

Com isso, o uso é direto e elegante:

TaskChain := TTaskChain.Create(True);
TaskChain.AddTask('Imagem 1', CreateDownloadImageTask(URL1, Image1.Bitmap));
TaskChain.AddTask('Imagem 2', CreateDownloadImageTask(URL2, Image2.Bitmap));
TaskChain.SetProgressCallback(UpdateProgressUI);
TaskChain.Start;

Ficou limpo, modular e sem repetições. Se quiser adicionar timeout, cache, ou salvar em disco, basta alterar o plugin.


Benefícios

  • Reuso: uma mesma tarefa pode ser usada em várias telas ou aplicações
  • Testabilidade: fácil de testar separadamente
  • Manutenção simples: alteração em um lugar só
  • Encapsulamento real: quem chama não precisa saber como funciona

No próximo episódio, vamos expandir ainda mais:

Plugins carregados dinamicamente via JSON, permitindo que a cadeia de tarefas seja configurável em tempo de execução, por arquivos externos ou serviços REST.

Estamos apenas no começo.


"Código limpo não é o que segue regras, mas o que revela intenção com clareza."

Nos vemos no episódio 5.

Sobre o autor

TheCodeNaked

No TheCodeNaked, programar é consequência, não ponto de partida. Antes do código, vem a dúvida, a análise, o contexto. Não seguimos fórmulas — questionamos. Criar software é pensar com clareza. O resto é só digitação.

TheCodeNaked

Criar com clareza. Codificar com intenção.

TheCodeNaked

Ótimo! Você se inscreveu com sucesso.

Bem-vindo de volta! Você acessou com sucesso.

Você se inscreveu com sucesso o TheCodeNaked.

Sucesso! Verifique seu e-mail para acessar com o link mágico.

As suas informações de faturamento foram atualizadas.

Seu pagamento não foi atualizado