Proposta de adoção de decorators funcionaais em projetos typescript para melhorar a modularidade e flexibilidade do código. O padrão de decoradores permite adicionar comportamentos adicionais a funções existentes sem a necessidade de modificar diretamente o código dessas funções.
O padrão de decorator é uma técnica de design que segue o princípio aberto/fechado do SOLID, permitindo a extensão de funcionalidades sem modificar o código existente. Os decorators funcionais são funções que envolvem outras funções para adicionar ou alterar comportamentos.
type AnyFn = (...args: any) => any;
type DecoratedFn<Fn extends AnyFn> = (...args: Parameters<Fn>) => ReturnType<Fn>;
type DecoratorFn = <Fn extends AnyFn>(fn: Fn) => DecoratedFn<Fn>;
function withTimer<Fn extends AnyFn> (fn: Fn): DecoratedFn<Fn> {
return (...args: Parameters<Fn>) => {
console.time(fn.name);
const result: ReturnType<Fn> = fn(...args);
console.timeEnd(fn.name);
return result;
};
}
type WithTimer<Fn extends AnyFn> = DecoratedFn<Fn>
function withTimer<Fn extends AnyFn> (fn: Fn): WithTimer<Fn> {
return (...args: Parameters<Fn>) => {
console.time(fn.name)
const result: ReturnType<Fn> = fn(...args)
console.timeEnd(fn.name)
return result
}
}
type WithLogger<Fn extends AnyFn> = DecoratedFn<Fn>
function withLogger<Fn extends AnyFn> (fn: Fn): WithLogger<Fn> {
return (...input: Parameters<Fn>) => {
const output: ReturnType<Fn> = fn(...input)
console.log({ fn: fn.name, input, output })
return output
}
}
A adoção do padrão de decoradores proporciona os seguintes benefícios para o Projeto X:
- Flexibilidade: Permite adicionar facilmente funcionalidades adicionais a funções existentes.
- Legibilidade: Torna o código mais legível ao isolar comportamentos específicos em decoradores.
- Manutenção: Facilita a manutenção e extensão do código sem alterar a lógica original.