О чем конкретно контроллер GRASP? - PullRequest
4 голосов
/ 03 июня 2010

В чем идея шаблона контроллера Grasp?

Моя текущая интерпретация заключается в том, что иногда вы хотите достичь чего-то, что должно использовать пару классов, но ни один из этих классов не может или не имеет доступа к информации, необходимой для этого, поэтому вы создаете новый класс, который выполняет эту работу, имея ссылки на все необходимые классы (это может быть информационный эксперт).

Это правильное представление о контроллере Grasp?

Обычно, когда я гуглю или SO'ing контроллер, я просто получаю результаты о MVC (и о чем еще), о которых я не понимаю, поэтому я хотел бы получить ответы, в которых не предполагается, что я знаю MVC ASP.NET или что-то: (

Спасибо

Ответы [ 2 ]

7 голосов
/ 03 июня 2010

Согласно Википедии :

Объект Controller - это объект не пользовательского интерфейса, отвечающий за получение или обработку системного события.

С Применение UML и шаблонов :

Какой первый объект за пределами пользовательского интерфейса первым получает и координирует («контролирует») системную операцию?

Контроллеры по всем направлениям - будь то в MVC или GRASP или Шаблоны EAA - все это для получения входных данных и реагирования на события.

Я понимаю это буквально: вспомните видеоигру контроллер . NES controller

Он реагирует на входные события - пользователь нажимает кнопки. Он не обязательно знает, что делать, когда вы нажимаете кнопку, но он по крайней мере получает событие.

Глядя на контроллер, можно легко понять, что такое системные события, то есть, на какие входы он реагирует и как пользователь взаимодействует с системой. На контроллере Nintendo очевидно, что системные события:

  • Нажмите A
  • Нажмите B
  • Нажмите X
  • Нажмите Y
  • Нажмите
  • Нажмите
  • Нажмите
  • Нажмите
  • Нажмите L
  • Нажмите R

Если бы мы взяли все эти события и построили программный контроллер для их обработки, это был бы контроллер MVC: все эти события связаны с физическим контроллером в том виде, как он представлен пользователю - это «представление», если вы будут. Но для большинства видеоигр существует второй уровень входных событий, где пуговицы кнопок соответствуют конкретным операциям системы. Например, если вы играете за Скорпиона в Mortal Kombat 2, нажатие ← ← B запускает один из ваших специальных ходов. В этом случае системе могут потребоваться разные контроллеры, которые имеют дело с такими видами событий:

UML diagram of various controller classes - a Button Controller with methods for each button press, and then various controller objects for different playable characters. Each player controller exposes methods corresponding to the character's special moves.

Здесь NES Button Controller - это контроллер MVC, который будет отслеживать состояние элементов пользовательского интерфейса - например, запоминать, какие кнопки были нажаты в каком порядке. В зависимости от состояния приложения (см. Application Controller - еще один!) NES Button Controller будет реагировать на определенные комбинации кнопок, вызывая методы на других контроллерах - например, Scorpion Controller - которые являются контроллерами вариантов использования.

Важно то, что, глядя на конструкцию этих объектов контроллера, вы можете быстро и легко перечислить системные события, на которые они реагируют.

В целом, в конце концов, MVC Controller все еще является своего рода GRASP Controller - поскольку его методы имеют тенденцию представлять системные события, которые реагируют на ввод данных пользователем. Но есть и другие контроллеры GRASP, которые не являются контроллерами MVC: контроллеры Case. Контроллер варианта использования GRASP может реагировать на системные события, такие как «пользователь создает новую продажу», в то время как контроллер MVC реагирует на такие события, как «система получает запрос PUT на /sales/new» или «java.awt.event.ActionEvent срабатывает».

1 голос
/ 03 июня 2010

Модели содержат данные. Представления представляют данные.

Представления прослушивают модели, используя паттерн «Банда четырех слушателей».

Контроллеры решают, что делать с пользовательским вводом. Либо они вызывают методы на моделях, конструируют новые объекты в текущем наборе моделей, удаляют объекты из текущего набора моделей, переносят представления в разные модели, добавляют представления, удаляют представления или реконфигурируют представления.

GRASP - это всего лишь инструмент, позволяющий лучше понять программное обеспечение и, как мы надеемся, не допустить совершения вопиющих ошибок при создании нового программного обеспечения благодаря хорошим методам проектирования. Это действительно не имеет ничего общего с MVC, но его можно использовать для лучшего понимания MVC.

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

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

Контроллер отвечает за то, чтобы знать, где находится фокус, и какую модель или вид обновлять. Это клей, который объединяет вещи и отвечает за правильную обработку ввода.

...