- •Оглавление
- •Теоретические сведения
- •Способы применения uml
- •Диаграммы uml
- •Диаграмма классов (Class diagram)
- •Свойства
- •Атрибуты
- •Кратность
- •Операции
- •Отношения
- •Зависимость
- •Ассоциация
- •Двунаправленные ассоциации
- •Агрегация и композиция
- •Обобщение
- •Реализация
- •Примечания и комментарии
- •Ключевые слова
- •Статические операции и атрибуты
- •Диаграмма последовательности (Sequence diagram)
- •Создание и удаление участников
- •Циклы, условия
- •Синхронные и асинхронные вызовы
- •Практическая часть Инструментарий
- •Начало работы
- •Создание первого проекта
- •Пример создания uml-диаграмм архитектуры проекта с помощью PlantUml
- •Создание диаграммы классов
- •Создание диаграммы последовательностей
- •Сценарий нахождения чего-либо в библиотеке по имени
- •Сценарий удаления чего-либо из библиотеки по идентификатору
- •Коррекция диаграммы классов
- •Задания для самостоятельной работы
Создание диаграммы последовательностей
Создадим в этом же проекте (модуле) файл диаграммы последовательностей.
Имя диаграммы: LibrarySequenceDiagram. Так как это диаграмма последовательности, то с помощью её мы сможем показать, какова же последовательность действий в проектируемой системе. Иначе говоря, что же будет делать система при наступлении той или иной ситуации?
Разработаем две диаграммы последовательности: одну для сценария нахождения чего-либо в библиотеке по его имени (name), вторую для сценария удаления чего-либо из библиотеки по идентификатору (ID).
Полную информацию о спецификации PlantUML для диаграмм последовательностей можно посмотреть в файле PlantUML_Language_Reference_Guideили по адресуhttp://plantuml.sourceforge.net/sequence.html.
Сценарий нахождения чего-либо в библиотеке по имени
Сначала необходимо определить объекты, которые посылают друг другу сообщение (иначе говоря, вызывают или каким-либо образом используют друг друга). Когда в классе Library вызывается функция findEntityByName(), то эта функция будет брать список всех сущностей LibraryEntityList, хранящихся в библиотеке, и выполнять в нем поиск. Почему этот список сущностей не был указан в атрибутах в диаграмме классов? Потому что этот список там представлен в виде двусторонней ассоциации. Поэтому имя этого списка будет в диаграмме последовательности, но не будет в диаграмме классов.
Функция findEntityByName() будет вызываться классом-клиентом библиотеки LibraryClient, которого также не было на диаграмме классов. Таким образом, можно написать следующий код, отображающийся в UML.
@startuml
LibraryClient -> Library : findEntityByName(name : String)
Library -> LibraryEntityList : getEntity
LibraryEntityList -> Library: anEntity
@enduml
В диаграмме происходит следующее: LibraryClient вызывает у Library метод findEntityByName, Library запрашивает у списка LibraryEntityList одну сущность, и эта сущность передается библиотеке.
Так как при поиске необходимого элемента в библиотеке происходит перебор всех элементов, то в диаграмме необходимо отобразить, что этот процесс происходит в цикле. Также нужно указать, что каждый раз после возврата элемента из списка происходит проверка на соответствие поисковой строке.
@startuml
LibraryClient -> Library : findEntityByName(name : String)
loop all entities in list
Library -> LibraryEntityList : getEntity
LibraryEntityList -> Library : anEntity
alt anEntity.name == name
Library -> LibraryClient : anEntity
end
end
@enduml
Однако по такой диаграмме последовательности становится понятно, что в LibraryClient будут “возвращаться” много элементов библиотеки, если они будут подходить под поисковый запрос. Значит, необходимо возвращать результаты запроса не отдельными элементами (классу-клиенту обрабатывать большое количество результатов неудобно), а отдельным классом ResultEntityList. Значит, каждый раз, когда полученный из списка anEntity будет удовлетворять запросу, он будет отправляться в ResultEntityList, а по завершении цикла, список результатов ResultEntityList будет возвращен клиенту LibraryClient.
@startuml
LibraryClient -> Library : findEntityByName(name : String)
loop all entities in list
Library -> LibraryEntityList : getEntity
LibraryEntityList -> Library : anEntity
alt anEntity.name == name
Library -> ResultEntityList : anEntity
end
end
ResultEntityList -> LibraryClient : resultList
@enduml