сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · UML и нотации

UML: поведение

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, остальные разбираются в тренажёре.

  1. #ana_uml_behavior1 / 5
    Что несёт диаграмма вариантов использования?
    A)Экраны системы и переходы между ними
    B)Порядок шагов внутри сценария
    C)Модель данных предметной области
    D)Границу системы, акторов и их цели
    показать ответ и разбор
    +D)Границу системы, акторов и их цели

    // разбор: Use case диаграмма отвечает на три вопроса: где проходит граница системы, кто с ней взаимодействует и ради каких целей. Она намеренно не показывает порядок шагов — детали живут в текстовом описании сценария. Ценность в обзоре охвата, а не в подробностях.

  2. #ana_uml_behavior2 / 5
    Нужно показать, как три сервиса обмениваются вызовами при оплате. Activity или sequence?
    A)Activity: у процесса есть ветвления
    B)Sequence: важны участники и порядок вызовов
    C)Activity: сервисы можно развести по дорожкам
    D)Обе подойдут, разница косметическая
    показать ответ и разбор
    +B)Sequence: важны участники и порядок вызовов

    // разбор: Когда в центре внимания «кто кого вызывает и в каком порядке», выигрывает sequence: участники стоят колонками, вызовы читаются сверху вниз, видно синхронность и ответы. Activity тоже умеет дорожки, но она про поток работ, и обмен сообщениями на ней выражается громоздко.

  3. #ana_uml_behavior3 / 5
    Зачем на activity-диаграмме дорожки (swimlanes)?
    A)Показать, кто выполняет каждое действие
    B)Разделить диаграмму на страницы для печати
    C)Отметить очерёдность действий во времени
    D)Сгруппировать действия по приоритету
    показать ответ и разбор
    +A)Показать, кто выполняет каждое действие

    // разбор: Дорожка отвечает за ответственность: действие лежит в дорожке того, кто его выполняет — роли, подразделения или системы. Именно дорожки превращают схему алгоритма в схему процесса и сразу подсвечивают лишние передачи между участниками, каждая из которых стоит времени.

  4. #ana_uml_behavior4 / 5
    На диаграмме состояний переход нарисован без события-триггера. Как это читать?
    A)Переход выполняет пользователь вручную
    B)Диаграмма нарисована с ошибкой
    C)Переход инициирует внешняя система
    D)Переход по завершении работы в состоянии
    показать ответ и разбор
    +D)Переход по завершении работы в состоянии

    // разбор: Переход без триггера называют завершающим: он срабатывает сам, как только внутренняя деятельность состояния закончилась. Это законная конструкция, полезная для промежуточных технических состояний вроде «Проверка документов» → «Проверено». Путать её с «переход в любой момент» опасно: так появляются гонки.

  5. #ana_uml_behavior5 / 5
    Когда жизненный цикл заказа лучше описать state machine, а не набором булевых флагов?
    A)Когда флагов больше трёх
    B)Когда заказ хранится в реляционной базе
    C)Когда часть комбинаций флагов недопустима
    D)Когда над заказом работает несколько ролей
    показать ответ и разбор
    +C)Когда часть комбинаций флагов недопустима

    // разбор: Набор независимых флагов допускает любые сочетания, включая бессмысленные — «оплачен и отменён» одновременно. Явная машина состояний перечисляет только законные состояния и разрешённые переходы, поэтому невозможные комбинации не выражаются в принципе. Это ловит целый класс дефектов ещё на схеме.

дальше

Теорию прочитали. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.