Это полностью вопрос типа практики, поэтому язык не имеет значения. Я понимаю основные принципы MVC и что существуют разные тонкие вкусы (т.е. Представления, имеющие прямую ссылку на модели против делегата данных с контроллера).
Мой вопрос связан с перекрестным сообщением MVC, когда эти MVC вложены. Примером этого может служить программа рисования (например, Paint или что-то еще). Сам холст может быть MVC, но так же может быть каждый нарисованный объект (например, Shapes, Text). С точки зрения модели имеет смысл для CanvasModel
иметь набор сущностей, но должны ли CanvasView
и CanvasController
иметь соответствующие коллекции представлений и контроллеров сущностей соответственно?
Кроме того, какой лучший/самый чистый способ добавить новый объект? Скажите, что у пользователя активен CircleTool, они нажимают вид Canvas и начинают рисовать фигуру. CanvasView
может запускать соответствующие события мыши/перемещения/выключения, которые может прослушать CanvasController
. Затем контроллер мог в основном проксировать эти события в CircleTool (шаблон состояния). При мыши вниз CircleTool захочет создать новый круг. Должен ли Инструмент создать новый CircleEntityController
прямо и вызвать что-то вроде canvasController.addEntity(circleController)
? Где же ответственность за создание модели и представления Circle тогда лежит?
Извините, если эти вопросы несколько туманны:)
- ИЗМЕНИТЬ -
Вот пример псевдокодировки того, о чем я говорю:
CircleTool {
...
onCanvasMouseDown: function(x, y) {
// should this tool/service create the new entity model, view, and controller?
var model = new CircleModel(x, y);
var view = new CircleView(model);
var controller = new CircleController(model, view);
// should the canvasController 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);
}
...
}