UML-диаграммы
UML-нотация, которую рисует аналитик — таксономия диаграмм, связи классов и кратность, агрегация против композиции, диаграммы состояний, use case, активностей и компонентов.
12 вопросов
JuniorТеорияОчень частоКакие связи показывает диаграмма классов и как рисуют ассоциацию, обобщение и зависимость?
Какие связи показывает диаграмма классов и как рисуют ассоциацию, обобщение и зависимость?
Диаграмма классов показывает классы и связи: ассоциация — простая линия (устойчивая ссылка), обобщение — стрелка с полым треугольником, значащая наследование (is-a), зависимость — пунктирная стрелка. Агрегация и композиция — связи целое-часть.
Типичные ошибки
- ✗Путать полый треугольник (обобщение) со стрелкой ассоциации
- ✗Считать зависимость (временное использование) устойчивой ассоциацией
- ✗Забывать, что обобщение — это is-a наследование, а не целое-часть
Уточняющие вопросы
- →Чем зависимость на практике отличается от ассоциации?
- →Когда вы покажете обобщение вместо ассоциации?
JuniorТеорияОчень частоКакие элементы есть у use-case диаграммы и что на ней означают «include» и «extend»?
Какие элементы есть у use-case диаграммы и что на ней означают «include» и «extend»?
У use-case диаграммы есть акторы (человечки вне системы), сценарии (овалы внутри рамки границы) и связи. «include» выносит шаг, который базовый сценарий всегда выполняет; «extend» добавляет необязательный шаг по условию. Обобщение позволяет актору или сценарию наследовать другой.
Типичные ошибки
- ✗Менять местами «include» (всегда выполняется) и «extend» (по условию)
- ✗Размещать акторов внутри рамки границы, а не снаружи
- ✗Рисовать стрелку «extend» в неверном направлении между сценариями
Уточняющие вопросы
- →В какую сторону направлена стрелка «extend» и почему?
- →Когда повторяющийся шаг стоит вынести в «include», а не оставлять внутри?
JuniorДизайнЧастоНабросайте модель классов для онлайн-магазина книг. В домене есть покупатели, оформляющие заказы; каждый заказ перечисляет одну или более книг; у книги есть автор и она относится к категории каталога. Назовите классы, тип связи между каждой парой (ассоциация, агрегация или композиция) и кратность на каждом конце. Объясните, в частности, являются ли строки заказа композицией или агрегацией заказа и как книга связана с категорией и автором, чтобы модель читалась разработчиком однозначно.
Набросайте модель классов для онлайн-магазина книг. В домене есть покупатели, оформляющие заказы; каждый заказ перечисляет одну или более книг; у книги есть автор и она относится к категории каталога. Назовите классы, тип связи между каждой парой (ассоциация, агрегация или композиция) и кратность на каждом конце. Объясните, в частности, являются ли строки заказа композицией или агрегацией заказа и как книга связана с категорией и автором, чтобы модель читалась разработчиком однозначно.
Классы: Customer, Order, OrderLine, Book, Author, Category. Customer 1 — Order 0... Order 1 композирует OrderLine 1.. (строки не существуют без заказа). OrderLine ссылается на Book 1. Book связан с Category (0.. — 1) и Author (1.. — 1) обычными ассоциациями. Кратность на обоих концах.
Типичные ошибки
- ✗Делать строки заказа агрегацией, чтобы они переживали удалённый заказ
- ✗Использовать наследование там, где нужна обычная ассоциация (Book–Author)
- ✗Опускать кратность, оставляя связи один-ко-многим неоднозначными
Уточняющие вопросы
- →Почему строки заказа — композиция, а книга — лишь ассоциация?
- →Как смоделировать книгу с несколькими соавторами?
JuniorТеорияЧастоКакие группы UML-диаграмм существуют и какие из них аналитик реально рисует?
Какие группы UML-диаграмм существуют и какие из них аналитик реально рисует?
UML-диаграммы делятся на два семейства: структурные (класса, компонентов, развёртывания) показывают статическое устройство, а поведенческие (use-case, активностей, sequence, состояний) — поведение во времени. Аналитик чаще всего рисует use-case, активностей, sequence и классы.
Типичные ошибки
- ✗Думать, что любая UML-диаграмма поведенческая, а структура не моделируется
- ✗Путать деление на структурные/поведенческие с функциональными/нефункциональными
- ✗Считать, что аналитик рисует диаграммы развёртывания, а не use-case и активностей
Уточняющие вопросы
- →Какая поведенческая диаграмма лучше подходит для пошагового сценария и почему?
- →Почему аналитик редко владеет диаграммами развёртывания и компонентов?
JuniorТеорияЧастоЧто на sequence-диаграмме такое линия жизни и активация, и чем синхронное сообщение отличается от асинхронного?
Что на sequence-диаграмме такое линия жизни и активация, и чем синхронное сообщение отличается от асинхронного?
Линия жизни — пунктирная вертикаль под каждым участником, показывающая его существование во времени; активация отмечает, когда он активно работает. Синхронное сообщение (закрашенная стрелка) блокирует вызывающего до ответа; асинхронное (открытая стрелка) — fire-and-forget.
Типичные ошибки
- ✗Путать линию жизни (существование во времени) с блоком-заголовком
- ✗Менять местами смысл синхронного (блокирующего) и асинхронного (fire-and-forget)
- ✗Игнорировать закрашенную/открытую стрелку, обозначающую вид сообщения
Уточняющие вопросы
- →Как показать ответ на синхронное сообщение на диаграмме?
- →Как нарисовать таймаут для асинхронного вызова?
MiddleТеорияЧастоЧем агрегация отличается от композиции и что происходит с частями при удалении целого?
Чем агрегация отличается от композиции и что происходит с частями при удалении целого?
Обе — связи целое-часть, различаются владением. Агрегация (полый ромб) — слабая: части существуют независимо и живут дольше целого, переживая его удаление. Композиция (закрашенный ромб) — сильное владение: часть принадлежит одному целому и уничтожается с ним — каскадное удаление.
Типичные ошибки
- ✗Путать, какая из них (композиция) каскадно удаляет части
- ✗Считать агрегацию и композицию полностью взаимозаменяемыми
- ✗Путать ромб целое-часть с треугольником обобщения
Уточняющие вопросы
- →Какая из двух позволяет части разделяться несколькими целыми?
- →Как композиция ложится на каскадное удаление по внешнему ключу в базе?
MiddleТеорияЧастоКак читать кратность на диаграмме классов (1..*, 0..1) и как разрешают связь многие-ко-многим?
Как читать кратность на диаграмме классов (1..*, 0..1) и как разрешают связь многие-ко-многим?
Кратность на конце говорит, сколько объектов этого класса связываются с одним объектом на другом конце — 1, 0..1, 1..*, *. Связь многие-ко-многим (* на обоих концах) разрешают классом-ассоциацией, превращая её в две связи один-ко-многим, хранящие атрибуты пары.
Типичные ошибки
- ✗Читать
0..1и1..*так, будто их границы перевёрнуты - ✗Оставлять связь многие-ко-многим неразрешённой вместо класса-ассоциации
- ✗Ставить кратность на блок класса, а не на конец связи
Уточняющие вопросы
- →Где вы храните атрибут, принадлежащий самой паре связи?
- →Как класс-ассоциация отображается в таблицу связи базы данных?
JuniorТеорияИногдаЧто такое диаграмма активностей и как показать на ней fork/join и узел решения?
Что такое диаграмма активностей и как показать на ней fork/join и узел решения?
Диаграмма активностей моделирует процесс как поток действий от начала к концу. Узел решения — ромб, ветвящий поток по условию-охраннику, позже сводимый в узле слияния. Fork расщепляет поток на несколько параллельных; join ждёт все и сводит их обратно в один.
Типичные ошибки
- ✗Путать fork/join (параллелизм) с решением/слиянием (ветвление)
- ✗Забывать, что join ждёт все параллельные потоки перед продолжением
- ✗Смешивать диаграмму активностей с sequence- или диаграммой классов
Уточняющие вопросы
- →Чем узел слияния отличается от узла join?
- →Как с помощью дорожек показать, кто выполняет каждое действие?
MiddleТеорияИногдаЧем UML-диаграмма классов отличается от ER (entity-relationship) диаграммы и когда рисуют каждую?
Чем UML-диаграмма классов отличается от ER (entity-relationship) диаграммы и когда рисуют каждую?
Диаграмма классов моделирует программные объекты — классы с атрибутами и поведением (методами) плюс наследование. ER-диаграмма моделирует только хранимые данные — сущности, атрибуты и связи, без поведения. Диаграмму классов рисуют для объектной модели, ER — для схемы базы данных.
Типичные ошибки
- ✗Думать, что ER-диаграмма моделирует поведение/методы, как диаграмма классов
- ✗Использовать диаграмму классов для проектирования схемы базы
- ✗Считать обе нотации полностью взаимозаменяемыми
Уточняющие вопросы
- →Какую диаграмму вы отдадите DBA и почему?
- →Как класс ложится на сущность, когда объектная модель становится таблицами?
MiddleТеорияИногдаЧто такое диаграмма компонентов UML и что она показывает, чего не показывает диаграмма развёртывания?
Что такое диаграмма компонентов UML и что она показывает, чего не показывает диаграмма развёртывания?
Диаграмма компонентов показывает логические компоненты системы и интерфейсы, которые каждый предоставляет и требует, — как связан софт. Диаграмма развёртывания показывает физическую топологию: узлы-железо и артефакты на них. Компоненты дают логическую структуру, а не размещение в рантайме.
Типичные ошибки
- ✗Менять местами компоненты (логика) и развёртывание (физика)
- ✗Думать, что диаграмма компонентов перечисляет классы с полями и методами
- ✗Забывать, что компоненты имеют предоставляемые и требуемые интерфейсы
Уточняющие вопросы
- →Что означают символы предоставляемого и требуемого интерфейса?
- →Когда вы нарисуете диаграмму развёртывания вместо неё?
MiddleДизайнИногдаВ команду приходит разработчик, которому нужно понять, как интегрируются три микросервиса — какой сервис вызывает какой, через какие интерфейсы и протоколы. Нужно выбрать одну UML-диаграмму, чтобы это нарисовать. Назовите диаграмму, обоснуйте, почему она подходит для этой цели лучше, чем sequence-диаграмма, диаграмма развёртывания и диаграмма классов, и скажите, что подчёркивала бы каждая из этих трёх — чтобы было ясно, что выбор осознанный, а не по привычке.
В команду приходит разработчик, которому нужно понять, как интегрируются три микросервиса — какой сервис вызывает какой, через какие интерфейсы и протоколы. Нужно выбрать одну UML-диаграмму, чтобы это нарисовать. Назовите диаграмму, обоснуйте, почему она подходит для этой цели лучше, чем sequence-диаграмма, диаграмма развёртывания и диаграмма классов, и скажите, что подчёркивала бы каждая из этих трёх — чтобы было ясно, что выбор осознанный, а не по привычке.
Выберите диаграмму компонентов: она рисует каждый микросервис компонентом с предоставляемыми и требуемыми интерфейсами, делая интеграцию наглядной. Sequence показывает порядок сообщений одного сценария; развёртывания — физические узлы; классов — слишком детальна для интеграции.
Типичные ошибки
- ✗Выбирать диаграмму развёртывания — она про узлы, а не логические вызовы
- ✗Хвататься за диаграмму классов, слишком детальную для интеграции сервисов
- ✗Считать, что sequence охватывает всю интеграцию, а не один поток
Уточняющие вопросы
- →Когда sequence-диаграмма была бы лучшим выбором?
- →Как предоставляемые и требуемые интерфейсы показывают протокол интеграции?
MiddleТеорияИногдаЧто такое диаграмма состояний, что нужно переходу и как смоделировать статусы заказа?
Что такое диаграмма состояний, что нужно переходу и как смоделировать статусы заказа?
Диаграмма состояний моделирует жизненный цикл объекта как состояния и переходы. Переходу нужны исходное состояние, целевое состояние и событие-триггер, плюс необязательные охранник и действие. Заказ становится состояниями New, Paid, Shipped, Delivered, Cancelled, которые двигают события «оплатить».
Типичные ошибки
- ✗Путать диаграмму состояний с диаграммой классов или sequence
- ✗Думать, что переходу не нужно событие-триггер
- ✗Считать охранник обязательным, а событие — необязательным
Уточняющие вопросы
- →Как показать на переходе условие-охранник?
- →Чем начальное состояние отличается от конечного?