Вступ
Я думаю, кожен чув у дитинстві таку приказку як " Сім разів відміряй, один раз відріж ". У програмуванні так само. Краще завжди продумати реалізацію до того, як ви витратите час на її виконання. Часто доводиться при реалізації створювати класи, вигадувати їхню взаємодію. І часто візуальне уявлення про це може допомогти вирішити завдання найбільш правильним чином. У цьому нам і допомагає UML .Що таке UML?
Якщо подивитися картинки в пошукових системах, то стане зрозуміло, що UML – це щось про схеми, стрілочки та квадратики. Що важливо, що UML перекладається як Unified Modeling Language . Важливе слово Unified. Тобто наші картинки зрозуміємо не лише ми, а й інші, хто знає UML. Виходить це така міжнародна мова малювання схем.
Як говорить Вікіпедія
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". В результаті ми отримаємо гарну діаграму:
@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
Виглядатиме після всього це буде таким чином:
Автоматизація
Існують різні способи автоматичної генерації PlantUML діаграм. Наприклад, у Idea є плагін SketchIT , але малює він їх не зовсім правильно. Скажімо, неправильно малюється імплементація інтерфейсів (відображається як спадкування). Також в інтернеті є приклади того, як це вбудувати у життєвий цикл складання вашого проекту. Допустимо, для Maven є приклад використання uml-java-docklet . Для того, щоб показати як це, скористаємося Maven Archetype для швидкого створення Maven проекту. Виконаємо команду:mvn archetype:generate
На питанні вибору фільтра ( Choose a number or apply filter ) залишаємо default, просто натиснувши Enter. Це завжди буде " maven-archetype-quickstartДалі відповідаємо на запитання і завершуємо створення проекту:
mvn clean install
і mvn javadoc:javadoc
. Тепер, якщо відкрити згенеровану документацію (explorer targetsiteapidocsindex.html), ми побачимо UML схеми. До речі, імплементація тут вже відображається правильно.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ