The main idea behind OOP is to unify data and behavior in a single entity - the object. In procedural programming there is data and separately algorithms modifying the data. 

In the Model-View-Controller pattern the data and the logic/algorithms are placed in distinct entities, the model and the controller respectively. In an equivalent OOP approach shouldn't the model and the controller be placed in the same logical entity?

MVC is an exercise in Separation of Concerns, a UI architecture.  It is a way to corral the complexity that can occur in user interfaces due to the presentation not being separated from the content.  

In theory, all objects can have behavior that operate on the data they contain, and that data and behavior remain encapsulated.  In practice, a given OOP object may or may not have logic that corresponds to its data, or may not have any logic at all (a Data Transfer Object, for example).

In MVC, the business logic goes in the model, not the controller. The controller is really just a go-between to glue together the View and the Model. So in the model, you can have data and behavior in the same place. 

But even that arrangement does not guarantee strict data/behavior fusion.  Objects containing only data can be operated on by other classes containing only logic, and this is a perfectly acceptable use of OOP.



I'll give you a specific example. This is a bit contrived, but let's say you have a Currency object, and that object has the ability to represent itself in any available currency, pegged to the dollar.  So you would have methods like:

public decimal Yen { get { return // dollars to yen; } }
public decimal Sterling { get { return // dollars to sterling; } }
public decimal Euro { get { return // dollars to euro; } }


...and that behavior would be encapsulated with the Currency object.  

But what if I wanted to transfer the currency from one account to another, or deposit some currency?  Would that behavior also be encapsulated in the Currency object?  No, it wouldn't.  The money in your wallet cannot transfer itself out of your wallet into your bank account; you need one or more agents (a teller or ATM) to assist in getting that money into your account.

So that behavior would be encapsulated into a Teller object, and it would accept Currency and Account objects as inputs, but it would not contain any data itself, except maybe a bit of local state (or maybe a Transaction object) to help process the input objects.
