Перечисление

Расширенные концепции классов и объектов

Примеры моделей классов

На рис. 24 показана модель классов системы управления окнами для рабочей станции. Эта модель значительно упрощена (для реальной модели потребовалось бы несколько страниц), но она демонстрирует многие конструкции моделей классов и их совместное использование.

Класс Window определяет общие параметры окон всех типов, в частности прямоугольную границу, определяемую атрибутами х1, у1, х2, у2, и операции, позволяющие отображать и скрывать окно, а также помещать его на передний или на задний план в общем наборе окон.

 

Рисунок 24 – Модель классов системы управления окнами

 

Холстом (canvas) называется область, в которой может отображаться графика. Canvas наследует границу от класса Window и добавляет размеры области холста, которые определяются атрибутами сх1, су1, сх2, су2. Canvas содержит множество элементов, на что указывает ассоциация с классом Shape. Все фигуры характеризуются цветом и шириной линии. Фигуры могут быть линиями, эллипсами или многоугольниками. Каждый класс фигур обладает своими собственными параметрами. Многоугольник (Polygon) определяется списком его вершин. Эллипсы (Ellipse) и многоугольники являются замкнутыми фигурами, которые характеризуются цветом и шаблоном заливки. Линии (Line) являются одномерными, а потому не могут быть залиты. Холст поддерживает операции добавления и удаления элементов.

Текстовое окно TextWindow — это разновидность окна с полосами прокрутки ScrollingWindow, которое характеризуется двумя смещениями прокрутки xOffset и yOffset и поддерживает операцию scroll, изменяющую значения смещений. Текстовое окно содержит строку и поддерживает операции вставки и удаления символов. Холст с прокруткой (ScrollingCanvas) — особая разновидность холста, поддерживающая прокрутку. Это окно одновременно является холстом и окном с прокруткой. Таким образом, оно являет собой пример множественного наследования.

Панель (Panel) содержит множество объектов Panelltem, каждый из которых характеризуется уникальным в рамках одной панели именем itemName, о чем говорит наличие квалификатора у соответствующей ассоциации. Каждый элемент панели может принадлежать только одной панели. Такой элемент представляет собой предопределенный значок, посредством которого пользователь может взаимодействовать с системой. Элементы панели бывают трех видов: кнопки, переключатели и текстовые элементы. Кнопка (Button) характеризуется отображаемой на экране строкой, а также атрибутом depressed, который показывает, нажата она или нет. Переключатель (Switch) позволяет пользователю выбрать один из предопределенных вариантов, каждый из которых является объектом класса ChoiceEntry, характеризующимся отображаемой строкой и возвращаемым при его выборе значением. Между Choiceltem и ChoiceEntry имеется две ассоциации: ассоциация один-ко-многим определяет множество доступных вариантов, а ассоциация один-к-одному определяет выбранный вариант. Выбранный вариант должен быть одним из доступных, поэтому одна ассоциация является подмножеством другой, на что указывает стрелка со словом {subset}. Это пример ограничения.

Когда элемент панели выбирается пользователем, это порождает событие (Event), которое представляет собой объединение сигнала о происшествии с подлежащим выполнению действием. Все виды элементов панелей имеют ассоциации notifyEvent. Каждый элемент связан с одним событием, но одно и то же событие может порождаться несколькими элементами панели. Текстовые элементы порождают события другого типа, связанные с нажатием на клавишу клавиатуры, происходящим в тот момент, когда текстовый элемент является выбранным. Эти события указываются ассоциацией с именем полюса keyboardEvent. Текстовые элементы наследуют событие notifyEvent от суперкласса Panelltem. Событие notifyEvent порождается при выделении текстового элемента мышью.

Эта модель обладает множеством недостатков. Например, нам следовало бы определить тип Rectangle, который можно было бы использовать для определения границ окон и холстов, а не вводить два одинаковых набора из четырех атрибутов. Линия могла бы быть частным случаем полилинии (последовательности соединенных между собой линейных сегментов), и тогда полилиния и многоугольник были бы подклассами нового суперкласса, определяющего список точек. Здесь не хватает множества атрибутов, операций и классов, которые необходимы для реальной оконной системы. Между окнами должны быть ассоциации, например, они могут перекрывать одно другое. Тем не менее эта простая модель даст вам некоторое ощущение того, что должна представлять собой модель классов. Мы можем критиковать ее, потому что она содержит в себе некоторые четкие утверждения. Такая модель могла бы послужить основой для создания более полной модели.

 

 

Тип данных — это описание возможных значений. К типам данных относятся числа, строки и перечисления. Перечисление (enumeration) — это тип данных, имеющий конечное множество значений. Например, атрибут accessPermission (разрешениеДоступа) на рис. 15 представляет собой перечисление с возможными значениями read (чтение) и read-write (чтение и запись). На рис. 23 так-же присутствуют перечисления, которые вынесены на рис. 25. Figure.реnТуре (Фигура.типКисти) — перечисление, включающее возможные значения solid (сплошная), dashed (штриховая) и dotted (пунктирная). TwoDimensional.fillType (Двумерная.типЗаливки) — перечисление, включающее возможные значения solid (сплошная), grey (полутон), none (нет), horizontal lines (горизонтальные линии) и vertical lines (вертикальные линии).

Рисунок 25 – Примеры перечислений

 

При конструировании моделей перечисления следует обязательно выделять, потому что они встречаются достаточно часто и важны для пользователей. Перечисления важны и для реализации. Все возможные значения перечисления можно указать в списке для выбора. Необходимо также ограничить возможные данные разрешенными значениями.

Не следует использовать обобщение для указания значений перечислимого атрибута. Перечисление — это просто список значений, а обобщение предназначено для упорядочивания описания объектов. Обобщение следует использовать только там, где по крайней мере один из подклассов обладает атрибутами, операциями или ассоциациями, неприменимыми к суперклассу. Как показано на рис. 26, не следует строить обобщение класса Card, потому что в большинстве игр карты разных мастей ведут себя одинаково.

Рисунок 26 – Объявление перечисления

 

В языке UML перечисление является типом данных. Для объявления перечисления необходимо указать ключевое слово enumeration в угловых кавычках («») над именем перечисления в верхнем разделе прямоугольника. Во втором разделе перечисляются значения перечисления (рис. 26).