- •Проектирование информационных систем
- •Вопрос 1. Обязанности, методы, взаимодействия
- •Вопрос 2. Шаблоны
- •Information Expert
- •Шаблон Information Expert
- •Шаблон Creator
- •Шаблон Low Coupling
- •Шаблон High Cohesion
- •Шаблон Controller
- •Вопрос 3. Реализация прецедентов
- •Пример: Реализация прецедентов для данной итерации разработки pos системы тт
- •Проектное решение: makeNewSale
- •Выбор класса-контроллера
- •Проектное решение: enterItem
- •Проектное решение: endSale
- •Проектное решение: makePayment
- •Проектное решение: startup
- •Проектное решение: store-create
- •Подключение уровня интерфейса пользователя к уровню предметной области
Шаблон Controller
Решение.Делегирование обязанностей по обработке системных сообщений классу, удовлетворяющему одному из следующих условий:
Класс представляет всю систему в целом, устройство или подсистему (внешний контроллер).
Класс представляет сценарий некоторого прецедента, в рамках которого выполняется обработка всех системных событий, и обычно называется <Прецедент>Handler, <Прецедент>Coordinatorили<Прецедент>Session (контроллер прецедентаиликонтроллер сеанса).
Для всех системных событий в рамках одного сценария прецедента используется один и тот же класс-контроллер.
Неформально, сеанс – это экземпляр взаимодействия с исполнителем. Сеансы могут иметь произвольную длину, но зачастую организованы в рамках прецедента (сеансы прецедента).
Следствие.Заметим, что в этот перечень не включаются классы, реализующие окно, приложение, вид и документ. Такие классы не выполняют задачи, связанные с системными событиями. Они обычно получают сообщения и делегируют их контроллерам.
Проблема.Кто должен отвечать за обработку входных системных событий?
Системное событие(systemevent) – это событие высокого уровня, генерируемое внешним исполнителем (событие с внешним входом). Системные события связаны ссистемными операциями(systemoperation), т.е. операциями, выполняемыми системой в ответ на события.
Например, когда кассир в POS-системе щелкните на кнопке Оплатить, он генерирует системное событие, свидетельствующее о завершении торговой операции. Аналогично, когда пользователь текстового процессора выбирает команду Орфография, он генерирует системное событие "выполнить проверку орфографии".
Контроллер(controller) – это объект, не относящийся к интерфейсу пользователя и отвечающий за обработку системных событий. Контроллер определяет методы для выполнения системных операций.
Пример.В приложении ТТ существует несколько системных операций (рис. 2.12).
Рисунок 2.12 – Системные операции связаны с системными событиями
В процессе анализа поведения системы системные операции относятся к классу System. Однако это не означает, что их выполняет программный классSystem. Более того, обязанности по выполнению системных операций обычно возлагаются на классController(рис. 2.13).
Какой класс должен выступать в роли контроллера для системных событии типа enteIltem или endSale?
Согласно шаблону Controller, возможны следующие варианты:
Класс, представляющий всю систему в целом, устройство или подсистему.
|
Register,POSSystem
|
Класс, представляющий получателя или искусственный обработчик всех системных событий некоторого сценария прецедента.
|
ProcessSaleHandler,ProcessSaleSession
|
Рисунок 2.13 – Кто является контроллером для события enterltem?
В терминах диаграммы взаимодействий должен использоваться один из вариантов, представленных на рис. 2.14:
Рисунок 2.14 – Варианты контроллеров
Выбор наиболее подходящего контроллера определяется другими факторами, в частности зацеплением и связыванием.
Системные операции, идентифицированные в процессе анализа поведения системы, на этапе проектирования присваиваются одному или нескольким классам контроллеров, например Register(рис. 2.15):
Обсуждение.Большинство систем получает внешние события. Обычно они связаны с графическим интерфейсом пользователя. Кроме того, системе могут передаваться внешние сообщения, например, при обработке телекоммуникационных сигналов или сигналов от датчиков в системах управления.
Во всех случаях при использовании объектно-ориентированного подхода для обработки внешних событий применяются контроллеры. Шаблон Controllerобеспечивает наиболее типичные проектные решения для этого случая. Как видно из рис. 2.13, контроллер – это своеобразный вид интерфейса между уровнями предметной области и графического представления.
Чтобы обеспечить возможность поддержки информации о состоянии прецедента, для обработки всех системных событий в рамках одного прецедента должен использоваться один и тот же класс контроллера. Такая информация может понадобиться, например, для идентификации момента нарушения последовательности системных событий (например, выполнение операции makePaymentперед выполнением операцииendSale). Для различных прецедентов можно использовать разные контроллеры.
Рисунок 2.15 – Распределение системных операций
Типичной ошибкой при создании контроллеров является возложение на них слишком большого числа обязанностей.
Обычно контроллер должен лишь делегировать функции другим объектам и координировать их деятельность, а не выполнять эти действия самостоятельно.
Важным следствием применения шаблона Controllerявляется вынесение обязанностей по выполнению системных событий за пределы уровня представления и внешнего интерфейса объектов (например, объектов окон). Другими словами, системные операции, отражающие процессы в предметной области, должны обрабатываться на уровне логики приложения или реализации объектов, а не на уровне интерфейса.
Объект-контроллер, как правило, относится к клиентской части приложения и функционирует в рамках того же процесса, что и интерфейс пользователя (например, приложение с графическим интерфейсом JavaSwing). Поэтому шаблонControllerнапрямую неприменим, если в качестве клиента выступает Web-броузер. Для такой архитектуры существуют различные шаблоны обработки системных событий, основанные на использовании серверных технических каркасов, в частности на базе сервлетовJava. Чаще всего основная идея сводится к использованию контроллеров прецедентов в серверной части приложения, когда обработку каждого прецедента осуществляет либо отдельный сервлет, либо компонент-обработчик сеансаEJB(EnterpriseJavaBeans). Серверный объект-обработчик сеанса обслуживает один сеанс взаимодействия с внешним исполнителем.
Похожие шаблоны:
Command(Команда) – в системах обработки сообщений каждое сообщение может представлять и обрабатывать отдельный объектCommand.
Facade(Фасад) – выбор объекта, представляющего всю систему или организацию в качестве внешнего контроллера.
Layers(Слои) – логика реализации размещается в слое реализации, а не в слое представления.
PureFabrication(Чистая синтетика) – подразумевает создание искусственного класса, не имеющего аналога в предметной области. Элементом шаблонаPureFabricationявляется контроллер прецедента.
Проектирование объектов и карты CRC
Для распределения обязанностей и выявления взаимодействия между объектами иногда используется еще одно средство, формально не являющееся частью языка UML–карты CRC(CRCcards–Class-Responsibility-Collaboratorcards). Они были введены Кентом Беком (KentBeck) и Уордом Каннингхемом (WardCunningham), которые внесли значительный вклад в повышение абстрактности мышления разработчиков объектно-ориентированных систем и уделили большое внимание распределению обязанностей и взаимодействию объектов.
Карты CRC– это индексные карты (по одной на каждый класс), на которых кратко описаны обязанности классов и перечислены объекты, взаимодействующие с данным классом при выполнении этих обязанностей.
Карты CRC– это лишь один из возможных подходов к записи результатов распределения обязанностей. Следующим шагом на этом пути является создание диаграмм классов и взаимодействий. Реальное значение имеют не сами карты как таковые, а пристальное внимание к процессу распределения обязанностей.