Перейти к содержимому

Диаграмма коммуникации

Диаграмма коммуникации (communication diagram) — это разновидность диаграммы взаимодействия (interaction diagram). Она описывает, какие участники взаимодействия обмениваются сообщениями и через какие связи это происходит.

По смыслу диаграмма коммуникации близка к диаграмме последовательности (sequence diagram): обе показывают одно взаимодействие. Разница в акценте. Диаграмма последовательности хорошо показывает порядок сообщений во времени, а диаграмма коммуникации лучше показывает сеть участников и связи, по которым эти сообщения передаются.

Если диаграмма последовательности отвечает на вопрос “в каком порядке участники обмениваются сообщениями?”, то диаграмма коммуникации отвечает на вопрос “кто с кем связан и какие сообщения проходят по этим связям?”.

На диаграмме коммуникации обычно используются следующие элементы:

  • линия жизни (lifeline);
  • сообщение (message);
  • соединитель или связь между линиями жизни (connector);
  • номер последовательности сообщения (sequence number);
  • сторожевое условие (guard);
  • итерация сообщения (iteration);
  • аргументы и возвращаемые значения сообщения.

Линия жизни (lifeline) представляет участника взаимодействия. Это может быть объект, экземпляр класса, компонент, актор или другая сущность, участвующая в сценарии. На диаграмме коммуникации линия жизни обычно показывается как прямоугольник с именем, например orderService: OrderService.

Сообщение (message) показывает передачу управления, вызов операции, отправку сигнала или другой акт взаимодействия между линиями жизни. Сообщение размещается рядом с соединителем и направляется стрелкой.

Соединитель (connector) показывает, что между участниками есть структурная возможность взаимодействия. В простой учебной модели его можно читать как “эти два участника могут обмениваться сообщениями в рамках данного сценария”.

Поскольку на диаграмме коммуникации нет вертикальной оси времени, порядок сообщений задаётся нумерацией.

Пример:

1: createOrder(data)
2: validate(order)
3: save(order)
4: notify(customer)

Вложенные вызовы можно показывать составной нумерацией:

1: checkout()
1.1: validateCart()
1.2: reserveItems()
1.3: createPayment()

Такая запись показывает, что сообщения 1.1, 1.2 и 1.3 выполняются внутри более крупного шага 1.

Как и на других диаграммах взаимодействия, сообщение может иметь условие. Условие записывается как сторожевое условие (guard), обычно в квадратных скобках:

2 [заказ корректен]: save(order)

Повторение можно показать как итерацию (iteration). В учебной записи достаточно явно указать смысл повторения:

3 *[для каждой позиции]: reserve(item)

Здесь важно не перегружать диаграмму алгоритмическими деталями. Если сценарий содержит сложные ветвления, циклы и параллельность, чаще удобнее использовать диаграмму последовательности или диаграмму деятельности.

Диаграмма коммуникации полезна, когда важнее показать структуру взаимодействия, чем точную временную шкалу.

Хорошие случаи использования:

  • нужно показать, какие объекты участвуют в реализации сценария;
  • нужно подчеркнуть связи между участниками взаимодействия;
  • нужно проверить, не появился ли лишний посредник или циклическая коммуникация;
  • нужно компактно показать простой сценарий без сложных combined fragments;
  • нужно связать сценарий с технической диаграммой классов.

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

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

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

Частые ошибки при построении диаграммы коммуникации:

  • использовать её как обычную схему компонентов без сообщений;
  • не нумеровать сообщения, из-за чего теряется порядок взаимодействия;
  • показывать сообщения между участниками, которые никак не связаны в модели;
  • смешивать участников предметной области и технические классы без объяснения уровня модели;
  • перегружать диаграмму сложными условиями, которые лучше вынести на диаграмму деятельности или последовательности;
  • считать соединитель произвольной линией, хотя он должен отражать возможность взаимодействия между линиями жизни.