
- •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.3. Классы абстрагирования данных
Каждый сущностный класс из аналитической модели, который инкапсулирует данные, проектируется как класс абстрагирования данных. Сущностный класс хранит данные и предоставляет операции для доступа к ним – операции чтения и записи. Класс абстрагирования данных используется для инкапсуляции структуры данных, то есть сокрытия деталей ее внутреннего представления. Операции проектируются как процедуры иди функции доступа, внутреннее устройство которых также скрыто.
Информация об атрибутах класса абстрагирования данных должна уже присутствовать в статической модели предметной области. Операции такого класса определяются путем рассмотрения тех сервисов, которые нужны клиентским объектам для опосредованного доступа к данным. Это можно сделать, проанализировав способы использования объекта абстрагирования данных в модели кооперации.
9.3.1. Пример класса абстрагирования данных. Для знакомства с классами абстрагирования данных рассмотрим диаграмму кооперации из аналитической модели (рис.9.2а), состоящую из двух объектов, которым нужен доступ к объекту Наличные Банкомата. Атрибуты данного объекта приведены в статической модели: это количество пяти-, десяти- и двадцатидолларовых купюр в устройстве выдачи наличных. Таким образом, в объекте должны быть внутренние переменные, содержащие соответствующие счетчики купюр. Таким образом, мы проектируем класс Наличные Банкомата с четырьмя атрибутами: имеющаясяСумма, пятидолларовыеКупюры, десятидол-ларовые Купюры, двадцатидолларовыеКупюры. Начальное значение всех атрибутов установлено в ноль.
Необходимы сведения о том, какие сообщения посылаются объекту Наличные Банкомата и какова последовательность их отправки. Так, из аналитической модели явствует, что, когда объект Наличные Банкомата получает сообщение Снимаемая со Счета Сумма от объекта Интерфейс Устройства Выдачи Наличных, он должен вычислить, сколько купюр каждого достоинства выдать. В аналитической модели эта информация посылается в ответном сообщении Ответ о Выдаче Наличных.
Объект Наличные Банкомата получает также сообщение от объекта Интерфейс Оператора. Человек-оператор пополняет запас наличных в банкомате купюрами разного достоинства, а соответствующая информация передается объекту Наличные Банкомата. Добавив наличные, оператор уведомляет банкомат с помощью объекта Интерфейс Оператора, который посылает сообщение Добавлены Наличные объекту Наличные Банкомата (рис.9.2а).
Рис.9.2. Пример класса абстрагирования данных:
а – аналитическая модель (диаграмма кооперации); б – проектная модель (диаграмма кооперации); в – проектная модель (диаграмма классов)
Теперь мы можем специфицировать операции класса Наличные Банкомата так, как показано на диаграмме кооперации проектной модели на рис.9.26. Нужны две операции: добавитьНаличные и выдатьНаличные. У операции выдатьНаличные один входной параметр: суммаКВыдаче – и три выходных: выдатьПяти-долларовыхКупюр, выдатьДесятидолларовыхКупюр, вы-датьДвадцатидолларовыхКупюр. У операции добавитьНа-личные три входных параметра: добавленоПятидолларовых Купюр, добавленоДесятидолларовыхКупюр и добавлено ДвадцатидолларовыхКупюр. Вот как специфицируются операции:
выдатьНаличные(in суммаКВыдаче,
out выдать ПятидолларовыхКупюр,
out выдатьДесятидолларовыхКупюр,
out выдатьДвадцатидолларовыхКупюр)
добавитьНаличные(in добавлено
ПятидолларовыхКупюр,
in добавленоДесятидолларовыхКупюр,
in добавленоДвадцатидолларовыхКупюр)
Диаграмма классов изображена на рис.9.2в.
Объекты этого класса поддерживают инвариант: общая сумма наличных в банкомате должна равняться суммарному значению достоинств всех купюр:
имеющаясяСумма = 5 * пятидолларовыеКупюры + . + 10 * десятидолларовыеКупюры + 20 * двадцати-долларовыеКупюры
Недостаток наличных – это ошибка, которую нужно распознавать. Обычно такие ошибки обрабатываются как исключения.