АЛЕКСЕЙ ЛОСЕВ
PlantUML в Visual Studio Code. Диаграммы классов.
Поговорим про высокоуровневые концепции распределенных систем, их типы, как такие системы строятся, и где нужно подстелить соломку.
Оценивать эффективность процесса программирования количеством написанных строк кода — то же самое, что оценивать процесс создания самолёта по его весу.

© Бил Гейтс

Алексей Лосев
Экс-директор по разработке
  • Кандидат физико-математических наук.
  • Microsoft MVP (Most Valuable Professional), Visual Studio and Development Technologies.
  • 18+ лет личного стажа разработчика ПО на платформе .NET.
  • 10+ лет управления командами разработки различного масштаба.
  • 8+ лет преподавания разработки ПО в МГТУ им. Баумана.
  • Выстраивание процессов разработки ПО по Agile (Scrum) и внедрение управления проектами по PMBOK.
  • Управление разработкой банковского ПО в части ITSM информационной безопасности, внутренней автоматизации.Лучшие практики ITSM (ITIL).
В предыдущей статье инструкция что устанавливать и как начать работать. Сегодня поговорим про нотацию, используемую в PlantUML для построения диаграмм классов. Напоминаю, что диаграмма классов (англ. Static Structure diagram) – это структурная диаграмма нотации UML, демонстрирующая общую структуру иерархии классов системы, их кооперацию, атрибуты (поля), методы, интерфейсы и взаимосвязи между ними. Широко применяется не только для документирования и визуализации, но также для конструирования посредством прямого или обратного проектирования.
Итак, начинаем.

Задание класса

Класс и его элементы в PlantUML можно задать двумя способами: указав имя класса и через двоеточие член класса или указав перед именем ключевое слово class:
PlantUML в Visual Studio Code. Диаграммы классов
Первый способ избыточен (нам для каждого свойства придется указывать, к какому классу оно относится), да и неприменим, когда мы хотим промоделировать отношения классов без их внутреннего устройства. Поэтому далее я буду использовать нотацию с применением ключевого слова class. Для того чтобы редактору дать понять, какие члены относятся к классу, используются фигурные скобки. Дальше редактор определяет: данные или метод находятся перед ним на основе круглых скобок. Пусть у нас есть самолет, который умеет взлетать, и у него есть некоторая коллекция двигателей. Текст такой диаграммы может иметь вид:
PlantUML в Visual Studio Code
В редакторе такому коду будет соответствовать следующая диаграмма:
PlantUML в Visual Studio Code. Диаграммы классов
Это последняя картинка, когда я делаю скриншот с Visual Studo Code, дальше буду показывать текст разметки и результирующую диаграмму.

Члены класса

Как я написал выше, методы и поля PlantUML отличает по круглым скобкам. Для задания модификатора доступа используются те же значки, что и в нотации UML, по умолчанию они заменяются значками:
PlantUML в Visual Studio Code. Диаграммы классов
Т.е. мы можем задать для нашего самолета, что двигатели являются приватными, запуск двигателей доступен в потомках, техобслуживание является доступным только в рамках сборки, а команда на взлет – публичной:
PlantUML в Visual Studio Code. Диаграммы классов
В этом случае диаграмма будет выглядеть вот так:
PlantUML в Visual Studio Code. Диаграммы классов
Если лень запоминать значки, то можно вернуть отображение к стандартной UML нотации, для этого достаточно добавить в файл строку:
PlantUML в Visual Studio Code. Диаграммы классов
После этого отображение вернется к стандартным значкам UML:
PlantUML в Visual Studio Code
Кроме модификаторов доступа можно, как и в UML, помечать статические члены класса (подчеркнутые) и абстрактные (выделяются курсивом). Для этого используются ключевые слова static и abstract, указываемые перед именем члена.Давайте добавим статическую переменную Count для хранения общего количества самолетов и абстрактный метод Fly:
PlantUML в Visual Studio Code. Диаграммы классов
Вот так это будет выглядеть на диаграмме:
PlantUML в Visual Studio Code. Диаграммы классов
Абстрактные классы и интерфейсы

Для отображения абстрактных классов и интерфейсов, что логично, используются ключевые слова abstract и interface:
PlantUML в Visual Studio Code. Диаграммы классов
Отображаться эти элементы будут аналогично классам, только будет отличаться буква перед именем класса и имя класса будет курсивом:
PlantUML в Visual Studio Code. Диаграммы классов
Связи

1. Обобщение, оно же – наследование. Изображается стрелкой с треугольником на конце. Для задания связи между объектами в PlantUML применяется синтаксис состояний из имен двух элементов диаграммы и стрелки между ними. Для треугольной стрелки со сплошной линией отношение будет задано следующим образом:
PlantUML в Visual Studio Code. Диаграммы классов
Внешний вид такой связи на диаграмме:
PlantUML в Visual Studio Code. Диаграммы классов
2. Реализация – классом некоторого интерфейса. Изображается как наследование, только линия пунктирная. Для задания такой линии необходимо минусы заменить на точки:
PlantUML в Visual Studio Code. Диаграммы классов
Выглядит связь следующим образом:
PlantUML в Visual Studio Code. Диаграммы классов
3. Зависимость – показывает, что при изменении одного класса должен измениться и зависимый. Связь отличается от предыдущих отсутствием вертикальной черты, также обратите внимание, что направление стрелки можно задать и в противоположную сторону:
PlantUML в Visual Studio Code. Диаграммы классов
Выглядит:
PlantUML в Visual Studio Code. Диаграммы классов
4. Ассоциация – ссылка одного класса на другой. Изображается обычной стрелкой с названием отношения:
PlantUML в Visual Studio Code. Диаграммы классов
Внешний вид такой связи на диаграмме:
PlantUML в Visual Studio Code. Диаграммы классов
5. Агрегация – белее жесткое уточнение ассоциации, задающее отношение часть-целое. Причем часть может быть отделена и использована сама по себе (например, мы можем снять двигатель и переставить на другой самолет). Задается такое отношение указанием вместо стрелки латинской буквы o:
PlantUML в Visual Studio Code. Диаграммы классов
Выглядит:
PlantUML в Visual Studio Code. Диаграммы классов
6. Композиция – более жесткое уточнение ассоциации, задающее отношение часть-неотделимое целое. Если в предыдущем примере мы не моделируем снятие двигателя с самолета, и уничтожение самолета повлечет за собой уничтожение двигателя, в этом случае заменяем o на *:
PlantUML в Visual Studio Code. Диаграммы классов
Выглядит связь аналогично предыдущей, только ромб будет закрашен:
PlantUML в Visual Studio Code. Диаграммы классов
Пример

В заключение давайте посмотрим, как будет выглядеть итератор в виде кода PlantUML и диаграммы UML соответственно.
Код:


@startuml Example




skinparam classAttributeIconSize 0




interface IEnumerable {


+IEnumerator GetEnumerator()


}




interface IEnumerator {


+object Current


+bool MoveNext()


+void Reset()


}




IEnumerable ..> IEnumerator : Создает




class Array {


+int Length


{static} +Sort(Array a)


+IEnumerator GetEnumerator()    


}




Array ..|> IEnumerable




class ArrayEnumerator {




}




ArrayEnumerator ..|> IEnumerator




Array ..> ArrayEnumerator : Создает


ArrayEnumerator --> Array : Перемещается по



IEnumerable -[hidden]> IEnumerator


IEnumerable -[hidden]-> Array


IEnumerator -[hidden]-> ArrayEnumerator


@enduml


Обратите внимание на три строки перед @enduml, они позволяют задать расположение элементов относительно друг друга, я потом отдельно о этих связях расскажу, а то и так уже много получилось. Ну и внешний вид получившейся диаграммы:
PlantUML в Visual Studio Code. Диаграммы классов
Статический метод Sort добавил для примера, на самом деле у Array еще много чего еще есть, но все перечислять долго :)
Вам также может быть интересно