これは完全にベストプラクティスタイプの質問であるため、言語は関係ありません。私はMVCの基本原則を理解しており、MVCにはさまざまな微妙なフレーバーがあることを理解しています(つまり、モデルを直接参照するビューと、コントローラーからのデータデリゲート)。
私の質問は、MVCがネストされている場合のクロスMVC通信に関するものです。この例としては、描画プログラム(ペイントなど)があります。Canvas自体はMVCである可能性がありますが、描画された各エンティティ(Shapes、Textなど)も同様です。CanvasModel
モデルの観点からは、エンティティのコレクションを持つことは理にかなっていますが、エンティティビューとコントローラーの対応するコレクションをそれぞれ持つ必要がCanvasView
ありますか?CanvasController
また、新しく描画されたエンティティを追加するための最良/最もクリーンな方法は何ですか?ユーザーがCircleToolをアクティブにしている場合、キャンバスビューをクリックして、図形の描画を開始します。は、リッスンできるCanvasView
関連するマウスのダウン/移動/アップイベントを発生させる可能性があります。CanvasController
その後、コントローラーは基本的にこれらのイベントをCircleTool(状態パターン)にプロキシできます。マウスを下に向けると、CircleToolは新しいCircleを作成します。ツールは新しいCircleEntityController
完全なものを作成し、次のようなものを呼び出す必要がありますcanvasController.addEntity(circleController)
か?サークルのモデルとビューを作成する責任はどこにあるべきですか?
これらの質問がやや曖昧な場合は申し訳ありません:)
-編集-
これが私が話していることの疑似コディッシュの例です:
CircleTool {
...
onCanvasMouseDown: function(x, y) {
// should this tool/service create the new entity's model, view, and controller?
var model = new CircleModel(x, y);
var view = new CircleView(model);
var controller = new CircleController(model, view);
// should the canvasController's add method take in all 3 components
// and then add them to their respective endpoints?
this.canvasController.addEntity(model, view, controller);
}
...
}
CanvasController {
...
addEntity: function(model, view, controller) {
// this doesn't really feel right...
this.entityControllers.add(controller);
this.model.addEntityModel(model);
this.view.addEntityView(view);
}
...
}