UML: поведение
UML (unified modeling language) - набор из полутора десятков видов диаграмм, но аналитику в работе нужны три-четыре. Проверяют не знание значков, а понимание, какой диаграммой что выражают: типичная просьба звучит как «нарисуй, как идёт согласование заявки», а следом обязательно прилетает «а почему именно эта нотация».
Стержень темы держится на разделении ролей. Activity рассказывает про поток работ, машина состояний - про жизненный цикл одного объекта, use case - про границу системы и цели тех, кто ей пользуется. Каждая умеет своё и намеренно молчит об остальном, и в этом молчании её польза: схема, которая показывает всё, не показывает ничего.
// Формулировки: «чем activity отличается от sequence?», «когда нужна диаграмма состояний?», «что такое дорожки?»
Activity и дорожки
Activity - это блок-схема процесса: действия, стрелки между ними, ромбы условий, точки распараллеливания. Пока дорожек нет, перед тобой описание алгоритма: понятно, что происходит, и непонятно, кто это делает.
Дорожки добавляют ровно одно измерение - ответственность. Схему делят горизонтальными или вертикальными полосами, и каждое действие ложится в полосу того, кто его выполняет. С этого момента становятся видны передачи между участниками, а каждая передача - это ожидание, очередь и риск, что контекст потеряется по дороге.
Fork - развилка на параллельные ветки, join - точка, где их снова собирают в одну. Пара обязана быть симметричной. Оставишь fork без join, и остаётся неопределённым, ждём ли мы обе ветки перед следующим шагом; неопределённость никуда не денется, её просто доопределит разработчик по своему усмотрению, а ты узнаешь об этом на приёмке.
// Разница с sequence-диаграммой в вопросе, на который они отвечают. Activity отвечает «что за чем происходит и кто отвечает». Sequence - «кто кому какое сообщение шлёт и в каком порядке». Обмен между сервисами рисуют вторым, а не первым.
Машина состояний против набора флагов
Диаграмма состояний моделирует жизненный цикл одного объекта: заказа, заявки, договора. В ней только состояния и переходы между ними по событиям, ничего больше.
Её главная ценность считается на пальцах. Возьми заказ и опиши его тремя независимыми флажками: оплачен, отгружен, отменён. Три флага дают восемь сочетаний, и ровно половина из них - бессмыслица: отгружен без оплаты, отменён и отгружен одновременно, отменён и оплачен и отгружен разом. Каждое из этих четырёх невозможных сочетаний придётся ловить отдельной проверкой в коде, и одну из проверок кто-нибудь однажды забудет. Добавь четвёртый флаг - сочетаний станет шестнадцать.
Машина состояний убирает проблему на корню: она перечисляет только законные состояния и только разрешённые переходы между ними, поэтому невозможное просто нечем выразить. Целый класс дефектов исчезает ещё на схеме, до первой строчки кода.
// Отдельная деталь, которую любят спрашивать: переход без события-триггера. Он читается как завершающий - срабатывает сам, когда закончится работа внутри состояния. Это законная конструкция для технических состояний вроде «Проверка документов», а вот прочитать его как «может случиться в любой момент» значит заложить гонку.
- завершающий переход
- переход без указанного события. Срабатывает автоматически, как только закончится деятельность внутри состояния, а не по внешнему сигналу
Use case диаграмма: обзор, а не детали
Она отвечает ровно на три вопроса. Где проходит граница системы, кто с ней взаимодействует снаружи, ради каких целей эти люди и системы к ней обращаются. Порядок шагов внутри она не показывает намеренно - его место в текстовом сценарии.
Ценность в охвате, а не в глубине. За минуту видно, все ли роли учтены, не забыта ли внешняя система-потребитель и нет ли цели, которую никто не заказывал. Это дешёвая проверка полноты перед тем, как углубляться в детали.
// Попытка впихнуть в неё логику превращает диаграмму в паутину из связей «включает» и «расширяет», которую не читает никто. Признак болезни простой: если на схеме больше десятка овалов и появились стрелки между ними, ты рисуешь не use case, а плохую activity.
Как отвечать: «Когда возьмёшь машину состояний, а когда обойдёшься флагами?»
Смотрю, бывают ли недопустимые сочетания. Если у объекта два-три независимых признака и любая их комбинация осмысленна, флаги проще и честнее, городить схему незачем. Но как только появляются сочетания, которых быть не должно - оплачен и одновременно отменён, отгружен без оплаты, - я перехожу к явной машине состояний. Причина арифметическая: три флага дают восемь комбинаций, из них законны обычно четыре, и каждую из четырёх незаконных придётся ловить проверкой в коде, а одну кто-нибудь забудет. Машина состояний перечисляет только законные состояния и переходы, поэтому невозможное не выражается вообще. Заодно на такой схеме сразу видны тупики и недостижимые состояния - те самые дефекты, которые иначе всплывают в проде через полгода.
Кандидат даёт критерий выбора, а не предпочтение, и подкрепляет его счётом комбинаций. Плюс называет класс дефектов, который схема ловит бесплатно.
На чём валятся
- −− Моделируют жизненный цикл набором флагов и получают в базе состояния, которых не бывает.
- −− Ставят fork без join: следующий шаг выполняется дважды или стартует раньше времени.
- −− Рисуют обмен между сервисами на activity, хотя для этого есть sequence.
- −− Читают переход без триггера как «в любой момент» и закладывают гонку.
- −− Пихают логику в use case диаграмму вместо текстового сценария и получают нечитаемую паутину.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.
- Что несёт диаграмма вариантов использования?A)Экраны системы и переходы между нимиB)Порядок шагов внутри сценарияC)Модель данных предметной областиD)Границу системы, акторов и их цели
показать ответ и разбор
+D)Границу системы, акторов и их цели// разбор: Use case диаграмма отвечает на три вопроса: где проходит граница системы, кто с ней взаимодействует и ради каких целей. Она намеренно не показывает порядок шагов — детали живут в текстовом описании сценария. Ценность в обзоре охвата, а не в подробностях.
- Нужно показать, как три сервиса обмениваются вызовами при оплате. Activity или sequence?A)Activity: у процесса есть ветвленияB)Sequence: важны участники и порядок вызововC)Activity: сервисы можно развести по дорожкамD)Обе подойдут, разница косметическая
показать ответ и разбор
+B)Sequence: важны участники и порядок вызовов// разбор: Когда в центре внимания «кто кого вызывает и в каком порядке», выигрывает sequence: участники стоят колонками, вызовы читаются сверху вниз, видно синхронность и ответы. Activity тоже умеет дорожки, но она про поток работ, и обмен сообщениями на ней выражается громоздко.
- Зачем на activity-диаграмме дорожки (swimlanes)?A)Показать, кто выполняет каждое действиеB)Разделить диаграмму на страницы для печатиC)Отметить очерёдность действий во времениD)Сгруппировать действия по приоритету
показать ответ и разбор
+A)Показать, кто выполняет каждое действие// разбор: Дорожка отвечает за ответственность: действие лежит в дорожке того, кто его выполняет — роли, подразделения или системы. Именно дорожки превращают схему алгоритма в схему процесса и сразу подсвечивают лишние передачи между участниками, каждая из которых стоит времени.
- На диаграмме состояний переход нарисован без события-триггера. Как это читать?A)Переход выполняет пользователь вручнуюB)Диаграмма нарисована с ошибкойC)Переход инициирует внешняя системаD)Переход по завершении работы в состоянии
показать ответ и разбор
+D)Переход по завершении работы в состоянии// разбор: Переход без триггера называют завершающим: он срабатывает сам, как только внутренняя деятельность состояния закончилась. Это законная конструкция, полезная для промежуточных технических состояний вроде «Проверка документов» → «Проверено». Путать её с «переход в любой момент» опасно: так появляются гонки.
- Когда жизненный цикл заказа лучше описать state machine, а не набором булевых флагов?A)Когда флагов больше трёхB)Когда заказ хранится в реляционной базеC)Когда часть комбинаций флагов недопустимаD)Когда над заказом работает несколько ролей
показать ответ и разбор
+C)Когда часть комбинаций флагов недопустима// разбор: Набор независимых флагов допускает любые сочетания, включая бессмысленные — «оплачен и отменён» одновременно. Явная машина состояний перечисляет только законные состояния и разрешённые переходы, поэтому невозможные комбинации не выражаются в принципе. Это ловит целый класс дефектов ещё на схеме.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.