Como sé en la implementación estándar de la MVC pasamos el Controlador y el Modelo a la VistaMVC - ¿Necesito usar el Controlador en la Vista?
Pero estoy un poco en desacuerdo con esta idea. No quiero que mi vista sepa sobre el controlador y el modelo (oh no, tal vez a veces vea el modelo de necesidades, pero estoy seguro de que puede vivir sin conocimiento del controlador)
En mi opinión, el controlador debe administrar Vista y modelo, y el Modelo no necesita saber sobre el controlador y la vista; view no necesita saber el controlador (no excluyo el modelo porque algunas implementaciones de vistas deben conocer el modelo para escuchar los cambios en el modelo). Entonces mi idea es que la vista no necesita saber sobre el controlador.
1. Aquí está un ejemplo:
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();
}
}
y regulador:
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. Y ahora qué es lo que veo esta aplicación sin pasar por el controlador:
Mi visión:
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();
}
});
}
}
"Comando" Interfaz:
public interface Command {
void execute(/*also can handle extra params*/);
}
y regulador:
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();
}
};
}
Así que ¿por qué creo que el uso del controlador en la vista no es bueno:
Estamos mezclando el controlador y ver implementaciones, haciendo nuevas dependencias.
También creo que View debería contener solo VIEWS y operaciones con ellos (y usar el controlador y algunos de sus métodos ya lucen como lógicos).
En el primer ejemplo, la vista le dice al controlador qué hacer. ¿Estas de acuerdo? ¡Parece que la vista controla el controlador!
En el segundo ejemplo, el controlador controla qué hacer y sólo dice a la vista qué hacer si algún botón (sólo vista sabe qué botón será) hace clic
siempre he usado el segundo esquema, pero después de leer un nuevo libro sobre mvc, que dice que tenemos que pasar el controlador a la vista, soy un poco confuso.
¿Puede ayudarme a comprender por qué me equivoco y mostrarme algunos ejemplos?
Creo que el controlador y la vista no interactúan directamente. Ellos interactúan aunque modelo. para que el modelo conozca tanto el controlador como la vista, pero la vista y el controlador no se conocen entre sí. – gigadot
habiendo dicho eso. MVC viene en muchas variantes y las implementaciones reales son diferentes en la práctica. – gigadot
tiene usted razón ..., y ¿cómo cree que en este ejemplo, qué implementación es mejor? – pleerock