MVC - eu preciso usar o Controller na View?
Como eu sei na implementação padrão do MVC nós passamos Controller e Model para o View
Mas estou um pouco em desacordo com essa idéia. Eu não quero meu ponto de vista para saber sobre o controlador e modelo (oh não. Talvez às vezes ver modelo de necessidades, mas tenho certeza que ele pode viver sem conhecimento do controlador)
Na minha opinião, o Controller deveria gerenciar View e Model, e o Model não precisa saber sobre controller e view; A visão não precisa saber o controlador (eu não excluo o modelo porque algumas implementações das vistas precisam de saber sobre o modelo para escutar mudanças no modelo). Então minha ideia é quevista não precisa saber sobre o controlador.
1 Aqui está um exemplo:
public class MyView implements ButtonClickListener {
private Controller myController;
private Button myButton;
// I commented out the model because we dont need it now
// we are talking about using controller in the view
public MyView(Controller c/*, Model m*/) {
myController = c;
myButton = new Button(); // lets say that it is "register" button
myButton.setOnButtonClickListener(this);
}
public void setRegisterButtonText(String text) {
myButton.setText(text);
}
@Override
public void onClick() {
myController.tellToModelToDoSomething();
}
}
E controlador:
public MyController implements Controller {
private Model model;
private View view;
public MyController(Model model) {
this.model = model;
this.view = new MyView(this);
}
public void tellToModelToDoSomething() {
model.doSomeActions();
}
}
2 E agora, como vejo essa implementação sem passar pelo controlador:
Minha visão:
public class MyView {
private Button myButton;
public MyView() {
myButton = new Button();
}
public void setRegisterButtonText(String text) {
myButton.setText(text);
}
public void setOnRegisterButtonClick(final Command command) {
myButton.setOnButtonClickListener(new ButtonClickListener() {
@Override
public void onClick() {
command.execute();
}
});
}
}
Interface "Comando":
public interface Command {
void execute(/*also can handle extra params*/);
}
E controlador:
public MyController implements Controller {
private Model model;
private View view;
public MyController(Model model) {
this.model = model;
this.view = new MyView();
view.setOnRegisterButtonClick(command);
}
public void tellToModelToDoSomething() {
model.doSomeActions();
}
private Command command = new Command() {
public void execute() {
tellToModelToDoSomething();
}
};
}
Então, por que eu acho que usando o controlador na visãoNÃO É BOM:
Estamos misturando controlador e visualizamos implementações, fazendo novas dependências.
Também acho que o View deve conter apenas VIEWS e operações com eles (e usar controller e alguns de seus métodos já se parecem com lógica).
No primeiro exemplo, a visualização diz ao controlador o que fazer. Você concorda? Parece que a vista controla o controlador!
No segundo exemplo, o controlador controla o que fazer e apenas diz à visão o que fazer se algum botão (somente a visualização sabe qual botão será) clicado
Eu sempre usei o segundo esquema, mas depois de ler um novo livro sobre o mvc, que diz que precisamos passar o controlador para a visão, estou um pouco confuso.
Você pode por favor me ajudar a entender por que estou errado e me mostrar alguns exemplos?