Digamos que a ordem dos decorators seja:
@inspect()
@logarTempoDeExecucao()
// Método original ...
Os decorators serão aplicados na ordem exata em que aparecem, sem confusão! Abstraindo o objetivo de cada um deles, acontecerá o seguinte: o inspect
substituirá o método original por uma função que dentro dela cumpre seu objetivo (exibir no console as informação do método) e executa também o método original. O "método original", portanto, agora (após a substituição) é uma função que dentro dela chama o que de fato é o método original (por exemplo, o update
).
Agora, seguindo a ordem, será aplicado o logarTempoDeExecucao
, não no método update
, mas no novo "método original" (a função dada pelo inspect
que dentro dela executa o método original). Então, o logarTempoDeExecucao
subsitui novamente o "método original" por uma nova função, que, além de cumprir seu objetivo, executa também a função (inspect
, com seu objetivo) que dentro dela executa o método original (update
).
RESUMINDO: na prática, é excutada uma árvore: o logarTempoDeExecucao
chama o inspect
, que por sua vez chama o método original. Algo assim:
function logarTempoDeExecucao() {
// Lógica do logarTempoDeExecucao
function inspect() {
// Lógica do inspect
function update() {
// O método da classe
}
update();
// Lógica do inspect
}
inspect();
// Lógica do logarTempoDeExecucao
}
logarTempoDeExecucao();
E é por isso que no console do professor aparece as informações do inspect
e, no meio delas, o tempo de excução. O professor declarou o logarTempoDeExecucao
antes do inspect
, e dentro do inspect
, mandou, nesta ordem: exibir o nome do método, exibir seus parâmetros, executar o método (que nesse caso continha o logarTempoDeExecucao
aplicado porque este foi declarado primeiro) e então exibir o retorno.
Na ordem em que eu declarei os decorators, o logarTempoDeExcucao
medirá o tempo de execução tanto do update
(método original) quanto do inspect
(e quaisquer outros decorators declarados antes dele), conforme a árvore acima, o que não necessariamente é o correto, visto que esses decorators não irão para produção (só queremos saber se o update
apresenta um bom desempenho para produção).
Espero que tenha te ajudado a entender. Achei as explicações do professor e da tarefa sobre isso bem vagas. Tentei simplificar ao máximo. Abraço!