Построение концептуальной модели предметной области

Диаграммы классов

Центральное место в объектно-ориентированном подходе к проектированию программного обеспечения занимает разработка логической модели системы в виде диаграммы классов (class diagram) [1, 48].

UML предлагает использовать три уровня диаграмм классов в зависимости от степени их детализации:

  • • концептуальный уровень, на котором диаграммы классов отображают связи между основными понятиями предметной области;
  • • уровень спецификаций, на котором диаграммы классов отображают связи объектов этих классов;
  • • уровень реализации, на котором диаграммы классов непосредственно показывают поля и операции конкретных классов.

Каждую из перечисленных моделей используют на конкретном этапе разработки программного обеспечения:

  • • концептуальную модель — на этапе анализа;
  • • диаграммы классов уровня спецификации — на этапе проектирования;
  • • диаграммы классов уровня реализации — на этапе реализации.

Диаграмма классов может отражать различные взаимосвязи между отдельными сущностями предметной области, такими как объекты и подсистемы, а также описывает их внутреннюю структуру и типы отношений. Диаграммы классов обычно содержат следующие сущности:

  • • классы;
  • • интерфейсы;
  • • кооперации;
  • • отношения зависимости, обобщения и ассоциации.

Когда говорят о данной диаграмме, имеют в виду статическую структурную модель проектируемой системы, поэтому диаграмму классов принято считать графическим представлением таких взаимосвязей логической модели системы, которые не зависят от времени [48].

Класс

Класс (class) в языке UML служит для обозначения множества объектов, которые имеют одинаковую структуру, поведение и отношения с объектами из других классов. На диаграмме класс изображают в виде прямоугольника, который дополнительно может быть разделен горизонтальными линиями на две или три секции (рис. 3.40). В этих разделах могут указываться имя класса, атрибуты (переменные) и операции (методы). Иногда в графическом изображении класса добавляется четвертая секция, содержащая описание исключительных ситуаций.

Имя Класса

Имя Класса

Имя Класса

а

Атрибуты

Класса

Атрибуты

Класса

б

Операции

Класса

в

Рис. 3.40. Графическое изображение класса на диаграмме классов

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

Чтобы сразу отличить класс от других элементов языка иМЬ, секцию атрибутов и операций выделяют горизонтальной линией, даже если она является пустой. На рис. 3.41 приведены примеры графического изображения классов на диаграмме классов. В первом случае для класса «Прямоугольник»

Счет

а

Окно

проверить^)

показать()

скрыть()

б

Исключения

Кредитная карточка просрочена

в

Рис. 3.41. Примеры графического изображения классов

на диаграмме

(рис. 3.41, а) указаны только его атрибуты — точки на координатной плоскости, определяющие его местоположение. Для класса «Окно» (рис. 3.41, б) указаны только его операции (пока-зать(), скрыть()), секция атрибутов оставлена пустой. Для класса «Счет» (рис. 3.41, в), кроме операции проверки кредитной карточки, дополнительно изображена четвертая секция, в которой указано исключение — отказ от обслуживания просроченной кредитной карточки.

Имя класса

Имя класса должно быть уникальным в пределах диаграммы или совокупности диаграмм классов пакета. Оно указывается в первой верхней секции прямоугольника, записывается по центру секции имени полужирным шрифтом и должно начинаться с заглавной буквы. В качестве имен классов рекомендуется использовать одно или несколько существительных без пробелов между ними. Кроме того, в секции обозначения класса могут находиться ссылки на стандартные шаблоны или абстрактные классы, от которых образован данный класс и, соответственно, от которых он наследует свойства и методы.

Примерами имен классов могут быть такие существительные, как «Сотрудник», «Фирма», «Руководитель», «Покупатель», «Продавец» и многие другие, имеющие непосредственное отношение к моделируемой предметной области и функциональному назначению проектируемой системы.

Если класс не имеет экземпляров (объектов), то он называется абстрактным классом, его имя записывается курсивом так же, как любой текст, относящийся к абстрактному элементу.

Атрибуты класса

Во второй секции прямоугольника — графического изображения класса — записываются его атрибуты (attributes) или свойства. Стандартная запись атрибута в языке UML выглядит следующим образом:

сквантор видимостиХимя атрибута> [кратность] :

<тип атрибута> = <исходное значение>{строка-свойство}

Квантор видимости может быть опущен — это означает, что видимость атрибута не указывается либо же должна принимать одно из трех возможных значений:

  • • общедоступный (public) — обозначается «+»;
  • • защищенный (protected) — обозначается «#»;
  • • закрытый (private) — обозначается «-».

Имя атрибута — единственный обязательный элемент обозначения атрибута, представляет собой строку текста, которая используется в качестве идентификатора соответствующего атрибута и является уникальной в пределах данного класса.

Кратность атрибута показывает количество конкретных атрибутов данного типа, входящих в состав класса, и обозначается следующим образом:

[нижняя_граница1 .. верхняя_граница1, нижняя_граница2..

верхняя_граница2, ..., нижняя_границак ..

верхняя_границак],

где нижняя_граница и верхняя_граница являются положитель-ными целыми числами, каждая пара которых служит для обозначения отдельного замкнутого интервала целых чисел. В качестве верхней границы может использоваться специальный символ «*», который означает произвольное положительное целое число, т. е. неограниченное сверху значение кратности соответствующего атрибута.

Если в качестве кратности указывается единственное число, то кратность атрибута принимается равной данному числу. Значения кратности из интервала следуют в монотонно возрастающем порядке без пропуска отдельных чисел, лежащих между нижней и верхней границами, соответствующие нижние и верхние границы интервалов включаются в значение кратности. Если же указывается единственный знак «*», то это означает, что кратность атрибута может быть произвольным положительным целым числом или нулем.

Могут использоваться следующие варианты задания кратности атрибутов:

  • • [0..1] означает, что кратность атрибута может принимать значение 0 или 1. При этом 0 означает отсутствие значения для данного атрибута;
  • • [0..*] или просто [*] означает, что кратность атрибута может принимать любое положительное целое значение, большее или равное 0;
  • • [1..*] означает, что кратность атрибута может принимать любое положительное целое значение, большее или равное 1;
  • • [1..5] означает, что кратность атрибута может принимать любое значение из чисел 1,2,3, 4, 5;
  • • [ 1 ..3,7.. 10] означает, что кратность атрибута может принимать любое значение из чисел 1, 2, 3, 7, 8, 9, 10;
  • • [ 1 ..3,7..*] означает, что кратность атрибута может принимать любое значение из чисел 1, 2, 3, а также любое положительное целое значение, большее или равное 7.

Если кратность атрибута не указана, то по умолчанию принимается ее значение, равное 1.

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

Например:

имя_студента [1..2] : String - здесь имя_студента

является именем атрибута, тип атрибута String (строка).

Исходное значение служит для задания некоторого начального значения для соответствующего атрибута в момент создания отдельного экземпляра класса.

Например:

имя студента [1..2] : String = Иван.

Строка-свойство служит для указания фиксированных значений атрибута. Эти значения не могут быть изменены в программе при работе с данным типом объектов. При отсутствии строки-свойства значение соответствующего атрибута может быть изменено в программе. Например, строка-свойство в записи атрибута стипендия : Integer = {$50} означает фиксированную сумму стипендии для всех объектов класса «Студент». Запись данного атрибута в виде стипендия : Integer = $50 означает, что при создании нового экземпляра Студент для него устанавливается по умолчанию стипендия в 50 долл. Но по результатам очередной сессии некоторые студенты могут получать надбавки к стипендии и именные стипендии, а кто-то будет лишен стипендии вовсе, о чем необходимо позаботиться в программе.

Операция

Операцией класса (методом класса) называется именованный сервис, который предоставляется по требованию любым объектом данного класса. Другими словами, операция — это абстракция того, что можно делать с объектом. Класс может содержать любое число операций (в частности, не содержать ни одной операции). Набор операций класса является общим для всех объектов данного класса.

Операции класса определяются в секции, расположенной ниже секции атрибутов. При этом можно ограничиться только указанием имен операций, оставив детальную спецификацию выполнения операций на более поздние этапы моделирования. Для именования операций рекомендуется использовать глаголы, соответствующие ожидаемому поведению объектов данного класса. Описание операции имеет следующий вид:

сквантор видимостиХимя операции> (список параметров) :

<выражение типа возвращаемого

значения>{строка-свойство}.

Квантор видимости принимает такие же значения, как и в случае атрибутов класса, и может быть опущен. Вместо условных графических обозначений также можно записывать соответствующее ключевое слово: public, protected, private.

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

Список параметров является перечнем разделенных запятой формальных параметров, каждый из которых может быть представлен в следующем виде:

<вид параметраХимя параметра> : <выражение типа>=<значение параметра по умолчанию>.

Вид параметра — это одно из ключевых слов in, out или inout со значением in по умолчанию. Имя параметра есть идентификатор соответствующего формального параметра. Выражение типа зависит от конкретного языка программирования и описывает тип возвращаемого значения для соответствующего формального параметра. Значение по умолчанию в общем случае представляет собой выражение для значения формального параметра.

Выражение типа возвращаемого значения также является зависимой от языка реализации спецификацией типа или типов значений параметров, которые возвращаются объектом после выполнения соответствующей операции. Операция может не возвращать никакого значения. Для указания кратности возвращаемого значения данная спецификация может быть записана в виде списка отдельных выражений.

Строка-свойство служит для определения значений свойств данного элемента. Строка-свойство может отсутствовать, если никакие свойства не специфицированы.

Операция, которая не может изменять состояние системы, обозначается строкой-свойством {запрос} ({query}). Другие операции могут изменять состояние системы, хотя и необязательно будут это делать.

Описание операции на самом верхнем уровне объявляет эту операцию на весь класс, при этом данная операция наследуется всеми потомками данного класса. Если в некотором классе операция не выполняется, то такая операция может быть помечена как абстрактная ({abstract}). Можно также записать сигнатуру операции курсивом, чтобы обозначить ее абстрактной. Подчиненное появление записи данной операции без свойства {абстрактная} указывает на тот факт, что соответствующий класс-потомок может выполнять данную операцию в качестве своего метода.

Пример:

+создать() — обозначает абстрактную операцию по созданию отдельного объекта класса, которая является общедоступной (public) и не содержит формальных параметров. Эта операция не возвращает никакого значения после своего выполнения.

 
< Пред   СОДЕРЖАНИЕ     След >