O MVC é um exercício em Separação de dúvidas , uma arquitetura de interface do usuário. É uma forma de corrigir a complexidade que pode ocorrer nas interfaces do usuário devido à apresentação não ser separada do conteúdo .
Em teoria, todos os objetos podem ter comportamentos que operam nos dados que contêm e que os dados e o comportamento permanecem encapsulado . Na prática, um determinado objeto OOP pode ou não ter uma lógica que corresponda aos seus dados, ou pode não ter nenhuma lógica (um Data Transfer Object , por exemplo).
No MVC, a lógica de negócios entra no modelo, não no controlador. O controlador é realmente apenas um intermediário para unir o View e o Model. Assim, no modelo, você pode ter dados e comportamento no mesmo lugar.
Mas mesmo esse arranjo não garante fusão estrita de dados / comportamento. Objetos contendo apenas dados podem ser operados por outras classes contendo apenas lógica, e este é um uso perfeitamente aceitável da OOP.
Vou dar um exemplo específico. Isso é um pouco inventado, mas digamos que você tenha um objeto Currency
, e esse objeto tem a capacidade de se representar em qualquer moeda disponível, atrelada ao dólar. Então você teria métodos como:
public decimal Yen { get { return // dollars to yen; } }
public decimal Sterling { get { return // dollars to sterling; } }
public decimal Euro { get { return // dollars to euro; } }
... e esse comportamento seria encapsulado com o objeto Currency.
Mas e se eu quisesse transferir a moeda de uma conta para outra ou depositar alguma moeda? Esse comportamento também seria encapsulado no objeto Currency? Não, não seria. O dinheiro na sua carteira não pode ser transferido da sua carteira para a sua conta bancária; você precisa de um ou mais agentes (um caixa ou caixa eletrônico) para ajudar a obter o dinheiro em sua conta.
Assim, esse comportamento seria encapsulado em um objeto Teller
e aceitaria Currency
e Account
objetos como entradas, mas não conteria nenhum dado em si, exceto talvez um pouco do estado local (ou talvez um objeto Transaction
) para ajudar a processar os objetos de entrada.