O MVC é um exercício em Separation of Concerns , uma arquitetura de interface do usuário. É uma maneira de diminuir a complexidade que pode ocorrer nas interfaces do usuário, pois a apresentação não está separada do conteúdo .
Em teoria, todos os objetos podem ter um comportamento que opera nos dados que eles contêm, e esses dados e comportamento permanecem encapsulados . Na prática, um determinado objeto OOP pode ou não ter lógica que corresponda aos seus dados ou pode não ter nenhuma lógica (um Objeto de Transferência de Dados , 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 colar a View e o Model. Portanto, no modelo, você pode ter dados e comportamento no mesmo local.
Mas mesmo esse arranjo não garante uma fusão estrita de dados / comportamento. Objetos contendo apenas dados podem ser operados por outras classes contendo apenas lógica, e esse é um uso perfeitamente aceitável do OOP.
Vou te dar um exemplo específico. Isso é um pouco artificial, mas digamos que você tenha um Currency
objeto, e esse objeto tenha 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 da sua carteira não pode ser transferido da sua carteira para a sua conta bancária; você precisa de um ou mais agentes (caixa ou caixa eletrônico) para ajudar a colocar esse dinheiro em sua conta.
Assim que esse comportamento possa ser encapsulado em um Teller
objeto, e ele aceitaria Currency
e Account
objetos como entradas, mas não iria conter todos os dados em si, exceto, talvez, um pouco de estado local (ou talvez um Transaction
objeto) para ajudar a processar os objetos de entrada.