Neste post compartilho algumas anotações sobre MVC que fiz lendo o livro Learning JavaScript Design Pattern do Addy Osmani.
- Um Model representava dados específicos do domínio e desconhecia a UI (Views e Controllers). Quando um modelo mudava, ele informava seus observers.
- Uma View representava o estado atual de um Model. O padrão Observer era usado para que a View soubesse sempre que o Model fosse atualizado ou modificado.
- A View cuidava da apresentação, mas não havia apenas uma única View e Controller - um par View-Controller era necessário para cada seção ou elemento exibido na tela.
- O papel do Controller neste par era lidar com a interação do usuário (como pressionar uma tecla ou a ação de clicar) e tomar decisões para a View.
Resumindo
- Model são dados de negócio.
- View em JavaScript constrói e organiza uma coleção de elementos DOM.
- A tarefa de atualizar o Model é do Controller.
Exemplo
O photoModel
adiciona nosso callback render()
como um de seus subscribers para que possamos atualizar a View quando o Model for atualizado usando o padrão Observer.
Quando um usuário clica em algum elemento da View, não é responsabilidade da View saber o que fazer depois. Ela confia no Controller para tomar esta decisão.
const buildPhotoView = (photoModel, photoController) => {
const photoEl = document.createElement('div')
const render = () => {
/* ... */
}
photoModel.addSubscriber(render)
photoEl.addEventListener('click', () => {
photoController.handleEvent('click', photoModel)
})
}
Templates não são Views. Uma View é um objeto que observa um Model e mantém a representação visual atualizada. Views representam os dados da aplicação visualmente, e templates podem ser usados para gerar Views.
Na visão da GoF o MVC é uma variação de três design patterns clássicos: Observer, Strategy e Composite. Dependendo da implementação. ele também pode usar os padrões Factory e Template Methods.