Базовая схема связи MVC - PullRequest
       9

Базовая схема связи MVC

1 голос
/ 18 октября 2011

Я только начал изучать шаблон Model View Controller. Теперь я понимаю основы использования MVC, но когда я попытался реализовать MVC в простом тесте, я столкнулся с проблемой. Конечно, я мог бы легко настроить код, чтобы он работал, но я хочу научиться правильно реализовывать шаблон MVC.

Тест: Я использовал Actionscript 3, чтобы сделать простую программу. Он состоит из башни и мыши. Башня находится в середине экрана. Когда я щелкаю в любом месте, турель поворачивается к точке, где я щелкнул. У мыши и башни есть своя модель, вид и контроллер. Когда я нажимаю, MouseModel изменяется правильно. Но для того, чтобы реальный TurretView отвечал, TurretModel должен изменить свою переменную вращения и отправить событие.

Вопрос в том, кто отвечает на событие MouseModel?

     /------->MouseControl------\
    /                            \
MouseView                ?<---MouseModel

TurretView <------------------TurretModel

             TurretControl

Я решил, что лучше всего, чтобы MouseModel напрямую не влиял на TurretModel или TurretControl, потому что это потребовало бы, чтобы они были eventListener. Заставить TurretView прослушивать MouseModel, а затем сказать TurretControl настроить TurretModel, после того как TurretView может обновить через событие TurretModel, это выглядит как много дополнительного кода для простой задачи. Также я бы предпочел, чтобы MouseControl не влиял на TurretModel, это нарушило бы гибкость мыши в качестве входных данных для будущих классов.

Ой, а также в какой класс я помещаю код для расчета угла?

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 19 октября 2011

Помните, что целью MVC является прежде всего разделение модели и представления, и контроллер может служить связующим звеном между ними.

Если вы не планируете сохранять каждое происходящее действие (щелчок, вращение и т. Д.), Нет реальной необходимости в действии (в этой ситуации) отправлять данные в модель. Все, что вы хотели бы сделать, должно быть легко обработано с помощью контроллера. Таким образом, поток будет:

  • Клик мыши
  • Событие запускается, чтобы вызвать команду (в контроллере), передающую местоположение мыши
  • Команда рассчитывает вращение турели
  • Команда сообщает View повернуть турель

Это, конечно, мое предложение, основанное на вашем примере. По правде говоря, в зависимости от проекта вышеуказанный поток может легко измениться (например, в этой ситуации кажется хорошим вычисление поворота в команде, но в других ситуациях, которые могут не иметь такого большого смысла). Посмотрите на MVC как на цель - вы пытаетесь разделить эти элементы в максимально возможной степени, но не существует 100% «работающего каждый раз» способа сделать это.

У Robotlegs, популярной инфраструктуры MVC, на сайте есть отличная диаграмма, показывающая, как они справились с MVC:

http://www.robotlegs.org/diagram/

Я не рекламирую, что вам НУЖНО использовать Robotlegs (это хорошо, но есть много других альтернатив), но они определенно сделали красивую диаграмму:)

0 голосов
/ 18 октября 2011

У вас должна быть одна модель, в которой есть части, которые вы в данный момент вызываете MouseModel и TurretModel.Вы можете либо сохранить эти имена и разбивки, либо сделать что-то еще, как только у вас появится «лучший способ» справиться с тем, что нужно сделать.

Представление, отслеживающее щелчки мыши, должно отправлять событие, которое ваш компонент контроллераловит, чтобы обновить TurretModel (на данный момент, вероятно, нет необходимости в MouseModel).Ваш TurretView может затем обновить себя на основе TurretModel, или Контроллер может обновить TurretView на основе нового значения.Это будет зависеть от того, как вы его подключили.

Использование таких сред, как Robotlegs, может помочь вам разобраться во всех тонкостях этого процесса, и я слышал, что эта книга http://shop.oreilly.com/product/0636920021216.doдает отличное объяснение MVC, даже если вы не решите использовать Robotlegs после того, как прочитаете его.

...