JavaRush /Java блог /Random UA /UML: від теорії до практики
Viacheslav
3 рівень

UML: від теорії до практики

Стаття з групи Random UA

Вступ

Я думаю, кожен чув у дитинстві таку приказку як " Сім разів відміряй, один раз відріж ". У програмуванні так само. Краще завжди продумати реалізацію до того, як ви витратите час на її виконання. Часто доводиться при реалізації створювати класи, вигадувати їхню взаємодію. І часто візуальне уявлення про це може допомогти вирішити завдання найбільш правильним чином. У цьому нам і допомагає UML .

Що таке UML?

Якщо подивитися картинки в пошукових системах, то стане зрозуміло, що UML – це щось про схеми, стрілочки та квадратики. Що важливо, що UML перекладається як Unified Modeling Language . Важливе слово Unified. Тобто наші картинки зрозуміємо не лише ми, а й інші, хто знає UML. Виходить це така міжнародна мова малювання схем.

UML: від теорії до практики - 1

Як говорить Вікіпедія

UML – це мова графічного опису для об'єктного моделювання в галузі розробки програмного забезпечення, моделювання бізнес-процесів, системного проектування та відображення організаційних структур.
Найцікавіше, що не всі замислюються чи здогадуються, UML має специфікації. І навіть є специфікація UML2. Докладніше зі специфікацією можна ознайомитись на сайті Object Management Group . Власне, ця група займається розробкою специфікацій UML. Цікаво, що UML не обмежується описом структури класів. Існує багато типів UML діаграм. Короткий опис типів UML діаграм можна побачити в тій же Вікіпедії: UML - діаграми або відео Тимур Батиршинова Огляд UML діаграм . UML також широко застосовується при описі різних процесів, наприклад тут: Єдиний вхід з використанням JWT . Повертаючись до використання UML діаграм класів, варто зазначити книгуHead First: Паттерни проектування , в якій патерни ілюструються тими самими UML діаграмами. Виходить, що UML справді використовується. І виходить, що знання та розуміння його застосування досить корисна навичка.

Застосування

Розберемо, як із цим UML можна працювати з IDE. Як IDE візьмемо IntelliJ Idea . Якщо використовувати IntelliJ Idea Ultimate , то у нас "з коробки" буде встановлений плагін " UML Support ". Він дозволяє автоматично генерувати чудові діаграми класів. Наприклад, через Ctrl+N або пункт меню "Navigate" -> "Class" перейдемо до класу ArrayList . Тепер, через контекстне меню на ім'я класу виберемо "Diagram" -> "Show diagram popup". В результаті ми отримаємо гарну діаграму:
UML: від теорії до практики - 2
Але що якщо хочеться самому намалювати, та ще й немає Ultimate версії Idea? Якщо ми використовуємо IntelliJ Idea Community Edition, то ми не маємо іншого вибору. Для цього потрібно зрозуміти, як така схема UML влаштована. Для початку нам знадобиться встановити Graphviz . Це набір утиліт для візуалізації графів. Його використовує плагін, який ми будемо застосовувати. Після встановлення необхідно додати каталог bin з каталогу встановленого Graphviz до змінного середовища оточення PATH . Після цього IntelliJ Idea в меню вибрати File -> Settings. У вікні "Settings" вибрати категорію "Plugins", натиснути кнопку "Browse repositories" та встановити плагін PlantUML integration . Чим такий гарний цей PlantUML? Він використовує для опису UML мову описи графів під назвою " dot " і це дозволяє бути більш універсальним, т.к. ця мова використовується не тільки PlantUML. Більш того, все, що ми нижче зробимо, ми можемо виконати не тільки в IDE, але і в онлайн сервісі planttext.com . Після встановлення плагіна PlantUML у нас з'явиться можливість через "File" -> "New" створювати UML діаграми. Давайте виконаємо створення діаграми типу "UML class". У результаті автоматично генерується шаблон з прикладом. Видалимо його вміст і створимо свій, озброївшись статтею з Хабра: Відносини класів - від UML до коду . А щоб зрозуміти, як це зобразити в тексті, візьмемо мануал по PlantUML: plantuml class-diagram. У ньому на самому початку представлена ​​табличка про те, як потрібно описувати зв'язки:
UML: від теорії до практики - 3
Про самі зв'язку можемо ще підглядати сюди: " Відносини між класами в UML. Приклади " . На основі цих матеріалів приступимо до створення нашої UML діаграми. Додамо такий вміст, що описує два класи:

@startuml
class ArrayList {
}
class LinkedList {
}
@enduml
Щоб побачити результат у Idea, оберемо "View" -> "Tool Windows" -> "PlantUML". Ми отримаємо просто два квадрати, що позначають класи. Як ми знаємо, обидва ці класи реалізують інтерфейс List. Це ставлення класів і називають — реалізація (realization). Для зображення такого зв'язку використовують стрілку з пунктирною лінією. Зобразимо її:
interface List
List <|.. ArrayList
List <|.. LinkedList
List- Один з дочірніх класів Collection. Тобто успадковується від Collection. Цей зв'язок називається узагальненням (generalization). Виглядає як стрілка із звичайною безперервною лінією. Зобразимо її:
interface Collection
Collection <|-- List
Для наступного типу зв'язку додамо до опису класу ArrayListзапис про package private масив елементів:
~Object[] elementData
Тепер ми хочемо показати, що ArrayListмістить якісь об'єкти. У разі буде тип зв'язку — агрегація ( aggregation ). Агрегатом у разі є ArrayList, т.к. він містить інші об'єкти. Агрегацію ми вибираємо тому, що об'єкти у списку можуть жити без списку: вони не є його невід'ємними частинами. Їхній час життя не прив'язаний до часу життя списку. Агрегат з латинського перекладається як "зібраний", тобто щось складене з чогось. Наприклад, у житті є насосний агрегат, який складається з насоса та двигуна. Сам агрегат можна розібрати, залишивши щось із його складових частин. Наприклад, щоб продати чи поставити в інший агрегат. Так і у списку. І це виражається у вигляді порожнього ромбика біля агрегату і безперервної лінії. Зобразимо це так:
class Object{
}
ArrayList o- Object
Тепер ми хочемо показати, що на відміну від ArrayListклас LinkedListмістить в собі Node- контейнери, що посилаються на дані, що зберігаються. У разі Nodeє частиною самого LinkedListі що неспроможні жити окремо. Nodeне є безпосередньозбереженим вмістом, а лише містить посилання на нього. Наприклад, коли ми додаємо в LinkedListякийсь рядок, ми додаємо новий Node, який містить посилання на цей рядок, а також посилання на попередній і наступний Node. Такий тип зв'язку називається композицією (Composition). Для відображення у композита (того, хто складається з частин) малюється забарвлений робмик, до нього веде безперервна лінія. Запишемо тепер це у вигляді текстового відображення зв'язку:
class Node{
}
LinkedList *-- Node
І тепер необхідно навчитися відображати ще один важливий тип зв'язку – залежність (dependency relationship). Він використовується тоді, коли один клас використовує інший, при цьому клас не містить клас, що використовується, і не є його спадкоємцем. Наприклад, LinkedListі ArrayListвміють створювати ListIterator. Відобразимо це у вигляді стрілок з пунктирною лінією:
class ListIterator
ListIterator <... ArrayList : create
ListIterator <... LinkedList : create
Виглядатиме після всього це буде таким чином:
UML: від теорії до практики - 4
Деталізувати можна настільки, наскільки це потрібно. Всі позначення вказані тут: " PlantUML - діаграма класів ". Крім того, у малюванні такої схеми немає нічого надприродного, і під час роботи над своїми завданнями її можна швидко малювати від руки. Це дозволить розвинути навички продумування архітектури програми та допоможе виявити недоліки структури класів на ранньому етапі, а не коли ви вже витратите день на реалізацію неправильної моделі. Мені здається, це непогана причина спробувати? )
UML: від теорії до практики - 5

Автоматизація

Існують різні способи автоматичної генерації PlantUML діаграм. Наприклад, у Idea є плагін SketchIT , але малює він їх не зовсім правильно. Скажімо, неправильно малюється імплементація інтерфейсів (відображається як спадкування). Також в інтернеті є приклади того, як це вбудувати у життєвий цикл складання вашого проекту. Допустимо, для Maven є приклад використання uml-java-docklet . Для того, щоб показати як це, скористаємося Maven Archetype для швидкого створення Maven проекту. Виконаємо команду: mvn archetype:generate На питанні вибору фільтра ( Choose a number or apply filter ) залишаємо default, просто натиснувши Enter. Це завжди буде " maven-archetype-quickstartДалі відповідаємо на запитання і завершуємо створення проекту:
UML: від теорії до практики - 6
Оскільки Maven не є метою цієї статті, відповіді на свої запитання щодо Maven можна знайти в Maven Users Centre . У створеному проекті відкриємо на редагування файл опису проекту, pom.xml . У нього скопіюємо вміст із опису uml-java-docklet installing . Артефакт, що використовується в описі, не вдалося знайти в репозиторії Maven Central. Але у мене запрацювало з цим: https://mvnrepository.com/artifact/com.chfourie/uml-java-doclet/1.0.0 . Тобто треба в тому описі просто замінити groupId з " info.leadinglight " на " com.chfourie " і поставити версію " 1.0.0 ". Після цього можемо виконати у каталозі, де знаходиться файлpom.xml ці команди: mvn clean installі mvn javadoc:javadoc. Тепер, якщо відкрити згенеровану документацію (explorer targetsiteapidocsindex.html), ми побачимо UML схеми. До речі, імплементація тут вже відображається правильно.

Висновок

Як видно, UML дозволяє візуалізувати структуру вашої програми. Крім того, UML не обмежується лише цим. За допомогою UML можна описувати різні процеси всередині вашої компанії або описувати бізнес-процес, в рамках якого працює функція, яку ви пишете. Наскільки UML корисний особисто для вас - вирішувати вам, але знайти час і ознайомитися докладніше буде в будь-якому випадку корисно. #Viacheslav
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ