- •9. Проектирование классов
- •9.1. Проектирование классов, скрывающих информацию
- •9.2. Проектирование операций классов
- •9.3. Классы абстрагирования данных
- •9.4. Классы интерфейса устройства
- •9.5. Классы, зависящие от состояния
- •9.6. Классы, скрывающие алгоритмы
- •9.7. Классы интерфейса пользователя
- •9.8. Классы бизнес-логики
- •9.9. Классы-обертки базы данных
- •9.10. Внутренние программные классы
- •9.11. Применение наследования при проектировании
- •9.12. Примеры наследования
- •9.13. Спецификация интерфейса класса
9.5. Классы, зависящие от состояния
Класс, зависящий от состояния, инкапсулирует информацию, которая представлена на диаграмме состояний. На этапе проектирования классов диаграмма состояний, исполняемая зависящим от состояния объектом, отображается на таблицу переходов состояний. Таким образом, зависящий от состояния класс скрывает устройство этой таблицы и поддерживает текущее состояния объекта.
Зависящий от состояния класс предоставляет операции для доступа к таблице переходов состояний и для ее изменения. В частности, проектируются операции для обработки входных событий, вызывающих переходы состояний. Например, можно задать отдельную операцию для каждого такого события. Это означает, что зависящий от состояния класс проектируется специально для конкретной диаграммы состояний. Хотелось бы, однако, чтобы подобные классы были более обобщенными и могли использоваться повторно.
Обобщенный зависящий от состояния класс по-прежнему будет скрывать устройство таблицы переходов, но в нем имеется всего две операции: обработатьСобытие и текущееСостояние. Операция обработатьСобытие вызывается, когда поступает новое событие, которое и передается в качестве входного параметра. Операция текущееСостояние (она может отсутствовать) возвращает состояние конечного автомата. Такая операция нужна лишь в тех приложениях, где клиентам необходимо знать текущее состояние зависящего от состояния класса. Вот сигнатуры операций:
обработатьСобытие (событие)
текущееСостояние ( ) : Состояние
Операция обработатьСобытие просматривает таблицу переходов состояний с целью определить, что нужно сделать с новым событием, принимая во внимание текущее состояние и заданные в таблице условия. Таблица показывает, в какое состояние следует перейти (если это необходимо) и какие действия одновременно выполнить. Таким образом, операции остается изменить состояние объекта и выполнить действия, вызвав операции тех или иных объектов.
Другой, более гибкий подход к проектированию операции обработатьСобытие состоит в том, чтобы не выполнять действие самостоятельно, а вернуть его в выходном параметре. Тогда сигнатура принимает вид:
обработатьСобытие (in событие, out действие)
Такой зависящий от состояния класс оказывается достаточно общим для инкапсуляции любой таблицы переходов. Устройство таблицы зависит от приложения и определяется в момент создания или инициализации объекта класса. Пример зависящего от состояния класса в системе круиз-контроля – это класс Управление Калибровкой. На диаграмме кооперации из аналитической модели (рис.9.5а) показан объект Управление Калибровкой, исполняющий диаграмму состояния на рис.9.56.
Рис.9.5. Пример зависящего от состояния управляющего класса:
а – аналитическая модель (диаграмма кооперации); б – аналитическая модель (диаграмма состояний); в – проектная модель (диаграмма кооперации); г – проектная модель (диаграмма классов)
Объект Управление Калибровкой получает события Начать Калибровку и Прекратить Калибровку от двух объектов Интерфейс Кнопки Калибровки. Если получено сообщение Начать Калибровку (событие Ca1.1), то диаграмма состояний (рис.9.56) показывает, что должно быть выполнено действие Начать (Са1.2). В результате объект Управление Калибровкой посылает сообщение Начать объекту Калибровочная Константа, который выполняет действие. Если же получено сообщение Прекратить Калибровку (событие Са2.1), то из диаграммы состояний следует, что нужно выполнить действие Прекратить (Са2.2). Теперь объект Управление Калибровкой отправляет сообщение Прекратить объекту Калибровочная Константа.
В проектной модели (рис.9.5в и 9.5г) сообщения Начать Калибровку и Прекратить Калибровку отображаются на вызовы операции обработать Событие класса Управление Калибровкой, которой в качестве входного параметра передаются соответственно события началоКалибровки и прекраще-ниеКалибровки. Действия начать и прекратить превращаются в операции объекта абстрагирования данных Калибровочная Константа и вызываются операцией обработатьСобытие объекта Управление Калибровкой.