I am having some trouble understanding the MVC Pattern. I do understand we are trying to decouple the GUI from the business logic, although I'm having problems understanding how.
From what I understood, the View
, is what the user sees. So it generally is the window/form. The Controller
is inbetween the View
and the Model
. The Controller will make the data "flow" in both directions. It will also persist state when needed (if I have a wizard with 5 steps, it is the Controller
's responsability to ensure they are made in the correct order, etc). The Model,
is where the core of my application logic lives.
Is this view correct?
To try to turn this into something more meaningful, I'll try to sketch out a simple example with WinForms(no ASP.NET or WPF, please! - to the java crowd, from what I come to understand, Swing works in a similar way to WinForms!), to see if I get it right, and I'll raise the questions I always come to while doing it.
Let's assume I have a model that contains just a class (just to make it easier. I know it will make the example look dumb but its easier this way):
class MyNumbers {
private IList<int> listOfNumbers = new List<int> { 1, 3, 5, 7, 9 };
public IList<int> GetNumbers() {
return new ReadOnlyCollection<int>(listOfNumbers);
}
}
Now it's time to make my Controller
:
class Controller
{
private MyNumbers myNumbers = new MyNumbers();
public IList<int> GetNumbers() {
return myNumbers.GetNumbers();
}
}
The View
should just have a ListBox
that has as items all the numbers retrieved in MyNumbers
.
Now, the first question arises:
Should the Controller
be responsible for creating MyNumbers
? In this simple case, I think its acceptable(as MyNumbers
will do exactly the same, no matter what, and has no associated state). But let's assume I would want to use for all the different Controllers my app has the same instance of MyNumbers
. I would have to pass to this Controller
(and all others that need it) that instance of MyNumbers
that I want to use. Who is going to be responsible for that? In this WinForms examples, would that be the View
? Or would that be the class that creates the View
?
Turning the question around: what is the order of instantiation of these 3 parts? What is the code that the "owner" of the MVC
called to create it?
Should the Controller
create both the View
and Model
? Should the View
instantiate the Controller
and the Controller
the Model
?
Second question:
How is the main
method supposed to look like, assuming I only want my application to have the Use Case
this Controller
portrays?
Third:
Why does in the following MVC diagram, the View
have an arrow to the Model
? Shouldn't the Controller
be always the bridge between both View
and Model
?
I'll have one or two more questions, but they probably will make more sense asked after I understand this first detail. Or maybe after I understand that first question all the others tear apart.
Thanks!