66
понимания системы (если только пакет не предназначен для непосредственного отображения какого-либо класса). Например, пакеты можно использовать для изображения декомпозиций вариантов использования в виде сценариев, с уточнением объектов (присущих им операций и свойств). Таким образом, всё множество диаграмм и описаний будет упорядочено в виде вложенных именованных пакетов. Это позволит осуществить семантическую связь между различными диаграммами UML, а также между артефактами, которые являются результатом выполнения каждой из стадий разработки программной системы.
2.3.4.Диаграммы классов
Вприложении «А» мы рассмотрели пример объектной декомпозиции, в результате которой были выявлены объекты, их свойства, выполняемые ими действия, а также ограничения для свойств и действий в виде условий. Перечень объектов может быть уточнён посредством моделирования процесса «Идентификация клиента и предоставление выбора операций» при помощи диаграммы варианта использования (согласно сценарию). На основании уточнения возможны изменения в составе объектов. Предположим, что данная модель на данном этапе устраивает разработчика и заказчика. В таком случае следует приступить к проектированию статической структуры системы, то есть определения типов объектов системы и различного рода статических связей и отношений между ними. Как мы уже знаем, однотипные объекты являются экземплярами «одного типа», т.е. класса. Наша задача – описать все классы как набор статических элементов и построить связи между классами посредством языка UML. Подобное описание носит название диаграммы классов, на которой классы отображаются в виде сочетаний «сущность–свойства–операция», т.е. атрибутов классов, операций классов и ограничений для доступа к элементам классов. По сути, построение диаграммы классов – это подготовка к описанию интерфейса классов на языке программирования (т.е. созданию библиотеки классов на языке С++). На диаграммах класс изображается в виде прямоугольника со сплошной границей, разделённого горизонтальными линиями на три секции «сущность–свойства– операции», при этом те классы, которые изменяют состояние других или первыми инициируют сообщения – называются активными классами и выделяются жирной линией рамки.
Прежде чем перейти к строгому формальному описанию класса, приближённому к правилу инкапсуляции в языке С++, следует выполнить неформальное его описание простым языком, придерживаясь при этом правил языка UML.
67
Этот процесс носит название «описание контракта класса», т.е. определение того, что должен будет делать экземпляр данного класса. Выполнить неформальное описание класса можно непосредственно в секциях, предназначенных для разграничения элементов класса. Пример класса приведён на рисунке 16. Ещё раз обращаем внимания читателя на применимость понятий класс и объект как экземпляр класса. В случае описания сущности предметной области мы применяем класс, в случае описания конкретных событий на основании альтернативных сценариев мы говорим об экземпляре класса, т.е. объекте.
|
68 |
|
|
|
|
|
ПакетПакет– описаниесание– прототипапрототипаклассаклассаWindowsWindows |
|
|
|
|
||
|
WindowsWindows |
|
|
|
|
|
СекцияСекцияимениимени |
|
|
|
|
|
|
классакласса. Содержит. Содержит |
|
|
|
СекцияСекцияспискасписка |
||
имя имяклассаклассаи и |
«атрибуты«атрибуты» » |
|
|
|||
|
|
атрибутоватрибутов |
||||
другиедругиеобщиеобщие |
|
|
||||
|
|
|
||||
размерразмерпо вертикалипо вертикали; ; |
|
(т.е.параме(т. .параметровтров) ) |
||||
свойствавойства( частно(в частно- - |
|
|||||
|
|
|
классакл.асса. |
|||
ностиности, уровень, уровень в |
размерразмерпо горизонталипо горизонтали; |
; |
||||
Значеначенияпараметпарамет- - |
||||||
иерархииерархииклассовклассов) ) |
|
|
|
|||
ширинаширинарамкирамки; ; |
|
|
ров могутровмогутбытьбыть |
|||
|
|
|
||||
|
цветцветрамкирамки; ; |
|
|
полученыполученыиз услоиз -усло- |
||
|
|
|
вий выполневийвыполненияния |
|||
|
|
|
|
|||
|
цветцветокнаокна; ; |
|
|
сценариясценариядля дандлядан- |
||
|
началоначалоко координат. . |
|
|
ного ногоклассакласса. . |
||
|
|
|
|
|
||
|
«операции«операции» » |
|
|
|
|
|
СекцияСекцияспискасписка |
прорисоватьпрорисоватьокноокнов указанв указан- - |
|
|
|||
функцийфункцийметодови методов |
номномместеместеэкранаэкранас указанс указан- - |
|
|
|||
классаклассасодержитсодержит |
ныминымипараметрами; |
; |
|
|
|
|
«обязанности«обязанности |
закрытьзакрытьокноокнос выдачейс выдачейсосо- |
|
|
|||
классакласса» по»сценапо сцена- - |
общенияобщенияподтвержедржедннииии |
|
|
|||
риюрию |
закрытиязакрытияокнаокна. . |
|
|
|
|
|
Пакет – описание прототипа класса Windows |
|
|
|
|
||
|
Windows |
|
|
|
|
|
Секция имени |
|
|
|
|
|
|
класса. Содержит |
|
|
|
|
|
|
имя класса и |
«атрибуты» |
|
|
|
|
|
другие общие |
|
|
|
|
||
размер по вертикали; |
|
|
|
|
||
свойства (в частно- |
|
|
|
|
||
|
|
|
|
|
||
сти, уровень в |
размер по горизонтали; |
|
Секция списка атри- |
|||
иерархии классов) |
ширина рамки; |
|
|
|||
|
|
бутов (параметров) |
||||
|
|
|
||||
|
|
|
|
|||
|
цвет рамки; |
|
|
класса. |
|
|
|
цвет окна; |
|
|
Значения параметров |
||
|
|
|
могут быть |
извлече- |
||
|
|
|
|
|||
|
начало координат. |
|
|
ны из условий вы- |
||
|
|
|
|
полнения |
сценария |
|
|
«операции» |
|
|
для данного класса. |
||
Секция списка |
прорисовать окно в указан- |
|
|
|||
функций и методов |
ном месте экрана с указан- |
|
|
|||
класса содержит |
ными параметрами; |
|
|
|
|
|
«обязанности |
закрыть окно с выдачей со- |
|
|
|||
класса» по сцена- |
общения о подтвержеднии |
|
|
|
||
рию |
закрытия окна. |
|
|
|
|
|
Рисунок 16 – Пример описания класса «Windows» |
|
|||||
Указанный на рисунке 16 пример пакета может быть связан с другим пакетом, в котором будет описано формальное отражение неформального описания контракта класса. Такая связь может быть реализована посредством отношения
Секция списка атрибутов (параметров) класса.
Значения параметров могут быть извлечены из условий выполнения сценария для данного класса.
69
«расширение». Правила формального описания класса просты и приближены к языку С++.
Секция атрибутов или операций может изображаться пустой в том случае, если при описании класса атрибуты или операции ещё не определены полностью (на основании принципа итерационного проектирования). Для отсутствующей секции допускается не рисовать разделительную линию и как-либо указывать на наличие или отсутствие элементов в ней.
Секция имени класса состоит из следующих обозначений:
1)имя класса (если класс абстрактный – курсивом);
2)имя базового класса (если существует);
3)дополнительные свойства – имя автора и т.п. (необязательное поле).
Секция списков атрибутов класса
Атрибут класса – это элемент данных класса, т.е. элемент данных, который
содержится в объекте − экземпляре описываемого класса.
Атрибут изображается в виде текстовой строки, отражающей различные его свойства по следующей схеме:
<признак видимости><имя атрибута>:<тип атрибута>=<значение по умолчанию>{свойства}
при этом:
–признак видимости – имеет С++ семантику видимости членов класса (если признак опущен, то это означает, что область видимости не определена), признак видимости «public» – (обозначается символом «+») означает, что любая сущность, имеющая доступ к объекту определяемого класса, имеет доступ и к этому атрибуту; признак видимости «protected»– (обозначается символом «#») означает, что к атрибуту имеют доступ только методы данного класса и его потомков; признак видимости «private»– (обозначается символом «–») означает, что атрибут доступен только методам класса;
–имя атрибута– это идентификатор, представляющий имя атрибута;
–тип атрибута – зависящее от языка реализации описание типа атрибута;
–значение по умолчанию – начальное (не обязательное) значение для атрибута вновь созданного объекта (по условию из сценария);
–свойства – строка дополнительных свойств элемента таких, например, как const, static и др., если свойства не указываются, то скобки {} опускаются.
Примечание: детали, касающиеся типов атрибутов, не специфицированы UML, однако для этих целей следует применять синтаксис языка программиро-
70
вания С++ (тип может представлять собой простой базовый тип или тип определённый разработчиком), как, например:
Int counter; //переменная целого типа Int * intPointer; //указатель на целый тип
OtherСlass *; // указатель на класс OtherСlass
Секция списков операций класса
Операция класса – некое действие, которое может быть выполнено представителем (экземпляром) класса по сценарию. Как мы знаем, действия могут быть реализованы посредством методов (конструкторов класса) и функций. В секции описываются прототипы конструкторов и функций класса. Операция изображается текстовой строкой, имеющей следующий состав элементов:
<признак видимости> <имя>(список параметров):[<тип возвращаемого значения>] {свойства}
при этом:
–признак видимости, имя и свойства имеют тот же смысл, что и для атрибута класса;
–тип возвращаемого значения – (не обязательно), зависящее от языка реализации описание типа значения, возвращаемого функцией, если оно не указано, то предполагается, что функция не возвращает значения (void для C/C++), для конструкторов класса возвращаемое значение отсутствует;
–список параметров – список формальных параметров, разделённых запятыми, например:
<имя1>:<тип>=<значение по умолчанию>, <имя2>:<тип>=<значение по умолчанию>,…
при этом:
–имя – имя параметра;
–тип – зависящее от языка реализации описание типа параметра;
–значение по умолчанию – значение параметра (по условию сценария). Примечание: операции, определённые в классе, можно разделить на группы,
каждая группа имеет заключённый в кавычки заголовок-строку. К группе относятся все нижестоящие элементы до нового заголовка. Пример формального описания класса и групп операций («конструкторы» и «открытые функции») приведён на рисунке 16.
Отношения в диаграмме классов
В языке UML определены четыре типа отношений (которые применимы не только для рассматриваемых диаграмм классов):