Oi Dilon, tudo bem?
Entendo que o padrão de design Decorator pode parecer confuso no início, mas vou tentar explicar. O Decorator é um padrão de design que permite adicionar comportamentos extras a um objeto de forma dinâmica, sem alterar sua estrutura básica. Ele é útil quando temos a necessidade de estender as funcionalidades de um objeto de maneira flexível.
No caso específico que você mencionou, onde você seta uma constante que recebe uma função, que por sua vez recebe uma segunda função como parâmetro e retorna uma terceira função, estamos lidando com um exemplo de uso do Decorator pattern. Essa terceira função utiliza a segunda função recebida para manipular e retornar as props desejadas.
Embora possa parecer complicado à primeira vista, o padrão Decorator traz algumas vantagens. Vou destacar algumas delas:
Extensibilidade: O Decorator permite adicionar comportamentos adicionais a um objeto de forma flexível, sem modificar seu código original. Isso é especialmente útil quando temos um conjunto de comportamentos diferentes que podem ser combinados ou alterados dinamicamente.
Separação de responsabilidades: Com o Decorator, podemos dividir a funcionalidade em diferentes camadas. Cada decorador tem uma responsabilidade específica, o que facilita a compreensão e a manutenção do código.
Reutilização de código: Ao usar o Decorator, podemos criar vários decoradores diferentes que fornecem funcionalidades adicionais. Esses decoradores podem ser usados em diferentes objetos, promovendo a reutilização de código.
A respeito da sua pergunta sobre por que colocamos a session dentro do contexto, essa é uma boa pergunta. Colocar a session no contexto é uma prática comum quando estamos trabalhando com sistemas que necessitam compartilhar informações em vários componentes.
Ao colocar a session no contexto, podemos acessá-la facilmente em qualquer lugar da nossa aplicação, sem a necessidade de passá-la explicitamente entre os componentes. Isso é particularmente útil quando precisamos acessar a session em componentes aninhados ou em componentes que não estão diretamente relacionados.
Por exemplo, suponha que temos uma função que retorna as props e precisamos acessar a session nessa função. Se passarmos a session diretamente para essa função, seria necessário passá-la por vários níveis de componentes, tornando o código mais complexo e propenso a erros.
Ao colocar a session no contexto, podemos simplesmente acessá-la em qualquer componente usando o contexto, sem a necessidade de passar explicitamente a session como argumento. Isso simplifica o código e torna a comunicação entre os componentes mais eficiente.
Espero que essa explicação tenha esclarecido suas dúvidas sobre o Decorator pattern e o uso do contexto para a session. Lembre-se de que, com a prática e a familiarização, esses conceitos se tornarão mais claros e naturais para você.
Um abraço e bons estudos.