Спецификация диаграммы эффектов v0.1.0

История изменений

v0.2.0

  1. Изменение нотации: обращено направление стрелок, обозначающих эффекты чтения - теперь они идут от операций к ресурсам.

v0.1.0

  1. Изменение концептуальной модели: эффекты косвенного вызова заменены на события.
  2. Улучшена стилистика и точность формулировок.
  3. Удалено "Приложение 3. Философия эффекта".

v0.0.2

  1. Изменение условного обозначения событий: отказ от представления отдельными блоками в пользу стрелок.
  2. Переход к использованию визуального языка C4 Model.

v0.0.1

Опубликована первая версия.

Введение

Диаграмма эффектов — инструмент для разработчиков, предназначенный для визуализации поведения информационной системы через описание её взаимодействия с внешним миром.

Диаграмма эффектов полезна на всех этапах разработки ПО — от первичного анализа до планирования работ и поддержки. Она позволяет с минимальными затратами:

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

Концептуальная модель

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

В диаграмме эффектов такие устройства моделируются с помощью четырёх основных элементов:

  • События — типы изменений в окружающем мире, на которые реагирует система;
  • Ресурсы — части окружающего мира, которые система изменяет в процессе своей работы;
  • Эффекты — атомарные единицы взаимодействия системы с окружающим миром;
  • Операции — группы эффектов, образующие атомарные функции системы.

Событие

Событие - это обнаруженное изменение части окружающего мира. Изменение определяется посредством сравнения текущего наблюдаемого состояния окружающего мира с его предыдущим известным состоянием. В современных информационных системах отслеживанием изменений обычно занимаются низкоуровневые компоненты — операционные системы, middleware, фреймворки и библиотеки — поэтому на уровне прикладного приложения, события превращаются в вызовы кода системы, переданного в такой компонент.

Примеры событий:

  • Поступил HTTP-запрос;
  • Появилось новое сообщение в очереди;
  • Наступила полночь;
  • Нажата кнопка мыши.

В ответ на события система реагирует новыми изменениями окружающего мира, части которого представлены в системе ресурсами.

Ресурс

Ресурс - это именованная область изменяемого состояния.

Примеры ресурсов:

  • Глобальная переменная, хранящая примитивное значение;
  • Таблица в реляционной БД;
  • Топик очереди сообщений;
  • Ресурс REST API внешней системы;

Ресурсы предоставляют API для считывания и изменения своего состояния.

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

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

Вызовы API ресурсов являются эффектами работы системы.

Эффект

Эффект — это атомарный на данном уровне абстракции акт чтения или изменения некоторого состояния (ресурса).

Эффекты чтения характеризуются тем, что считывание одного и того же состояния в разные моменты времени может дать разные результаты. А эффекты изменения (или записи) характеризуются тем, что изменённое состояние может быть считано за пределами текущего фрейма стека потока выполнения.

Примеры эффектов:

  • Чтение и запись глобальной переменной;
  • Чтение и запись файла;
  • Выборка или обновление данных в таблице реляционной БД;
  • Отправка HTTP-запроса*.

*Симметричный эффект чтения поступающих HTTP-запросов выполняется HTTP-сервером и в систему они попадают уже в виде событий - как вызов метода обработчика запросов.

Эффекты атомарны на одном уровне абстракции. Но на более низком уровне они могут быть реализованы несколькими эффектами. Например, эффект вставки строки в таблицу РСУБД в самой РСУБД приведёт к целой группе эффектов: считывание и запись страницы таблицы, считывание и запись страниц индексов таблицы, обновление последовательности генерации первичных ключей и т.д.

С другой стороны, те же самые эффекты зачастую выполняются группами (что-то считать, изменить и записать обратно) и на более высоком уровне выглядят как атомарный эффект. Такие группы эффектов образуют операции системы.

Операция

Операция - это атомарная единица полезной работы, которую система предоставляет для своих пользователей. В процессе своей работы операция, как правило, выполняет один или несколько эффектов чтения и записи.

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

Применение

Диаграмма эффектов даёт чёткое представление об операциях системы, необходимое на всех этапах жизненного цикла разработки.

  1. На этапе поддержки и развития диаграмма позволяет описать текущее наблюдаемое поведение системы и спрогнозировать, как оно поменяется после внесения изменений в систему. Благодаря этому можно заметить нежелательные изменения и, таким образом, избежать регрессий.
  2. На этапе анализа требований к системе диаграмма эффектов помогает переформулировать требования в абстракциях будущей программы.
  3. На этапе оценки диаграмма позволяет точнее определить состав работ (на основе списка операций) и трудоёмкость (на основе списка событий, требуемых эффектов и целевых ресурсов).
  4. На этапе проектирования системы операции и ресурсы диаграммы становятся ключевыми блоками, правильная декомпозиция которых поможет создать основу для системы с низкой сцепленностью.
  5. На этапе реализации взаимосвязь операций через ресурсы помогает определить порядок выполнения работ и те работы, которые могут быть выполнены параллельно.

Нотация

В основе визуального языка диаграммы эффектов лежит язык модели C4. Это позволяет встраивать диаграмму эффектов в модель C4 на четвёртом уровне — в качестве диаграммы кода.

Нотация диаграммы эффектов бывает двух типов — краткая и полная.

Краткая нотация

В краткой нотации используются 4 элемента, которые составляют ядро диаграммы эффектов:

  • операции;
  • ресурсы;
  • эффекты;
  • события, генерируемые системой.

Полная нотация

В полной нотации добавляются элементы:

  • события, генерируемые внешними системами;
  • описания операций и ресурсов в формате модели C4;
  • границы контейнера из C4;
  • внешние системы, базы данных и компоненты из C4;
  • примечания.

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

Критерии выбора нотации

Краткая нотация подойдёт, если:

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

Полная нотация рекомендуется, если:

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

Пример диаграммы эффектов

Оба вида нотации рассматриваются на примере визуализации части системы, отвечающей за регистрацию и аутентификацию пользователей. После успешной регистрации пользователям отправляется приветственное письмо.

Диаграмма эффектов с использованием краткой нотации:

short notation example

Диаграмма эффектов с использованием полной нотации:

full notation example

Элементы диаграммы эффектов

Операции

Операции обозначаются прямоугольником с именем операции:

operation

Ресурсы

Ресурсы обозначаются прямоугольником с именем ресурса и цветом, отличным от цвета операции:

resource

Эффекты

Эффект модификации ресурса обозначается утолщённой линией красного цвета со стрелкой от операции к ресурсу и сопровождается кратким описанием эффекта:

operation resource rw

Эффект чтения ресурса обозначается обычной линией синего цвета со стрелкой от операции к ресурсу и сопровождается кратким описанием считываемых данных:

operation resource ro

События

События обозначаются обычной линией с кругом в начале и стрелкой на конце. Стрелка направлена от внешней системы или ресурса-источника к операции и сопровождается описанием в формате C4.

В промежуточной версии диаграммы элемент внешней системы можно опустить:

event operation

Описания

Для блоков операций и ресурсов можно указать тип, способ реализации и описание:

descriptions

Границы контейнера и внешние системы

Элементы, обозначающие границы системы и внешние системы, полностью соответствуют нотации C4:

  • границы системы обозначаются прямоугольником с указанием имени контейнера, для контура прямоугольника используется светло-серая прерывистая линия;
  • управляемые внешние системы и базы данных обозначаются прямоугольником и символом «База данных»;
  • неуправляемые внешние системы и компоненты обозначаются прямоугольниками светло-серого цвета;
  • неуправляемые базы данных обозначаются светло-серым символом «База данных».

Связь внешних систем с другими элементами диаграммы

Внешние системы связываются с операциями посредством событий:

event sources

Ресурсы связываются с внешними системами посредством стрелок с описанием:

resource impls

Связь ресурсов со сторонними компонентами

Ресурс может быть связан со сторонним компонентом, работающим в том же процессе.

resource component

Примечания

На диаграмму можно помещать заметки и примечания. Рекомендуемое обозначение примечаний — «лист» с загнутым углом, связанный прерывистой линией с комментируемым элементом, но можно использовать и обозначения из других нотаций.

note

Приложение 1. Инструментарий

Диаграмма эффектов основана на визуальном языке модели C4, поэтому для её построения можно использовать любой инструмент с поддержкой C4.

Приложение 2. Реализация концептуальной модели в коде

Все элементы, описанные в концептуальной модели, транслируются непосредственно в код: события и операции — в методы, ресурсы — в классы, эффекты — в вызовы методов.

Операции всегда транслируются в методы классов слоя сервисов приложения, т.е. в методы, определяющие публичный интерфейс системы. При реализации этих методов желательно сохранить наглядность связи операций и эффектов, представленную на диаграмме: методы должны содержать в себе столько же вызовов методов классов-ресурсов, сколько стрелок у соответствующей операции на диаграмме.

Ресурсы превращаются в структуру данных и коллекцию методов работы с ней. Это могут быть классы Spring Data агрегата и репозитория, классы события и интерфейса ApplicationEventPublisher (или обёртки вокруг него), классы REST API модели и клиента и т.п.

В контексте бэкендов информационных систем самыми распространёнными видами ресурсов являются:

  • любые постоянные коллекции данных — таблицы в реляционной СУБД, коллекции в документной СУБД и т.д.;
  • REST API внешних сервисов;
  • любые очереди сообщений и шины событий;
  • изменяемые структуры данных, доступные через глобальные переменные.

События превращаются в методы, передаваемые фреймворку для последующего вызова. Например, метод класса контроллера (RestController в Spring), слушателя (EventListener в Swing), реализация Runnable для таймера и т.д.

В контексте бэкендов информационных систем самыми распространёнными видами событий являются:

  • получение запроса по сети (@RestController + @*Mapping в случае разработки на Spring). Сейчас популярностью пользуется протокол запросов в REST-стиле, но SOAP, gRPC, CORBA и т.п. также попадают в эту категорию;
  • появление сообщения в очереди (@JmsListener);
  • доменное событие или событие приложения (@EventListener);
  • наступление определённого момента времени (@Scheduled). Два основных типа таких событий:
    • наступление заранее известного момента времени (например, полночь вторника);
    • истечение определённого времени с момента в прошлом (например, истечение суток с момента создания предыдущего бэкапа).