- •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.2. Проектирование операций классов
Опишем, как выявляются операции, предоставляемые классами. Хотя для отражения операций классов предназначена статическая модель, их проще выявить на основе анализа динамической модели, прежде всего из диаграммы кооперации. Это обусловлено тем, что в динамической модели отражен обмен сообщениями между объектами, а следовательно, и операции объекта-получателя. Передача сообщений между пассивными объектами – не что иное, как вызов операции одного объекта из операции другого объекта.
Представим несколько примеров проектирования классов. На диаграммах кооперации показано, как пассивный объект, операции которого мы проектируем, взаимодействует с другими объектами. Эти объекты, в свою очередь, могут быть пассивными или активными. Из приведенных примеров станет ясно, как диаграммы кооперации из аналитической модели отображаются на диаграммы кооперации проектной модели. Основное внимание в примерах обращается на проектирование конкретного класса и его операций. Прочие решения – например, об отображении объектов, вызывающих необходимые операции, на задачи – мы сознательно не рассматриваем.
9.2.7. Проектирование операций классов на основе модели взаимодействия. Воспользуемся моделью взаимодействия объектов для выявления операций классов. Для этой цели годится как диаграмма кооперации, так и диаграмма последовательности. Операции классов определяются путем рассмотрения того, как объект данного класса взаимодействует с другими объектами, поскольку взаимодействие двух объектов состоит в том, что один из них вызывает операцию другого. При проектировании операций классов мы будем применять в основном диаграммы кооперации.
Рассматривая два взаимодействующих объекта, необходимо понять, чьи операции вызываются. Обычно для этого недостаточно диаграммы классов из статической модели, так как на ней показаны только статические отношения между классами. С другой стороны, из динамической модели видно направление передачи сообщений от одного объекта к другому. Если спроецировать объекты на последовательную программу, то окажется, что объект-отправитель вызывает операцию объекта-получателя. Следовательно, сообщению ставится в соответствие вызов операции. Имя сообщения отображается на имя операции, а параметры сообщения – на параметры операции.
Операции объекта допустимо определить непосредственно из диаграммы взаимодействия, на которой этот объект присутствует. В аналитической модели акцент ставится на той информации, которой обмениваются объекты, а не на точном синтаксисе операции. Поэтому имя сообщения на диаграмме кооперации может быть существительным (отражающим тип передаваемых данных) или глаголом (описывающим саму выполняемую операцию).
В модели проектирования специфицируются операции классов. Если имя сообщения было существительным, необходимо определить операцию объекта, который получит поименованную информацию. Если же имя сообщения было глаголом, оно и становится именем операции. Имя, данное операции в проектной модели, должно отражать ее назначение в классе.
Важно также выяснить, у каких операций есть входные и выходные параметры. В аналитической модели все сообщения на диаграмме кооперации изображаются в виде простых сообщений, посылаемых одним объектом другому. В некоторых случаях простое сообщение – это ответ на полученное сообщение. На диаграммах кооперации из проектной модели сообщения, вызывающие операции, изображаются как синхронные. Те простые сообщения, представленные в аналитической модели, которые соответствуют данным, возвращенным операцией, то есть ответам, отображаются на выходные параметры операции.
Рассмотрим, к примеру, класс Карточка Банкомата, который инкапсулирует информацию, прочитанную с карточки. Из диаграммы кооперации в составе аналитической модели (рис.9.la) видно, что объект Интерфейс Устройства Считывания Карточек посылает сообщение Данные от Устройства Считывания сущностному объекту Карточка Банкомата. Позже объект Интерфейс Клиента отправляет сообщение Запрос Карточки объекту Карточка Банкомата, который возвращает Данные Карточки. На этапе проектирования определяется точный интерфейс класса. Простое сообщение Данные от Устройства Считывания из проектной модели (рис.9.1б) отображается на вызов операции писать(данныеКарточки, предоставляемой объектом Карточка Банкомата. Сообщение Запрос Карточки отображается на вызов операции читать объекта Карточка. Простому сообщению Данные Карточки соответствует выходной параметр операции читать. Вызовы операций изображаются с помощью нотации UML для синхронных сообщений. На рис.9.1в показан класс абстрагирования данных Карточка Банкомата. Представлены как атрибуты, так и операции. У операции писать имеется один входной параметр – данные Карточки. У операции читать есть один выходной параметр – прочитанные данныеКарточки.
Рис.9.1. Пример класса абстрагирования данных:
а – аналитическая модель (диаграмма кооперации); б – проектная модель (диаграмма кооперации); в – проектная модель (диаграмма классов)
После определения операции на основе диаграммы кооперации она изображается на статической модели вместе с классом, который ее содержит. Очень удобно одновременно выявлять операции из диаграмм кооперации и изображать их на диаграммах классов.
9.2.2. Проектирование операций классов на основе конечного автомата. Операции классов можно также вывести из диаграммы состояний. На ней представлены действия и деятельности, инициируемые в результате перехода состояний. Действия, как правило, отображаются на операции класса. На диаграммах состояний показаны все зависящие от состояния действия и деятельности. Если действия выполняются пассивными классами, то они выводятся из диаграммы состояний.
Действия и деятельности должны быть изображены также на диаграмме кооперации или последовательности. Поскольку на этих диаграммах обычно показываются сценарии прохождения прецедентов (конкретные последовательности взаимодействий между объектами), то редко встречающиеся альтернативы (к примеру, обработка исключений) часто пропускаются. Таким образом, хотя любое действие должно быть отражено на консолидированных диаграммах кооперации, на какой-то отдельной диаграмме, относящейся к конкретному прецеденту, его может и не быть. На диаграмме состояний должны присутствовать все зависящие от состояния действия и деятельности.
9.2.3. Проектирование операций классов на основе статической модели. Проектировать операции классов на основе диаграмм классов из статической модели тоже можно, особенно для сущностных классов. Стандартными являются операции создать, читать, обновить, удалить. Но зачастую состав операций легко адаптировать под нужды конкретного класса абстрагирования данных, определив, какие сервисы он должен предоставлять. Ниже это будет проиллюстрировано на примерах. Здесь объекты, вызывающие операции пассивных объектов, в основном тоже считаются пассивными, хотя могут быть и активными.