О чем конкретно контроллер GRASP?
В чем идея шаблона контроллера Grasp?
Моя текущая интерпретация заключается в том, что иногда вы хотите достичь чего-то, что должно использовать пару классов, но ни один из этих классов не может или не имеет доступа к информации, необходимой для этого, поэтому вы создаете новый класс, который выполняет свою работу, имея ссылки на все необходимые классы (это может быть информационный эксперт).
Это правильное представление о контроллере Grasp?
Обычно, когда я гуглю или SO'ing контроллер, я просто получаю результаты о MVC (и о чем-то еще), о которых я не понимаю, поэтому я хотел бы получить ответы, которые не предполагают, что я знаю MVC ASP.NET или что-то в этом роде:(
Спасибо
2 ответа
Согласно Википедии:
Объект Controller - это объект не пользовательского интерфейса, отвечающий за получение или обработку системного события.
Какой первый объект за пределами пользовательского интерфейса первым получает и координирует ("контролирует") работу системы?
Контроллеры по всем направлениям - будь то в MVC или GRASP или шаблонах EAA - все это для получения входных данных и реагирования на события.
Я понимаю это буквально: подумайте о контроллере видеоигры.
Он реагирует на события ввода - пользователь нажимает кнопки. Он не обязательно знает, что делать, когда вы нажимаете кнопку, но он, по крайней мере, получает событие.
Глядя на контроллер, можно легко понять, что такое системные события, то есть, на какие входы он реагирует и как пользователь взаимодействует с системой. На контроллере Nintendo очевидно, что системные события:
- Нажмите
A
- Нажмите
B
- Нажмите
X
- Нажмите
Y
- Нажмите
↑
- Нажмите
↓
- Нажмите
→
- Нажмите
←
- Нажмите
L
- Нажмите
R
Если бы мы взяли все эти события и построили программный контроллер для их обработки, это был бы контроллер MVC: все эти события связаны с физическим контроллером, представленным пользователю - это "представление", если хотите. Но для большинства видеоигр существует второй уровень входных событий, где пуговицы кнопок соответствуют конкретным операциям системы. Например, если вы играете за Scorpion в Mortal Kombat 2, нажмите ← ← B
запускает один из ваших специальных ходов. В этом случае системе могут потребоваться разные контроллеры, которые имеют дело с такими видами событий:
Здесь NES Button Controller
контроллер MVC, который отслеживает состояние элементов пользовательского интерфейса - например, запоминает, какие кнопки были нажаты в каком порядке. В зависимости от состояния приложения (см. Application Controller - еще один!) NES Button Controller
будет реагировать на определенные комбинации кнопок, вызывая методы на других контроллерах - например, Scorpion Controller
- Контроллеры вариантов использования.
Важно то, что, глядя на конструкцию этих объектов контроллера, вы можете быстро и легко перечислить системные события, на которые они реагируют.
В целом, в конце концов, MVC Controller по-прежнему является своего рода GRASP Controller - поскольку его методы имеют тенденцию представлять системные события, которые реагируют на ввод пользователя. Но есть и другие контроллеры GRASP, которые не являются контроллерами MVC: контроллеры Use Case. Контроллер варианта использования GRASP может реагировать на системные события, такие как "пользователь создает новую продажу", в то время как контроллер MVC реагирует на такие события, как "система получает запрос PUT для /sales/new
или java.awt.event.ActionEvent
fires`".
Модели содержат данные. Представления представляют данные.
Представления слушают модели, используя паттерн "Банда четырех слушателей".
Контроллеры решают, что делать с пользовательским вводом. Либо они вызывают методы на моделях, конструируют новые объекты в текущем наборе моделей, удаляют объекты из текущего набора моделей, переназначают представления на разные модели, добавляют представления, удаляют представления или реконфигурируют представления.
GRASP - это всего лишь инструмент, позволяющий лучше понять программное обеспечение и, как мы надеемся, не допустить грубых ошибок при создании нового программного обеспечения благодаря хорошим методам проектирования. Это на самом деле не имеет ничего общего с MVC, но его можно использовать для лучшего понимания MVC.
Ключ в MVC заключается в том, что модель не загрязнена кодом, который обрабатывает детали отображения. Таким образом, вы можете изолировать "бизнес-логику" или "то, что должен делать класс" внутри одной модели. Представления реагируют на изменения в модели, потому что модель отправляет сообщения каждому представлению, которое зарегистрировалось в модели (шаблон слушателя). Сообщения часто довольно кратки, в основном не нужно содержать никаких данных, кроме "модель изменилась".
Когда представления получают уведомление о том, что в модели произошло изменение, представление затем получает необходимые данные из открытого интерфейса модели. Как только представление получает необходимые данные, оно отображает данные для пользователя (используя любой интерфейс, который представление должно было поддерживать). Это изолирует представление данных в классе, который нарушается, когда представление изменяется несовместимо, и позволяет модифицировать код представления без класса модели, требующего модификации "совместимости".
Контроллер отвечает за то, чтобы знать, где находится фокус, и какую модель или представление обновить. Это клей, который объединяет вещи и отвечает за правильную обработку ввода.