Exemplo de implementação de uma (View/Screen)
Camada | Tipo | Dependência |
---|---|---|
SampleProvider | Componente | - |
SampleModel | Interface | - |
SampleViewModel | Classe | - |
SampleController | Componente | ViewModel |
SampleView | Componente | - |
Responsável por criar a instância da ViewModel, injetá-la no Controller e retornar esse mesmo Controller.
🚀 Insights
- Pode ser eliminado ao automatizar a injeção da dependência dentro do Controller
- É o ponto inicial da estrutura
É uma Interface responsável por definir os contratos de entrada e saída de dados da View/Screen.
🚀 Insights
- Pode extender uma interface base, tipo CRUD para definir padrões de atualização e busca de dados
- É o único contrato entre a camada de Domínio (Regra de negócios) e a ViewModel
Sua responsabilidade é implementar o Model, pode realizar transformações de dados que o Domínio (Regra de negócios) espera, tratar respostas para a camada de View e capturar e monitorar as respostas e as requisições feitas para a camada de Domínio.
Responsável por controlar estados relativos a View/Screen (exceto estados específicos de regra de UI, por exemplo: estados de controle de animações). Recebe a referência a ViewModel e sempre à utiliza para realizar operações.
Os hooks podem receber a referência de ViewModel através do Controller e nunca ficam acoplados com a camada de domínio.
Última camada da estrutura, apenas recebe parâmetros, não consome hooks (exceto casos que o hook manipule apenas visualização dessa própria View). Sua única forma de comunicação é via funções de callback. Em resumo é apenas o Layout, importa e utiliza componentes mais simples para montar o resultado final.
✅ Toda View é uma tela, garante consistência
✅ Toda tela terá um contrato com a camada de Domínio
✅ A manutenção é facilitada, nenhuma regra se mistura
✅ Fácil migração para outros frameworks e plataformas, a camada de ViewModel não conhece a View, e vice-versa.
✅ Inversão de controle e injeção das dependências
✅ Fácil de testar
✅ Fácil de documentar
❌ Complexidade inicial, sair do completo zero até esse padrão pode ser um pouco difícil
❌ Maior quantidade de arquivos para serem criados. Pode ser resolvido com PlopJS
❌ Pode ser necessário adicionar/criar plugins ESLINT para impedir que má-práticas, como nomeclaturas incorretas e/ou utilização de um não-padrão voltem a acontecer