Jak wiem w standardowej implementacji MVC przekazujemy sterownik i model do widokuMVC - czy muszę używać kontrolera w widoku?
Ale jestem trochę nie zgadzam się z tym pomysłem. Nie chcę mój widok wiedzieć zarówno o kontrolerze i modelu (oh no. Może czasami zobaczyć potrzeb modelu, ale jestem pewien, że można żyć bez znajomości Controller)
Moim zdaniem kontrolera powinien zarządzać View i model, Model nie musi wiedzieć o kontrolerze i widoku; widok nie wymaga znajomości kontrolera (nie wykluczam modelu, ponieważ niektóre implementacje widoków muszą wiedzieć o modelu, aby słuchać zmian w modelu). Więc moim pomysłem jest, że widok nie musi wiedzieć o kontrolerze.
1. Oto jeden z przykładów:
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();
}
}
A Kontroler:
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. A teraz jak widzę tej implementacji bez przechodzenia kontroler:
Mój widok:
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();
}
});
}
}
"Command" interfejs:
public interface Command {
void execute(/*also can handle extra params*/);
}
A Kontroler:
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();
}
};
}
Dlaczego więc myślę, że za pomocą kontrolera w widoku nie jest dobry:
Miksujemy kontroler i przeglądaj implementacje, tworząc nowe zależności.
Myślę również, że View powinien zawierać tylko WIDOKI i operacje z nimi (a używanie kontrolera i niektórych jego metod już wygląda jak logika).
W pierwszym przykładzie widok informuje kontrolera, co ma zrobić. Zgadzasz się? Wygląda na to, że widok kontroluje kontroler!
W drugim przykładzie steruje co robić i po prostu mówi do widzenia, co zrobić, jeśli jakiś przycisk (tylko widok wie co guzik będzie) kliknął
ja zawsze drugi plan, ale po przeczytaniu nowa książka o mvc, która mówi, że musimy przekazać kontroler do widoku, jestem trochę zagmatwany.
Czy możesz mi pomóc zrozumieć, dlaczego się mylę i pokazać mi kilka przykładów?
Uważam, że kontroler i widok nie współdziałają bezpośrednio. Oddziałują jednak na model. więc model zna zarówno kontroler, jak i widok, ale widok i kontroler nie znają się nawzajem. – gigadot
powiedziawszy to. MVC występuje w wielu wariantach, a rzeczywiste implanty różnią się w praktyce. – gigadot
masz rację .., i jak myślisz w tym przykładzie, która implementacja jest lepsza? – pleerock