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.