Диаграммы классов. Ее назначение, использование. Класс. Имя класса. Атрибуты класса. Операция
Центральное место в объектно-ориентированном программировании занимает разработка логической модели системы в виде диаграммы классов.
Диаграмма классов (Class diagram) – структурная диаграмма, на которой показано множество классов, интерфейсов, коопераций и отношений между ними.
Диаграммы классов используются для моделирования статического вида системы с точки зрения проектирования. Сюда по большей части относится моделирование словаря системы, коопераций и схем. Кроме того, диаграммы классов составляют основу еще двух диаграмм - компонентов и развертывания.
Диаграммы классов обычно содержат следующие сущности:
§ классы;
§ интерфейсы;
§ кооперации;
§ отношения зависимости, обобщения и ассоциации.
Диаграммы могут включать в себя примечания и ограничения. Также в диаграммах классов могут присутствовать пакеты или подсистемы, применяемые для группирования элементов модели в более крупные блоки. Иногда в эти диаграммы помещают экземпляры, особенно если требуется визуализировать их тип (возможно, динамический).
Обычно диаграммы классов используются в следующих целях:
§ для моделирования словаря системы. Моделирование системы предполагает идентификацию сущностей, важных стой или иной точки зрения. Эти сущности составляют словарь моделируемой системы;
§ для моделирования простых коопераций.
Классы не существуют сами по себе. Любой класс функционирует совместно с другими, реализуя семантику, выходящую за границы каждого отдельного элемента. Таким образом, нужно уделить внимание визуализации, специфицированию, конструированию и документированию различных способов совместной работы вошедших в словарь сущностей. Для моделирования такого "сотрудничества" применяются диаграммы классов.
|
|
Кооперация – это сообщество классов, интерфейсов и других элементов, работающих совместно для обеспечения некоторого кооперативного поведения, более значимого, чем сумма составляющих его элементов.
§ для моделирования логической схемы базы данных. Логическую схему можно представлять себе как чертеж концептуального проекта базы данных. Во многих сферах деятельности требуется хранить устойчивую (persistent) информацию в реляционной или объектно-ориентированной базе данных. Моделировать схемы также можно с помощью диаграмм классов.
Классом(Class) называется описание совокупности объектов с общими атрибутами, операциями, отношениями и семантикой.
Класс (class) в языке UML служит для обозначения множества объектов, которые обладают одинаковой структурой, поведением и отношениями с объектами других классов.
Пример. "Стена" – это класс объектов с некоторыми общими свойствами, такими как высота, длина, толщина, несущая это стена или нет, и т.д. При этом конкретные стены будут рассматриваться как отдельные экземпляры класса "стена", одним из которых является, например, "стена в юго-западной части моего кабинета".
|
|
Графически класс изображается в виде прямоугольника, который дополнительно может быть разделен горизонтальными линиями на разделы или секции.
Имя класса
§ Имена классов образуют словарь предметной области.
§ Имя класса должно быть уникальным. Оно указывается в первой верхней секции прямоугольника. Обычно имя класса записывается по центру секции имени полужирным шрифтом и должно начинаться с заглавной буквы.
§ Имя класса может состоять из любого числа букв, цифр и ряда знаков препинания (за исключением таких, например, как двоеточие, которое применяется для отделения имени класса от имени объемлющего пакета).
§ Имя может занимать несколько строк. На практике для именования класса используют одно или несколько коротких существительных, взятых из словаря моделируемой системы.
§ Обычно каждое слово в имени класса пишется с заглавной буквы, например: Customer (Клиент), Wall (Стена), TemperatureSensor (ДатчикТемпературы).
|
|
§ Если необходимо явно указать к какому пакету относится тот или иной класс, то используется символ разделитель двойное двоеточие «::».
Синтаксис строки имени класса в этом случае будет следующий: <Имя_пакета>::<Имя_класса>. Например, если определен пакет с именем «Банк», то класс «Счет» в этом банке может быть записан в виде: «Банк::Счет».
Класс может не иметь экземпляров или объектов. В этом случае он называется абстрактным классом, а для обозначения его имени используется курсив.
В языке UML принято общее соглашение о том, что любой текст, относящийся к абстрактному элементу, записывается курсивом. Данное обстоятельство является семантическим аспектом описания соответствующих элементов языка UML.
Атрибуты класса
Атрибут представляет некоторое свойство моделируемой сущности, общее для всех объектов данного класса.
Атрибут – это именованное свойство класса, включающее описание множества значений, которые могут принимать экземпляры этого свойства.
Класс может иметь любое число атрибутов или не иметь их вовсе. Например, при моделировании клиентов можно задавать фамилию, адрес, номер телефона и дату рождения. Таким образом, атрибут является абстракцией данных объекта или его состояния.
|
|
В языке UML каждому атрибуту класса соответствует отдельная строка текста, которая состоит из следующих характеристик: видимости атрибута, имени атрибута, его кратности, типа значений атрибута и, возможно, его исходного значения.
Полная форма синтаксиса атрибута в языке UML следующая:
[visibility] name [multiplicity] [: type]
[= initial-value] [{property-string}]
Ниже приводятся примеры допустимых объявлений атрибутов:
§ origin – только имя;
§ + origin – видимость и имя;
§ origin : Point – имя и тип;
§ head : *Item – имя и сложный тип;
§ name [ 0 . . 1 ] : String – имя, кратность и тип;
§ origin : Point = (0 , 0) – имя, тип и начальное значение;
§ id : Integer {frozen} – имя и свойство.
Наряду с атрибутами можно использовать три свойства:
§ changeable (изменяемый) - ограничений на изменение значений атрибута не установлено;
§ addOnly (только добавляемый) - разрешается добавлять новые значения для атрибутов с кратностью больше единицы, но созданное значение не может быть изменено или удалено;
§ frozen (замороженный) - после инициализации объекта нельзя изменять значения его атрибутов.
Если явно не оговорено противное, то все атрибуты изменяемы (changeable). При моделировании постоянных или однократно задаваемых атрибутов можно использовать свойство frozen.
Свойство frozen соответствует ключевому слову const вязыке C++.
Видимость свойства говорит о том, может ли оно использоваться другими классификаторами.
Видимость атрибута определяют для того, чтобы скрыть детали его реализации и показать только те особенности, которые необходимы для осуществления обязанностей, продекларированных абстракцией.
В языке UML можно определить три уровня видимости:
§ «+» обозначает атрибут с областью видимости типа общедоступный (public – открытый). Атрибут с этой областью видимости доступен или виден из любого другого класса пакета, в котором определена диаграмма;
§ «#» обозначает атрибут с областью видимости типа защищенный (protected). Атрибут с этой областью видимости недоступен или невиден для всех классов, за исключением подклассов данного класса;
§ «-» обозначает атрибут с областью видимости типа закрытый (private). Атрибут с этой областью видимости недоступен или невиден для всех классов без исключения. Только данный классификатор может пользоваться
Видимость может быть опущена. Если символ видимости явно не указан, обычно предполагается, что свойство является открытым.
Видимость в UML соответствует общепринятой семантике большинства языков программирования, таких как С++, Java, Ada и Eiffel.
Имя атрибута представляет собой строку текста, которая используется в качестве идентификатора соответствующего атрибута и поэтому должна быть уникальной в пределах данного класса. Имя атрибута является единственным обязательным элементом синтаксического обозначения атрибута.
Кратность
При работе с классом разумно предположить, что может существовать любое количество его экземпляров – если, конечно, это не абстрактный класс, у которого вообще не существует непосредственных экземпляров, хотя у его потомков их может быть любое количество. В некоторых случаях, однако, число экземпляров класса нужно ограничить.
Чаще всего возникает необходимость задать класс, у которого:
§ нет ни одного экземпляра - тогда класс становится служебным (Utility), содержащим только атрибуты и операции с областью действия класса; D ровно один экземпляр – такой класс называют синглетным (Singleton);
§ заданное число экземпляров;
§ произвольное число экземпляров - вариант по умолчанию.
Количество экземпляров класса называется его кратностью.
В общем смысле кратность – это диапазон возможных кардинальных чисел некоторой сущности.
В языке UML кратность класса задается выражением, написанным в правом верхнем углу его пиктограммы. Например, класс NetworkController является синглетным, а у класса ControlRod имеется ровно три экземпляра.
Кратность атрибута характеризует общее количество конкретных атрибутов данного типа, входящих в состав отдельного класса.
Кратность атрибута записывают в виде выражения, заключенного в квадратные скобки и расположенного сразу после имени атрибута.
[нижняя_граница .. верхняя_граница]
Значения кратности записывают в виде верхней и нижней границ, где нижняя граница и верхняя граница являются положительными целыми числами, каждая пара которых служит для обозначения отдельного замкнутого интервала целых чисел. В качестве верхней границы может использоваться специальный символ «*», который означает произвольное положительное целое число.
Если в качестве кратности указывается единственное число, то кратность атрибута принимается равной данному числу. Если же указывается единственный знак «*», то это означает, что кратность атрибута может быть произвольным положительным целым числом или нулем. Если кратность атрибута не указана, то по умолчанию принимается ее значение равное 1..1, то есть в точности 1.
Например, у экземпляра класса NetworkController может быть два или более экземпляров атрибута consolePort.
Тип атрибута представляет собой выражение, семантика которого определяется языком спецификации соответствующей модели.
В нотации UML тип атрибута иногда определяется в зависимости от языка программирования, который предполагается использовать для реализации данной модели.
В простейшем случае тип атрибута указывается строкой текста, имеющей осмысленное значение в пределах пакета или модели, к которым относится рассматриваемый класс.
Можно привести следующие примеры задания имен и типов атрибутов классов:
§ цвет: Соlоr – здесь «цвет» является именем атрибута, «Color» – именем типа данного атрибута. Указанная запись может определять традиционно используемую RGB-модель (красный, зеленый, синий) для представления цвета;
§ имя_сотрудника [1..2]: String – здесь «имя_сотрудника» является именем атрибута, который служит для представления информации об имени, а возможно, и отчестве конкретного сотрудника. Тип атрибута «String» (Строка) указывает на тот факт, что отдельное значение имени представляет собой строку текста из одного или двух слов (например, «Кирилл» или «Александр Иванович»);
§ видимость:Boolean – здесь «видимость» есть имя абстрактного атрибута (курсив здесь не случаен), который может характеризовать наличие визуального представления соответствующего класса на экране монитора. В этом случае тип «Boolean» означает, что возможными значениями данного атрибута является одно из двух логических значений: истина (true) или ложь (false). При этом значение истина может соответствовать наличию графического изображения на экране монитора, а значение ложь — его отсутствию, о чем дополнительно указывается в пояснительном тексте. Поскольку кратность атрибута видимость не указана, она принимает значение 1 по умолчанию. В этой ситуации англоязычное имя типа атрибута вполне оправдано наличием соответствующего базового типа в языках программирования. Абстрактный характер данного атрибута обозначается курсивным текстом в записи данного атрибута;
§ форма:Многоугольник – здесь имя атрибута «форма» может характеризовать такой класс, который является геометрической фигурой на плоскости. В этом случае тип атрибута «Многоугольник» указывает на тот факт, что отдельная геометрическая фигура может иметь форму треугольника, прямоугольника, ромба, пятиугольника и любого другого многоугольника, но не окружности или эллипса.
Исходное значение служит для задания начального значения соответствующего атрибута в момент создания отдельного экземпляра класса.
Необходимо придерживаться правила принадлежности значения типу конкретного атрибута. Если исходное значение не указано, то значение соответствующего атрибута не определено на момент создания нового экземпляра класса.
Примером задания исходного значения атрибута может быть следующая запись: цвет:Соlоr = (255, 0, 0) – в RGB-модели цвета это соответствует чистому красному цвету в качестве исходного значения для данного атрибута.
При задании атрибутов могут быть использованы две дополнительные синтаксические конструкции – подчеркивание строки атрибута и пояснительный текст в фигурных скобках.
Подчеркивание строки атрибута означает, что соответствующий атрибут может принимать подмножество значений из некоторой области значений атрибута, определяемой его типом. Эти значения можно рассматривать как набор однотипных записей или массив, которые в совокупности характеризуют каждый объект класса.
Например, если некоторый атрибут задан в виде «форма: Прямоугольник», то это будет означать, что все объекты данного класса могут иметь несколько различных форм, каждая из которых является прямоугольником.
Другим примером может служить задание атрибута в виде «номер_счета:Integer», что может означать для объекта «Сотрудник» наличие некоторого подмножества счетов, общее количество которых заранее не фиксируется.
Строка-свойство служит для указания значений атрибута, которые не могут быть изменены в программе при работе с данным типом объектов.
Фигурные скобки обозначают фиксированное значение соответствующего атрибута для класса в целом, которое должны принимать все вновь создаваемые экземпляры класса без исключения. Это значение принимается за исходное значение атрибута, которое не может быть переопределено в последующем.
Отсутствие строки-свойства по умолчанию трактуется так, что значение соответствующего атрибута может быть изменено в программе.
Например, строка-свойство в записи атрибута «заработная_плата:Currency = {$500}» может служить для обозначения фиксированной заработной платы для каждого объекта класса «Сотрудник» определенной должности в некоторой организации. С другой стороны, запись данного атрибута в виде «заработная_плата: Currency = $500» означает, что при создании нового экземпляра «Сотрудник» (например, прием на работу нового сотрудника) для него устанавливается по умолчанию заработная плата в $500. Однако для отдельных сотрудников величина устанавливаемой заработной платы может быть изменена как в большую, так и в меньшую сторону, что необходимо дополнительно учесть при разработке программы.
Операции
Операцией (operation) называется реализация услуги, которую можно запросить у любого объекта класса для воздействия на поведение.
У всех объектов класса имеется общий набор операций. Класс может содержать любое число операций или не содержать их вовсе.
Совокупность операций характеризует функциональный аспект поведения класса.
В языке UML существует различие между операцией и методом. Метод – это реализация операции. В иерархии наследования для одной операции может быть определено несколько методов, из которых нужный полиморфно выбирается во время выполнения.
Полный синтаксис операции в языке UML таков:
[visibility] name [(parameter-list)] [: return-type] [{property-string}]
<квантор видимости><имя операции>(список параметров):
<выражение типа возвращаемого значения>{строка-свойство}
Ниже приводятся некоторые допустимые объявления операций:
§ display – только имя;
§ + display – видимость и имя;
§ set (n: Name, s: String) – имя и параметры;
§ getID() : Integer – имя и возвращаемое значение;
§ restart() {guarded} - имя и свойство.
Видимость. Видимость определяется как и в случае атрибутов класса.
Квантор видимости для операции может быть опущен. В этом случае его отсутствие просто означает, что видимость операции не указывается. Вместо условных графических обозначений также можно записывать соответствующее ключевое слово: public, protected, private.
Имя операции представляет собой строку текста, которая используется в качестве идентификатора соответствующей операции и поэтому должна быть уникальной в пределах данного класса. Имя операции является единственным обязательным элементом синтаксического обозначения операции.
Имя операции, как и имя класса, может быть произвольной текстовой строкой. На практике для именования операций используют короткий глагол или глагольный оборот, соответствующий определенному поведению объемлющего класса. Каждое слово в имени операции, кроме самого первого, обычно пишут с заглавной буквы, например move или isEmpty.
Список параметров является перечнем разделенных запятой формальных параметров, каждый из которых может быть представлен в следующем виде:
[direction] name : type [= default-value]
<вид параметра><имя параметра>:<выражение типа>=<значение параметра по умолчанию>.
Параметр direction может принимать любое из нижеперечисленных значений:
§ in - входящий параметр, который не может быть модифицирован. Принимается по умолчанию;
§ out - выходящий параметр, который может быть изменен, чтобы передать информацию вызвавшей процедуре;
§ inout - входящий параметр, который может быть изменен.
Помимо описанного ранее свойства leaf для операций определены еще четыре свойства:
§ isQuery (запрос) – выполнение операции не изменяет состояния системы. Другими словами, операция является просто функцией без побочных эффектов;
§ sequential (последовательная) – при вызове операции необходимо гарантировать, что в любой момент объект выполняет только один поток. При наличии нескольких потоков управления нельзя обеспечить семантику и целостность объекта;
§ guarded (охраняемая) – семантика и целостность объекта при наличии нескольких потоков управления гарантируются упорядочением всех обращений к его охраняемым операциям. На практике это означает возможность вызова только одной операции объекта в любой момент времени, то есть все сводится к семантике sequential;
§ concurrent (параллельная) – семантика и целостность объекта при наличии нескольких потоков управления гарантируются благодаря тому, что операция рассматривается как атомарная. Разные параллельные потоки управления могут одновременно вызывать одну и ту же параллельную операцию объекта без нарушения семантики. Проектировать параллельные операции необходимо так, чтобы обеспечивалась корректность работы в случае одновременного выполнения в том же объекте какой-либо последовательной или охраняемой операции.
Имя параметра есть идентификатор соответствующего формального параметра.
Выражение типа является зависимой от конкретного языка программирования спецификацией типа возвращаемого значения для соответствующего формального параметра.
«Значение параметра по умолчанию, в общем случае, представляет собой выражение для значения формального параметра, синтаксис которого зависит от конкретного языка программирования и подчиняется принятым в нем ограничениям.
Выражение типа возвращаемого значения также является зависимой от языка реализации спецификацией типа или типов значений параметров, которые возвращаются объектом после выполнения соответствующей операции.
Двоеточие и выражение типа возвращаемого значения могут быть опущены, если операция не возвращает никакого значения.
Для указания кратности возвращаемого значения данная спецификация может быть записана в виде списка отдельных выражений.
Строка-свойство служит для указания значений свойств, которые могут быть применены к данному элементу.
Строка-свойство не является обязательной, она может отсутствовать, если никакие свойства не специфицированы.
Операция с областью действия на весь класс показывается подчеркиванием имени и строки выражения типа. По умолчанию под областью операции понимается объект класса. В этом случае имя и строка выражения типа операции не подчеркиваются.
Операция, которая не может изменять состояние системы и, соответственно, не имеет никакого побочного эффекта, обозначается строкой-свойством «{запрос}» («{query}»).
Для повышения производительности системы одни операции могут выполняться параллельно или одновременно, а другие только последовательно. Для указания параллельности выполнения операции используется строка-свойство вида «{concurrency = имя}», где имя может принимать одно из следующих значений: последовательная (sequential), параллельная (concurrent), охраняемая (guarded). При этом придерживаются следующей семантики для данных значений:
§ последовательная (sequential) - для данной операции необходимо обеспечить ее единственное выполнение в системе. Одновременное с ней выполнение других операций может привести к ошибкам или нарушениям целостности объектов класса;
§ параллельная (concurrent) - данная операция может выполняться параллельно с другими операциями в системе, при этом параллельность должна поддерживаться на уровне реализации модели;
§ охраняемая (guarded) - все обращения к данной операции должны быть строго упорядочены во времени с целью сохранения целостности объектов данного класса. При этом могут быть приняты дополнительные меры по контролю исключительных ситуаций на этапе ее выполнения.
В качестве примеров записи операций можно привести следующие обозначения отдельных операций:
§ +создать() – может обозначать абстрактную операцию по созданию отдельного объекта класса, которая является общедоступной и не содержит формальных параметров. Эта операция не возвращает никакого значения после своего выполнения;
§ +нарисовать(форма: Многоугольник = прямоугольник, цвет_заливки: Color = (О, О, 255)) – может обозначать операцию по отображению на экране монитора прямоугольной области синего цвета, если не указываются другие значения в качестве аргументов данной операции;
Дата добавления: 2018-02-15; просмотров: 2174; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!