КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
ТЕМА: UML. Построение диаграммы классов.
Литература: 1. Леоненков А. В. Самоучитель UML. - 2-е изд. 2. Бабич А. Введение в UML. //курс НОУ «ИНТУИТ».
Центральное место в методологии ООАП занимает разработка логической модели системы в виде диаграммы классов. Диаграмма классов отражает, в частности, различные взаимосвязи между отдельными сущностями предметной области, такими как объекты и подсистемы, а также описывает их внутреннюю структуру и типы отношений. На данной диаграмме не указывается информация о временных аспектах функционирования системы. С этой точки зрения диаграмма классов может служить дальнейшим развитием концептуальной модели проектируемой системы. Диаграмма классов (class diagram) - диаграмма языка UML, на которой представлена совокупность декларативных или статических элементов модели, таких как классы с атрибутами и операциями, а также связывающие их отношения. Диаграмма классов предназначена для представления статической структуры модели системы в терминологии классов объектно-ориентированного программирования. При этом диаграмма классов может содержать интерфейсы, пакеты, отношения и даже отдельные экземпляры классификаторов, такие как объекты и связи. Определение 1. Класс (class) - абстрактное описание множества однородных объектов, имеющих одинаковые атрибуты, операции и отношения с объектами других классов. Классы - это строительные блоки любой объектно-ориентированной системы. При проектировании объектно-ориентированных систем диаграммы классов обязательны. Классы используются в процессе анализа предметной области для составления словаря предметной области разрабатываемой системы. Это могут быть как абстрактные понятия предметной области, так и классы, на которые опирается разработка и которые описывают программные или аппаратные сущности. Графически класс в нотации языка UML изображается в виде прямоугольника, который дополнительно может быть разделен горизонтальными линиями на разделы или секции (рис. 1). В этих секциях могут указываться имя класса, атрибуты и операции класса. Рис. 1. Варианты графического изображения класса на диаграмме классов. На начальных этапах разработки диаграммы отдельные классы могут обозначаться простым прямоугольником, в котором должно быть указано имя соответствующего класса (рис. 1 а). По мере проработки отдельных компонентов диаграммы описание классов дополняется атрибутами (рис. 1 б) и операциями (рис. 1 в). Четвертая секция (рис. 1 г) не обязательна и служит для размещения дополнительной информации справочного характера, например, об исключениях или ограничениях класса, сведения о разработчике или языке реализации. Предполагается, что окончательный вариант диаграммы содержит наиболее полное описание классов, которые состоят из трех или четырех секций. Рис. 2. Примеры графического изображения конкретных классов. Даже если секции атрибутов и операций пусты, в обозначении класса они должны быть выделены горизонтальной линией, с тем чтобы отличить класс от других элементов языка UML. Примеры графического изображения конкретных классов приведены на рис. 2. В первом случае для класса Окружность (рис. 2 а) указаны только его атрибуты – точка на координатной плоскости, которая определяет расположение ее центра. Для класса Окно (рис. 2 б) указаны только его операции, при этом секция его атрибутов оставлена пустой. Для класса Счет (рис. 2 в) дополнительно изображена четвертая секция, в которой указано требование – реализовать резервное копирование объектов этого класса. Имя класса. Названия классов выбираются в соответствии с понятиями предметной области. Это должно быть существительное или словосочетание в единственном числе, наиболее точно характеризующее предмет. Класс должен описывать только одну сущность. Имя класса должно быть уникальным в пределах пакета, который может содержать одну или несколько диаграмм классов. Имя указывается в самой верхней секции прямоугольника, поэтому она часто называется секцией имени класса. В дополнение к общему правилу именования элементов языка UML, имя класса записывается по центру секции имени полужирным шрифтом и должно начинаться с заглавной буквы. Рекомендуется в качестве имен классов использовать существительные, записанные по практическим соображениям без пробелов. Необходимо помнить, что имена классов образуют словарь предметной области при ООАП. Если необходимо явно указать, к какому пакету относится тот или иной класс, то используется специальный символ-разделитель – двойное двоеточие. Синтаксис строки имени класса в этом случае будет следующий: <Имя пакета>::< Имя класса >. Например, если определен пакет с именем Банк, то класс Счет в этом банке может быть записан в виде: Банк::Счет (рис. 3). Рис. 3. Составное имя класса. В секции имени класса могут также находиться стереотипы или ссылки на стандартные шаблоны, от которых образован данный класс и, соответственно, от которых он наследует атрибуты и операции. В этой секции может также приводиться информация о разработчике данного класса и статус состояния разработки. Здесь также могут записываться и другие общие свойства этого класса, имеющие отношение к другим классам диаграммы или стандартным элементам языка UML. Класс может иметь или не иметь экземпляров или объектов. В зависимости от этого в языке UML различают конкретные и абстрактные классы. Определение 2. Конкретный класс (concrete class) - класс, на основе которого могут быть непосредственно созданы экземпляры или объекты. Рассмотренные выше обозначения относятся к конкретным классам. Определение 3. Абстрактный класс (abstract class) - класс, который не имеет экземпляров или объектов. Для обозначения имени абстрактного класса используется наклонный шрифт (курсив). В языке UML принято общее соглашение о том, что любой текст, относящийся к абстрактному элементу, записывается курсивом. Атрибуты класса. Определение 4. Атрибут (attribute) - содержательная характеристика класса, описывающая множество значений, которые могут принимать отдельные объекты этого класса. Атрибут класса служит для представления отдельного свойства или признака, который является общим для всех объектов данного класса. Атрибуты класса записываются во второй сверху секции прямоугольника класса. Эту секцию часто называют секцией атрибутов. В языке UML принята определенная стандартизация записи атрибутов класса, которая подчиняется некоторым синтаксическим правилам. Каждому атрибуту класса соответствует отдельная строка текста, которая состоит из: 1. квантора видимости атрибута; 2. имени атрибута; 3. его кратности; 4. типа значений атрибута; 5. возможно, его исходного значения. Общий формат записи отдельного атрибута класса следующий: <квантор видимости> <имя атрибута> [кратность] : <тип атрибута> = <исходное значение> {строка-свойство}. Все элементы, кроме имени атрибута, являются необязательными спецификациями атрибутов и могут быть опущены. Однако их использование позволяет сделать модель более полной и управлять взаимоотношениями между классами, разграничивая их права доступа. Примеры: фамилия – указано только имя атрибута; +фамилия – имя и видимость; фамилия : String – имя и тип значений атрибута; товаровВКорзине [0..*] : Integer – имя, кратность и тип; -ID [1] : String {=frozen} – видимость, имя, кратность, тип и свойство; товаровВКорзине : Integer = 0 – имя и начальное значение. Опишем спецификации атрибутов подробно. Имя атрибута представляет собой строку текста, которая используется в качестве идентификатора соответствующего атрибута и поэтому должна быть уникальной в пределах данного класса. Имя атрибута - единственный обязательный элемент синтаксического обозначения атрибута. Оно должно начинаться со строчной (малой) буквы и не должно содержать пробелов, если оно содержит несколько слов, то остальные слова, кроме первого, пишутся с большой буквы: фамилия или фамилияСотрудника. Определение 5. Видимость (visibility) - качественная характеристика описания свойств класса, характеризующая потенциальную возможность других объектов модели использовать это свойство (атрибут или операцию). Видимость в языке UML специфицируется с помощью квантора видимости (visibility), который может принимать одно из 4-х возможных значений и отображаться при помощи специальных символов. 1. Символ "+" – обозначает атрибут с областью видимости типа общедоступный (public). Атрибут с этой областью видимости доступен или виден из любого другого класса пакета, в котором определена диаграмма. 2. Символ "#" – обозначает атрибут с областью видимости типа защищенный (protected). Атрибут с этой областью видимости недоступен или не виден для всех классов, за исключением подклассов (потомков) данного класса. 3. Символ "-" – обозначает атрибут с областью видимости типа закрытый (private). Атрибут с этой областью видимости недоступен или не виден для всех классов без исключения. 4. Символ "~" - обозначает атрибут с областью видимости типа пакетный (package). Атрибут с этой областью видимости недоступен или не виден для всех классов за пределами пакета, в котором определен класс-владелец данного атрибута. Квантор видимости может быть опущен. Его отсутствие означает, что видимость атрибута не указывается. Эта ситуация отличается от принятых по умолчанию соглашений в традиционных языках программирования, когда отсутствие квантора видимости трактуется как public или private. Однако вместо условных графических обозначений можно записывать соответствующее ключевое слово: public, protected, private, package. Определение 6. Кратность (multiplicity) - спецификация области значений допустимой мощности, которой могут обладать соответствующие множества. Кратность указывает, сколько экземпляров данного атрибута может иметь экземпляр класса. Значение кратности записывается в квадратных скобках, в которых указывается возможный диапазон кратности атрибута: [нижняя граница .. верхняя граница], где нижняя и верхняя границы положительные целые числа. В качестве верхней границы может использоваться специальный символ «*» (звездочка), который означает произвольное положительное целое число, т.е. неограниченное сверху значение кратности соответствующего атрибута. Интервалов кратности отдельного атрибута может быть несколько. При этом придерживаются следующего правила: соответствующие нижние и верхние границы интервалов включаются в значение кратности. Если в качестве кратности указывается единственное число, то кратность атрибута принимается равной данному числу. Примеры записи кратности атрибута: 0..1 - ноль или один; 1 или 1..1 - ровно один; 2..* - два или больше; 2..5 - 2,3,4 или 5; 1..3,5,8..10 - 1,2,3,5,8,9или 10; * - любое положительное число или ноль. В языке UML кратность широко используется также для задания ролей ассоциаций, составных объектов и значений атрибутов. Если кратность атрибута не указана, то по умолчанию в языке UML принимается ее значение равное [1..1], т.е. в точности 1. Тип атрибута представляет собой выражение, семантика которого определяется некоторым типом данных, определенным в пакете «Типы данных языка UML» или самим разработчиком. Тип атрибута может определяется в зависимости от языка программирования, который предполагается использовать для реализации данной модели. Если в качестве атрибута класса выступает другой класс, то типом атрибута будет этот класс. В простейшем случае тип атрибута указывается строкой текста, имеющей осмысленное значение в пределах пакета или модели, к которым относится рассматриваемый класс. Исходное значение служит для задания начального значения соответствующего атрибута в момент создания отдельного экземпляра класса. Здесь необходимо придерживаться правила принадлежности значения типу конкретного атрибута. Если исходное значение не указано, то значение соответствующего атрибута не определено на момент создания нового экземпляра класса. С другой стороны, конструктор объекта может переопределять исходное значение в процессе выполнения программы, если в этом возникает необходимость. При задании атрибутов могут быть использованы дополнительные синтаксические конструкции - это подчеркиваниестроки атрибута, пояснительный текств фигурных скобках и косая черта перед именем атрибута. Подчеркивание строки атрибута означает, что соответствующий атрибут общий для всех объектов данного класса, т.е. его значение у всех создаваемых объектов одинаковое (аналог ключевого слова static в некоторых языках программирования). Пояснительный текст в фигурных скобках может означать две различные конструкции. Если в этой строке имеется знак равенства, то вся запись Строка-свойство служит для указания дополнительных свойств атрибута, которые могут характеризовать особенности изменения значений атрибута в ходе выполнения программы. Фигурные скобки как раз и обозначают фиксированное значение соответствующего атрибута для класса в целом, которое должны принимать все вновь создаваемые экземпляры класса без исключения. Это значение принимается за исходное значение атрибута, которое не может быть переопределено в последующем. Отсутствие строки-свойства по умолчанию трактуется так, что значение соответствующего атрибута может быть изменено в программе. Знак " / " перед именем атрибута указывает на то, что данный атрибут является производным от некоторого другого атрибута этого же класса. Определение 7. Производный атрибут (derived element) - атрибут класса, значение которого для отдельных объектов может быть вычислено посредством значений других атрибутов этого же объекта. Операции класса. Определение 8. Операция (operation) - это сервис, предоставляемый каждым экземпляром или объектом класса по требованию своих клиентов, в качестве которых могут выступать другие объекты, в том числе и экземпляры данного класса. Операции класса записываются в третьей сверху секции прямоугольника класса, которую часто называют секцией операций. Совокупность операций характеризует функциональный аспект поведения всех объектов данного класса. Запись операций класса в языке UML также стандартизована и подчиняется определенным синтаксическим правилам. При этом каждой операции класса соответствует отдельная строка, которая состоит из: 1. квантора видимости операции; 2. имени операции; 3. выражения типа возвращаемого операцией значения; 4. возможно, строки-свойства данной операции. Общий формат записи отдельной операции класса следующий: <квантор видимости> <имя операции>(список параметров): <выражение типа возвращаемого значения> {строка-свойство} Все элементы, кроме имени операции и круглых скобок, являются необязательными спецификациями операций. Примеры: отобразить() – указано только имя операции; +отобразить() – имя и видимость; +добавитьТоварВКорзину(inout t:Товар) – видимость, имя, параметр, тип параметра и его направление; удалитьТоварИзКорзины(q:ТоварВКорзине) – указаны имя и параметр; изменитьКоличествоТовара(q:ТоварВКорзине, inout n: Integer): Integer – имя операции, параметры, направление параметра и тип возвращаемого значения. Раскроем смысл спецификаций операций. Имяоперации совместно с ее параметрами называют сигнатурой операции. Имя операции – это строка текста, которая используется в качестве идентификатора соответствующей операции и поэтому должна быть уникальной в пределах данного класса. В качестве имени обычно используют глагол или короткое глагольное выражение. Если оно состоит из нескольких слов, то все слова, кроме первого, пишутся с большой буквы и записываются без пробелов: добавить или добавитьТоварВКорзину. Квантор видимости, как и в случае атрибутов класса, может принимать одно из четырех возможных значений и, соответственно, отображается при помощи специального символа либо ключевого слова. 1. Символ "+" обозначает операцию с областью видимости типа общедоступный (public). 2. Символ "#" обозначает операцию с областью видимости типа защищенный (protected). 3. Символ "-" используется для обозначения операции с областью видимости типа закрытый (private). 4. Символ "~" используется для обозначения операции с областью видимости типа пакетный (package). Квантор видимости для операции может быть опущен. В этом случае его отсутствие просто означает, что видимость операции не указывается. Вместо условных графических обозначений также можно записывать соответствующее ключевое слово: public, protected, private, package. Определение 9. Параметр (parameter) - спецификация переменной операции, которая может быть изменена, передана или возвращена. Параметр может включать имя, тип, направление и значение по умолчанию. Список параметров является перечнем разделенных запятой формальных параметров, каждый из которых, в свою очередь, может быть представлен в следующем виде: <направление параметра> <имя>: <тип> = <значение параметра по умолчанию>. Имя параметра есть идентификатор соответствующего формального параметра, написанный с маленькой буквы. Направление параметра может принимать одно из нижеследующих значений: 1. in – входящий параметр, который не может быть изменен; 2. out – выходящий параметр, который может быть изменен, чтобы передать информацию вызвавшей процедуре; 3. inout – входящий параметр, который может быть изменен. По умолчанию, если направление параметра не указано, принимается значение in. Выражение типа является спецификацией типа данных для допустимых значений соответствующего формального параметра. Тип данных параметра может быть стандартным типом UML, либо, если в качестве входного параметра операция использует целый класс, то параметр имеет типом этот класс. В StarUML допускаются четыре стандартных типа UML: String, Integer, Float, Boolean. Параметр может также быть типом класса, который используется в данной операции. Тип параметра записывается с большой буквы (рис. 4). Рис. 4. Параметр операции типа Order. Значение параметра по умолчанию в общем случае представляет собой некоторое конкретное значение для этого формального параметра. Выражение типа возвращаемого значения операции также указывает на тип данных значения, которое возвращается объектом после выполнения соответствующей операции. Две точки и выражение типа возвращаемого значения могут быть опущены, если операция не возвращает никакого значения. Для указания нескольких возвращаемых значений данный элемент спецификации операции может быть записан в виде списка отдельных выражений. Выражение типа возвращаемого значения еще называют возвращаемым классом операции. Для определения возвращаемого класса можно использовать встроенные типы (String, Float, Integer, Boolean) или типы, определенные в вашей модели Пример. Для того чтобы класс Order (Заказ) мог найти товары и добавить их в заказ, определим для него операцию findItem(). Результатом выполнения этой операции может быть элемент типа Item (рис. 5). Рис. 5. Возвращаемое значение типа Item. Операция с областью действия на весь класс показывается подчеркиванием всей строки записи операции. В этом случае под областью действия операции понимаются все объекты этого класса. Строка-свойство служит для указания значений свойств, которые могут быть применены к данной операции. Строка-свойство может отсутствовать, если свойства не специфицированы. Расширение языка UML для построения моделей программного обеспечения и бизнес-систем. Одним из несомненных достоинств языка UML является наличие механизмов расширения, которые позволяют ввести в рассмотрение дополнительные графические обозначения, ориентированные для решения задач из определенной предметной области. Язык UML содержит два специальных расширения: профиль для процесса разработки программного обеспечения (The UML Profile for Software Development Processes) и профиль для бизнес-моделирования (The UML Profile for Business Modeling). В рамках первого из них предложено три специальных графических примитива, которые могут быть использованы для уточнения семантики отдельных классов при построении различных диаграмм: 1. Управляющий класс (control class) – класс, отвечающий за координацию действий других классов. На каждой диаграмме классов должен быть хотя бы один управляющий класс, причем количество посылаемых объектам управляющего класса сообщений мало, по сравнению с числом рассылаемых ими. Управляющий класс отвечает за координацию действий других классов. У каждой диаграммы классов должен быть хотя бы один управляющий класс, контролирующий последовательность выполнения действий этого варианта использования. Он запускает альтернативные потоки и знает, как поступить в случае ошибки. Как правило, данный класс является активным и инициирует рассылку множества сообщений другим классам модели. На начальном этапе проектирования управляющие классы создаются для каждой пары актер/прецедент, в дальнейшем они могут объединяться, разделяться или исключаться. Кроме специального обозначения управляющий класс может быть изображен в форме прямоугольника класса со стереотипом <<control>> (рис. 6 а).. 2. Класс-сущность (entity class) – пассивный класс, информация о котором должна храниться постоянно и не уничтожаться с выключением системы. Класс-сущность содержит информацию, которая должна храниться постоянно и не уничтожается с уничтожением объектов данного класса или прекращением работы моделируемой системы, связанные с выключением системы или завершением программы. Как правило, этот класс соответствует отдельной таблице базы данных. В этом случае его атрибуты являются полями таблицы, а операции – присоединенными или хранимыми процедурами. Этот класс пассивный и лишь принимает сообщения от других классов модели. Класс-сущность может быть изображен также стандартным образом в форме прямоугольника класса со стереотипом <<entity>> (рис. 6 б). 3. Граничный класс (boundary class) – класс, который располагается на границе системы с внешней средой и непосредственно взаимодействует с актерами, но является составной частью системы. Для вычисления граничных классов необходимо исследовать диаграммы вариантов использования. Для каждого взаимодействия между актером и прецедентом нужно создать хотя бы один граничный класс. Если два действующих лица инициируют один прецедент, то они могут применять один общий пограничный класс для взаимодействия с системой. Граничный класс может быть изображен также стандартным образом в форме прямоугольника класса со стереотипом <<boundary>> (рис. 6 в). Рис. 6. Графическое изображение классов для моделирования программного обеспечения. В рамках второго профиля также предложено три специальных графических примитива, которые могут быть использованы для уточнения семантики отдельных классов при построении моделей бизнес-систем: 1. Сотрудник (business worker) – класс, служащий на диаграмме классов для представления любого сотрудника, который является элементом бизнес-системы и взаимодействует с другими сотрудниками при реализации бизнес-процесса. Этот класс также может быть изображен в форме прямоугольника класса со стереотипом <<worker>> или <<internalWorker>> (рис. 7 а). 2. Сотрудник для связи с окружением (caseworker) – класс, служащий для представления в бизнес-системе такого сотрудника, который, являясь элементом бизнес-системы, непосредственно взаимодействует с актерами (бизнес-актерами) при реализации бизнес-процесса. Этот класс также может быть изображен в форме прямоугольника класса со стереотипом <<caseWorker>> (рис. 7 б). 3. Бизнес-сущность (business entity) – специальный случай класса-сущности, который также не инициирует никаких сообщений. Этот класс служит для сохранения информации о результатах выполнения бизнес-процесса в моделируемой бизнес-системе или организации. Этот класс также может быть изображен в форме прямоугольника класса со стереотипом <<business entity>> (рис. 7 в). Рис. 7. Графическое изображение классов для моделирования бизнес-систем. Интерфейс. Определение 10. Интерфейс (interface) – именованное множество операций, которые характеризуют поведение отдельного элемента модели. Интерфейс – это логическая группа открытых ( public ) операций объекта, которые обеспечивают стандартный способ доступа к объекту. Один и тот же объект может иметь несколько интерфейсов (у телевизора, например, их два – пульт дистанционного управления и кнопки на корпусе). Это означает, что класс этого объекта реализует все операции этих интерфейсов. Интерфейс в контексте языка UML является специальным случаем класса, у которого имеются операции, но отсутствуют атрибуты. На диаграмме классов интерфейс изображается в виде маленького круга, рядом с которым записывается его имя, или стандартным способом – в виде прямоугольника класса со стереотипом <<interface>> (рис. 8 а). В качестве имени может использоваться существительное, которое характеризует соответствующую информацию или сервис, например, "Датчик температуры", "Форма ввода", "Сирена", "Видеокамера" (рис. 8 б). С учетом языка реализации модели имя интерфейса, как и имена других классов, рекомендуется записывать на английском и начинать с заглавной буквы I, например, ITemperatureSensor, IsecureInformation (рис. 8 в). Рис. 8. Примеры графического изображения интерфейсов на диаграммах классов. Интерфейсы на диаграмме служат для спецификации таких элементов модели, которые видимы извне, но их внутренняя структура остается скрытой от клиентов. Интерфейсы не могут содержать ни атрибутов, ни состояний, ни направленных ассоциаций. Они содержат только операции без указания особенностей их реализации. Формально интерфейс не только отделяет спецификацию операций системы от их реализации, но и определяет общие границы проектируемой системы. В последующем интерфейс может быть уточнен явным указанием тех операций, которые специфицируют отдельный аспект поведения системы. Графическое изображение интерфейсов в форме окружности могут использоваться и на других типах канонических диаграмм, например, диаграммах компонентов и развертывания. На рис. 9 показано, что подсистема ConduitSet обладает (предоставляет) интерфейс ISynchronize. Рис. 9. Изображение предоставляемого интерфейса. Существует еще один способ изображения интерфейса. Он не является альтернативой описанным ранее способам, а используется для изображения интерфейсов, требующихся объекту для выполнения его работы. Обозначается он символом . На рис. 10 показано, что классу DataCollector для работы требуется интерфейс IGetData. Рис. 10. Изображение предоставляемого интерфейса. На диаграммах довольно часто можно увидеть такую картинку (рис. 11): Рис. 11.
|