私が知っているように、MVC の標準実装では Controller と Model を View に渡します。
しかし、私はこの考えに少し反対です。ビューにコントローラーとモデルの両方を認識させたくありません(いや、ビューにモデルが必要な場合もありますが、コントローラーの知識がなくても生きていけると確信しています)
私の意見では、コントローラーはビューとモデルを管理する必要があり、モデルはコントローラーとビューについて知る必要はありません。ビューはコントローラーを知る必要はありません (ビューの一部の実装では、モデルの変更をリッスンするためにモデルについて知る必要があるため、モデルを除外しません)。だから私の考えは、view は controller について知る必要がないということです。
1.以下に一例を示します。
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();
}
}
そしてコントローラー:
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.次に、コントローラーを渡さずにこの実装を確認するにはどうすればよいですか。
私の見解:
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();
}
});
}
}
「コマンド」インターフェース:
public interface Command {
void execute(/*also can handle extra params*/);
}
そしてコントローラー:
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();
}
};
}
では、ビューでコントローラーを使用することは良くないと思うのはなぜですか。
コントローラーとビューの実装を混在させて、新しい依存関係を作成しています。
また、ビューにはビューとそれらの操作のみを含める必要があると思います(コントローラーと彼のメソッドのいくつかを使用すると、すでにロジックのように見えます)。
最初の例のビューでは、コントローラーに何をすべきかを伝えます。賛成ですか?ビューがコントローラーを制御しているようです!
2番目の例では、コントローラーは何をすべきかを制御し、いくつかのボタン(ビューだけがそれがどのボタンになるかを知っている)がクリックされた場合に何をすべきかをビューに伝えます
私は常に 2 番目のスキームを使用していましたが、mvc に関する新しい本を読んだ後、コントローラーをビューに渡す必要があると書かれていて、少し混乱しました。
なぜ私が間違っているのかを理解し、いくつかの例を示してください。