Диаграммы классов UML. Логическое моделирование

Диаграммы классов UML. Логическое моделирование

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

Представление классов

Класс – это основной строительный блок ПС. Это понятие  присутствует и в ОО языках программирования, то есть между классами UML и программными классами есть соответствие, являющееся основой для автоматической генерации  программных кодов или для  выполнения реинжиниринга. Каждый класс  имеет название, атрибуты и операции. Класс на диаграмме показывается в виде прямоугольника, разделенного на 3 области. В верхней содержится название класса, в средней –  описание атрибутов (свойств), в нижней – названия операций – услуг, предоставляемых  объектами этого класса.

  
Рис.1. Изображение класса в нотации UML

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

Для каждого атрибута класса можно задать видимость (visibility). Эта характеристика показывает, доступен ли атрибут для других классов. В UML определены следующие уровни видимости  атрибутов:

    • Открытый (public) – атрибут виден для любого другого класса (объекта);
    • Защищенный (protected) – атрибут виден для потомков данного класса;
    • Закрытый (private) – атрибут не виден внешними классами (объектами) и может использоваться только объектом, его содержащим.

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

Класс содержит объявления операций, представляющих собой определения запросов, которые должны выполнять объекты данного класса. Каждая операция имеет сигнатуру, содержащую имя операции, тип возвращаемого значения и список параметров, который может быть пустым. Реализация операции в виде процедуры – это метод, принадлежащий классу. Для операций, как и для атрибутов класса, определено понятие «видимость». Закрытые операции являются внутренними для объектов класса и недоступны из других объектов. Остальные образуют интерфейсную часть класса и являются средством интеграции класса в ПС.

Отношения

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

Каждая ассоциация несет информацию о связях между объектами внутри ПС. Наиболее часто используются бинарные ассоциации, связывающие два класса. Ассоциация может иметь название, которое должно выражать суть отображаемой связи (см. рис. 2). Помимо названия, ассоциация может иметь такую характеристику, как множественность. Она показывает, сколько объектов каждого класса может участвовать в ассоциации. Множественность указывается у каждого конца ассоциации (полюса) и задается конкретным числом или диапазоном чисел. Множественность, указанная в виде звездочки, предполагает любое количество (в том числе, и ноль). Например, на рис.2 ассоциация связывает один объект класса «Набор товаров» с одним или более объектами класса «товар». Связаны между собой могут быть и объекты одного класса, поэтому ассоциация может связывать класс с самим собой. Например, для класса «Житель города» можно ввести ассоциацию «Соседство», которая позволит находить всех соседей конкретного жителя.

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

Ассоциация сама может обладать свойствами класса, то есть, иметь атрибуты и операции. В этом случае она называется класс-ассоциацией  и может рассматриваться как  класс, у которого помимо явно указанных  атрибутов и операций есть ссылки на оба связываемых ею класса. В  примере на рис.2 ассоциация «включает» по существу есть класс-ассоциация, у  которой есть атрибут «Количество», показывающий, сколько единиц каждого  товара входит в набор (см. рис.4).

Обобщение на диаграммах классов используется, чтобы показать связь между классом-родителем и классом-потомком. Оно вводится на диаграмму, когда возникает разновидность какого-либо класса (например, при развитии ПС – см. рис.4), а также в тех случаях, когда в системе обнаруживаются несколько классов, обладающих сходным поведением (в этом случае общие элементы поведения выносятся на более высокий уровень, образуя класс-родитель – см. рис.3).

  
Рис.3 Наследуются атрибуты и операции

Как уже говорилось ранее, UML позволяет строить модели с различным уровнем детализации. На рис.4 показана детализация модели, представленной на рис.2.

  
Рис. 4 Детализация модели набора товаров  
Обобщение показывает, что набор товаров – это тоже товар, который может быть предметом заказа, продажи, поставки и т.д. Набор включает опись, в которой указывается, какие товары входят в набор, а класс-ассоциация «включает» определяет количество каждого вида товаров в наборе.

Стереотипы  классов

При создании диаграмм классов часто пользуются понятием «стереотип». В дальнейшем речь пойдет о стереотипах классов.Стереотип класса – это элемент расширения словаря UML, который обозначает отличительные особенности в использовании класса. Стереотип имеет название, которое задается в виде текстовой строки. При изображении класса на диаграмме стереотип показывается в верхней части класса в двойных угловых скобках. Есть четыре стандартных стереотипа классов, для которых предусмотрены специальные графические изображения (см. рис.5).

Стереотип используется для обозначения классов-сущностей (классов данных), стреотип описывает пограничные классы, которые являются посредниками между ПС и внешними по отношению к ней сущностями – актерами, обозначаемыми стереотипом <>. Наконец, стереотип описывает классы и объекты, которые управляют взаимодействиями. Применение стереотипов позволяет, в частности, изменить вид диаграмм классов.

  
Рис.5 Стереотипы для классов 

Применение  диаграмм классов

Диаграммы классов  создаются при логическом моделировании  ПС и служат для следующих целей:

    • Для моделирования данных. Анализ предметной области позволяет выявить основные характерные для нее сущности и связи между ними. Это удобно моделируется с помощью диаграмм классов. Эти диаграммы являются основой для построения концептуальной схемы базы данных.
    • Для представления архитектуры ПС. Можно выделить архитектурно значимые классы и показать их на диаграммах, описывающих архитектуру ПС.
    • Для моделирования навигации экранов. На таких диаграммах показываются пограничные классы и их логическая взаимосвязь. Информационные поля моделируются как атрибуты классов, а управляющие кнопки – как операции и отношения.
    • Для моделирования логики программных компонент (будет описано в последующих статьях).
    • Для моделирования логики обработки данных.

 

Диаграммы вариантов использования

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

Целями анализа  и моделирования требований являются:

    • достижение соглашения между разработчиками, заказчиками и пользователями о том, что должна делать ПС;
    • достижение лучшего понимания разработчиками поведения ПС;
    • ограничение системной функциональности;
    • создание базиса для планирования разработки проекта;
    • определение пользовательского интерфейса.

Для достижения этих целей используются диаграммы вариантов  использования UML (Use case diagrams).

Общие сведения о диаграммах вариантов использования

На диаграммах вариантов  использования (ВИ) изображаются актеры и варианты использования, между которыми существуютотношения. Здесь можно показывать и другие элементы UML (например, классы могут показывать, какие сущности порождаются или используются в конкретных ВИ – см. рис.1).

  
Рис.1. Диаграмма вариантов использования 

Актеры

Актером будем называть внешнюю по отношению к ПС сущность, которая может взаимодействовать с системой. Актерами могут быть как люди, так и внешние системы или устройства. Следует всегда помнить, что актер – это не конкретный человек или устройство, а роль (должностная обязанность), в которой он выступает по отношению к программной системе. Например, в качестве актера «Бухгалтер» может выступать весь наличный штат бухгалтерии. В то же время один конкретный человек может играть несколько ролей по отношению к системе. Главный бухгалтер может выступать как актер с таким же именем, но может использовать систему так же, как актер «бухгалтер» (то есть, выполнять работу обычного бухгалтера). В то же время актеры – не обязательно люди. Если ПС должна выполнять какие-либо действия в определенные моменты времени, то в качестве актера, инициирующего выполнение этих действий, может быть указан системный таймер.

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

Варианты  использования

При взаимодействии актера с системой последняя выполняет  ряд работ, которые образуют вариант использования системы(use case). Каждый актер может использовать систему по разному, то есть инициировать выполнение разных ВИ. Таким образом, каждый ВИ, по существу, есть некоторое функциональное требование к системе (которое может быть разбито на несколько более мелких). ВИ не представляет собой конструкцию, напрямую реализуемую в программном коде. Все его поведение реализуется в виде классов и компонент.

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

Лучший путь к  нахождению ВИ – рассмотреть, что  требует каждый актер от системы. Следует помнить, что система  существует только для пользователей  и должна строиться, исходя из их потребностей.

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

Отношения

Ассоциация – единственно возможная связь между актером и ВИ. Она показывает, что актер и ВИ общаются друг с другом, посылая и получая сообщения. Если ассоциация направленная, она показывает направление передачи сообщения. На рис.2а оператор инициирует начало выполнения ВИ открытия нового счета.

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

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

Отношение включения, помечаемое стереотипом <>, означает, что для полного осуществления основного (базового) ВИ необходимо выполнение и включаемого варианта. В общем случае выделение включаемых ВИ будет целесообразным в тех случаях, когда такой вариант включается в несколько базовых. Об отношении включения “знает” только базовый вариант использования, но не включаемый. Включение показывается пунктирной стрелкой, направленной от базового ВИ к включаемому (см. рис.2б).

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

  
Рис. 2а. Пример диаграммы ВИ  
Актер «Оператор» активизирует выполнение ВИ «Открыть счет». В соответствии с заданным оператором типом счета выполняется либо ВИ «Открыть счет физического лица» либо «Открыть счет юридического лица», являющиеся расширениями первого. Открытие счета включает его контроль и при обнаружении ошибки – выдачу сообщения Оператору.
  
Рис. 2б. Пример диаграммы ВИ  
Аналог рис. 2а. У актера «Оператор» есть два режима работы. Он активизирует «Открыть счет физического лица» либо «Открыть счет юридического лица». Открытие каждого счета включает выполнение работ, предусматриваемых в ВИ «Открыть счет», содержащим общее поведение для двух исходных ВИ.

Назначение  диаграмм вариантов использования

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

Моделирование поведения

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

Основная задача функционального моделирования  – детализация ВИ, построенных  при определении требований к  ПС, с помощью диаграмм, описывающих  поведение ПС (см. статью 2). При этом решаются следующие основные задачи:

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

Диаграммы последовательностей (Sequence diagrams)

На диаграммах последовательностей, иногда называемых сценариями, показываются объекты и сообщения, которыми они обмениваются. Каждый объект изображается в виде вертикальной линии («линии жизни» объекта). По вертикали сверху вниз направлена временная ось. Сообщение, показываемое в виде стрелки от объекта к объекту, соответствует вызову операции соответствующего класса (см. рис.1). Таким образом, на диаграмме можно показать поток сообщений во времени (сценарий). С помощью диаграмм этого вида можно описать как основной, так и альтернативные потоки событий для ВИ.

Диаграммы кооперации (Collaboration Diagrams)

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

  
Рис.1 Диаграмма последовательности действий при вводе документа

 

  
Рис.2 Результат преобразования диаграммы  последовательностей в диаграмму  кооперации. Нумерация сообщений  определяет их временной порядок.

Диаграммы деятельностей

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

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

  
Рис.3 Диаграмма деятельностей при  проектировании и разработке ПС.

Дополнительно показывая  на диаграмме деятельностей порождаемые  и используемые объекты, можно построить  диаграммы потоков данных (DFD), которые  широко используются при структурном  проектировании ПС и при бизнес-анализе (см. рис. 3).

Диаграммы состояний

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

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

  
Рис.4. Диаграмма состояний для  класса «Товар» Из диаграммы видно, например, что зарезервированный под заказ товар не может быть зарезервирован под другой заказ, так как есть только два события, вызывающие переход из этого состояния – «отмена резервирования» и «отбор».

Компонентно-базированная разработка

Принципы  компонентно-базированного подхода  к разработке ПС

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

Индустрия программирования в настоящее время обладает возможностью удобной реализации повторного использования  программных частей большого объема. Это – результат появления  стандартов и поддерживающих их технологий, которые позволяют определять функциональные элементы системы таким образом, чтобы интерфейс элемента отделялся  от реализации. Такие интерфейсы могут  запоминаться и разыскиваться, что  упрощает взаимодействие частей системы  даже в случае, когда они размещаются  на разных машинах. Именно в этом и  есть основное преимущество компонентно-базированного (КБ) подхода к разработке ПС. Заметим, что новые требования к разработке ПС – сборка из заготовленных ранее  компонентов – не умаляют значимости и корректности ОО подхода. Наоборот, они основаны на этом подходе.

КБ подход базируется на трех основных принципах:

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

Отделение спецификации от реализации

В КБ подходе спецификация (описание) того, что делает компонент, отделяется от того, как он реализуется. В результате в системе устанавливаются  зависимости между спецификациями, что позволяет изменять реализацию без влияния на систему. Отделение  спецификации компонента от реализации имеет много преимуществ. Главное  – это механизм, позволяющий управлять  внесением изменений при эволюции системы. Благодаря этому отделению  реализация компонента может быть обновлена  без влияния на его пользователей, поскольку услуги, предоставляемые  компонентом, не изменяются. Таким образом, компонент может легко быть адаптирован  к новым операционным требованиям, в нем могут быть реализованы  новые алгоритмы, а также использованы преимущества новых платформ.

Инкапсуляция  данных и процессов

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

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

Абстракция  и автоматизация

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

Чем компонент  отличается от класса?

Компоненты во многих отношениях подобны классам но имеют  и существенные отличия от последних.

    • Класс представляет собой логическую абстракцию (расширение понятия «тип» в языках программирования), компоненты – это физические сущности.
    • Классы имеют атрибуты и операции, компоненты – только операции, доступные через интерфейсы.
    • Реализация компонент может включать много классов, то есть компонент – это более крупный «строительный блок».

Библиотеки  компонентов

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

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

Диаграммы классов UML. Логическое моделирование