Frequentemente, quando eu desenho um programa com MVC, o controlador é inútil na metade do tempo.
O que quero dizer é o seguinte: algo acontece na visualização (por exemplo, um clique no botão). A vista então notifica o controlador. O controlador delega diretamente ao modelo e não faz mais nada porque não tem nada a fazer.
Por exemplo:
O usuário pressiona o botão 'Cor azul'> a visualização informa ao controlador controller.colorBlue()
> o controlador informa o modelo model.colorBlue()
> o modelo colore algo azul.
Neste exemplo, o controlador parece inútil. Não acrescenta nada. A visão também poderia ter falado diretamente com o modelo.
Na outra metade do tempo, no entanto, o controlador faz algum tipo de mediação entre a visualização e o modelo.
Minha pergunta é a seguinte: quão comum isso é nas estruturas MVC? É razoável que metade do tempo meu controlador pareça desnecessário? Ou isso é um problema? Isso é comum? Como devo abordar isso?
Se minha pergunta não estiver clara o suficiente, diga-o.
fonte
controller.colorBlue()
realmente chamarmodel.setColor(0, 0, 255);
. Um motivo para a separação entre Model e View é que geralmente há vários elementos da interface do usuário para representar um único estado no modelo (por exemplo, um item é verificado no menu, a barra de ferramentas é pressionada e o ponteiro é alterado para um preenchimento icon all corresponde ao campo de ferramentas atualmente selecionado no modelo), com a separação do MVC, o modelo não precisaria se preocupar em sincronizar os diferentes elementos da interface do usuário.Respostas:
Você está subestimando a importância de ter uma camada de abstração entre a interface do usuário e o modelo. O controlador cumpre essa função 100% do tempo.
Seu exemplo
model.colorBlue()
é um pouco ilusório. Em um modelo real, isso provavelmente seria um método CRUD. Portanto, seu botão pode ser um botão Criar Cliente, seu método de controladorCreateCustomer()
e seu ModeloCreateCustomer()
. Claro, você está apenas passando a ligação.Mas e se você precisasse mudar a maneira como o modelo funciona? Se o seu View estava chamando seu modelo diretamente, seu aplicativo será interrompido se você alterar o modelo. Os métodos do controlador fornecem um "ponto de acesso" para o seu View; você pode fazer uma modificação simples no método do controlador, talvez alterando a chamada Model para
CreateCustomerWithVerification()
, e tudo ainda funcione.O mesmo raciocínio se aplica a ter uma Camada de Serviço. Em vez de simplesmente ter métodos CRUD em seu modelo, você deve ter ações de negócios. Dessa forma, você mantém a lógica comercial fora de seus controladores e possibilita o uso do Modelo em outro lugar, talvez em um aplicativo WPF.
Pense no controlador como um "pátio de manobra". Deve ser um intermediário, solicitações de mediação entre sua interface do usuário e seu modelo, mas os métodos do controlador devem ter a menor lógica possível.
fonte
Ao codificar, você pode pensar desta maneira:
No seu caso, parece que você está colocando a lógica de domínio no modelo e isso causaria problemas se você quiser alterá-la: você terá que copiar métodos como "model.colorBlue" para o novo modelo.
E o que aconteceria se a definição de "azul" mudar? Você terá que mudar 2 modelos. Também no controlador, você não deve escrever diretamente no seu banco de dados, mas como Lie Ryan apontou, você deve usar
model.setColor
.Mesmo com vistas. Se você começar a colocar a lógica ou a validação em exibição, se desejar alterar a exibição, precisará copiar toda essa funcionalidade.
fonte