- •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.4. Классы интерфейса устройства
Одной из важных целей при разработке программной системы является сокрытие от пользователей информации о модификациях реальных устройств ввода/вывода. Типичный пример такого изменения – это замена одного устройства другим с той же функциональностью, но иным аппаратным интерфейсом. Разумеется, крайне нежелательно, чтобы подобное изменение затронуло всех пользователей. Решается проблема посредством классов интерфейса устройства, которые предоставляют виртуальный интерфейс, скрывающий детали общения с реальным устройством.
С помощью класса интерфейса устройства концепция сокрытия информации применяется для инкапсуляции проектного решения о том, как осуществляется интерфейс с конкретным устройством ввода/вывода. С этой целью разрабатывается класс виртуального интерфейса, в котором скрываются все детали реального интерфейса.
Пользователи могут обратиться к устройству только с помощью виртуального интерфейса, состоящего из набора операций. В случае замены устройства и модификации реального интерфейса пользователи виртуального интерфейса ничего не узнают, поскольку спецификация операций остается прежней. Надо лишь изменить реализацию этих операций. Таким образом, пользователи класса изолированы от модификаций реальной аппаратуры.
Объекты интерфейса устройств определяются на этапе аналитического моделирования путем применения критериев разбиения на объекты. Такие программные объекты взаимодействуют с физическими устройствами, внешними по отношению к системе. На этапе проектирования классов разрабатываются все классы интерфейса устройств.
9.4.1. Проектирование операций классов интерфейса устройств. Экземпляры класса интерфейса устройства взаимодействуют с реальным устройством и предоставляют операции для считывания и записи.
В классе интерфейса устройства всегда есть операция инициализировать. Когда создается объект класса, эта операция вызывается с целью инициализации устройства и всех внутренних переменных объекта. Что касается других операций, то они зависят от конкретного устройства. Например, в интерфейсе устройства ввода, скорее всего, будет операция читать, а в интерфейсе устройства вывода – операция писать. В классе же, предназначенном для работы с устройством ввода/вывода, вероятно, будут обе операции.
9.4.2. Классы интерфейса устройства ввода. В классе интерфейса устройства ввода необходима операция инициализировать, предназначенная для инициализации устройства и установки внутренних переменных класса. Для устройства ввода обычно требуется операция читать. Реализация этих операций зависит от характеристик конкретного устройства, но от пользователей устройства она должна быть скрыта.
В качестве примера рассмотрим объект Интерфейс Бензобака, у которого есть операции инициализировать и читать. Аналитическая модель (рис.9.3а) показывает, что этот объект получает запрос Читать Количество Топлива от объекта Расход Топлива. Затем объект Интерфейс Бензобака просит объект Бензобак сообщить, сколько бензина осталось. В проектной модели (рис.9.36) вызывается операция читать внешнего объекта Бензобак, которая возвращает ответ данныеБензобака. Как это происходит на самом деле, зависит от реализации физического интерфейса. Так или иначе, объект Интерфейс Бензобака возвращает вызывающему объекту количествоТоплива.
Сообщение Читать Количество Топлива, которое получает объект Интерфейс Бензобака в аналитической модели, изображено в проектной модели в виде синхронного сообщения, соответствующего вызову операции читать. Сообщение Количество Топлива, которое в аналитической модели является ответом на сообщение Читать Количество Топлива, отображается на выходной параметр количествоТоплива операции читать.
Класс Интерфейс Бензобака также изображен на диаграмме класса (рис.9.3в). У него две операции. Операция инициализировать вызывается в начальный момент. Для операции читать указан выходной параметр количество Топлива. Таким образом, сигнатура операции на диаграмме класса идентична тому, что мы видим на диаграмме кооперации.
9.4.3. Классы интерфейса устройства вывода. Класс интерфейса устройства вывода также должен иметь операцию инициализировать. Кроме того, в нем должна быть операция вывода. Например, в классе интерфейса устройства Дроссель есть операция вывести. Но если устройство вывода может выполнять различные действия, то состав операций класса необходимо адаптировать. Так, класс Устройство Выдачи Наличных имеет операцию выдатьНаличные, класс Устройство Печати Чеков – операцию напечататьЧек, класс Дверь Лифта – операции открыть и закрыть, а класс Мотор Лифта – операции вверх, вниз и стоп.
Рис.9.3. Пример класса интерфейса устройства ввода:
а – аналитическая модель (диаграмма кооперации); б – проектная модель (диаграмма кооперации); в – проектная модель (диаграмма классов)
Рассмотрим диаграмму кооперации из аналитической модели на рис.9.4а. Объект Интерфейс Маршрутного Дисплея, помеченный стереотипом «интерфейс устройства вывода», получает сообщения Средняя Скорость и Средний Расход и выводит их на Маршрутный Дисплей.
Рис.9.4. Пример класса интерфейса устройства вывода:
а – аналитическая модель (диаграмма кооперации)
В классе Интерфейс Маршрутного Дисплея (рис.9.4в) есть две операции: вывестиСреднююСкорость (скорость) и вывестиСреднийРасход (расход Топлива). В данном случае объект-алгоритм Средняя Скорость вызывает операцию вывестиСреднююСкорость, передавая текущее значение средней скорости. На диаграмме кооперации в проектной модели это изображено в виде синхронного сообщения без возвращаемого значения (рис.9.46). Соответственно объект-алгоритм Расход Топлива вызывает операцию вывестиСреднийРасход, передавая текущее значение расхода топлива. Класс Интерфейс Маршрутного Дисплея скрывает информацию о том, как форматируются данные и как осуществляется взаимодействие с физическим Маршрутным Дисплеем.
Рис.9.4. Пример класса интерфейса устройства вывода:
б – проектная модель (диаграмма кооперации);
в – проектная модель (диаграмма классов)