1 of 48

Принцип каскадного снижения связанности

ноябрь, 2024

2 of 48

Руслан

Сафин

Технический директор и партнёр

Бындюсофт

3 of 48

3

Часто ли вы слышите о новом принципе проектирования IT-архитектуры?

А об обновлении классических принципов?

Попробую вас удивить и привнести что-то новое.

4 of 48

Coupling & Cohesion

Связанность и прочность��1974 Larry Constantine, Glenford Myers, Wayne Stevens �IBM Systems Journal — Structured Design

декабрь, 1974

��к 50-летию статьи

5 of 48

5

6 of 48

6

И то, и другое — некая связь компонента, отличается только угол зрения.

У вас не вызывает недоумения, что одно — хорошо, а другое — почему-то плохо?

7 of 48

Coupling

Связанность (зацепление, сцепление, сопряжение)

8 of 48

Связанность

8

  • классы
  • компоненты/модули
  • микросервисы

9 of 48

Cohesion

Прочность (связность, сплоченность, сцепленность)

10 of 48

Прочность

10

  • классы
  • компоненты/модули
  • микросервисы

11 of 48

11

12 of 48

Да, но

?

13 of 48

Да, но

13

?

14 of 48

Уровни компонентизации архитектуры выше микросервисов

14

  • Контекст
  • Продукт/система
  • Ландшафт предприятия (Enterprise)

15 of 48

А в больших энтерпрайзах?

15

  • Подсистемы/проекты
  • Архитектура домена
  • Платформа

16 of 48

Связанность становится прочностью!

17 of 48

Вопрос лишь в том, как мы начертим границы

18 of 48

Сложность

19 of 48

Разберем на примерах

19

20 of 48

Микросервисы

Контексты микросервисов

Продукты

20

21 of 48

Связанность контекстов

21

22 of 48

22

Прочность продуктов (систем)

23 of 48

23

Один и тот же набор зависимостей является связанностью на одном уровне рассмотрения архитекутры и прочностью на другом!

24 of 48

Вижу связанность!

24

Уменьшить связи

Но это же и прочность!

Увеличить связи

25 of 48

25

Переход к рассмотрению цепочки пар связанность-прочность на различных уровнях:

Микросервисы → Контексты микросервисов → Продукты → Архитектура предприятия

26 of 48

26

Сформулируем новое правило:

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

27 of 48

Сигнал о нарушении принципов:

  • Stable Dependencies Principle:�Depend in the direction of stability
  • Stable Abstractions Principle:�A component should be as abstract as it is stable

27

28 of 48

О принципах проектирования и исправлении их нарушений:

28

29 of 48

29

Другой вариант формулировки:

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

30 of 48

Реализация

30

Как отслеживать соблюдение принципа уменьшения связанности?

31 of 48

API-Gateway

31

Отличный подход для организации работы с API.

Но если рассматривать уровни компонентизации — позволяет работать максимум с двумя.

32 of 48

API-Gateway. �«Плоская» структура

32

33 of 48

2 уровня

компонентизации

34 of 48

3 и больше уровней?

34

Несколько каскадных API Gateway скорее добавят сложности

35 of 48

Everything as Code

35

+ Infrastructure as Code

+ Architecture as Code�

= Тесты!

36 of 48

На примере REST-связей

36

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

37 of 48

На примере REST-связей

37

Альтернативная формулировка.

�Только часть микросервисов контекста могут делать запросы к микросервисам из другого контекста продукта/системы. В свою очередь делать запросы к другим продуктам/системам могут ещё меньшее количество микросервисов.

38 of 48

Пример�

У контекста 1 внутренняя прочность — 3 у.е., внешняя связанность — 2.

У нашего проекта внутренняя прочность — 2, внешняя связанность — 1.�3 ≤ 2 ≤ 1

У контекста 2 внутренняя прочность — 1, внешняя связанность — 0.�1 ≤ 0 ≤ 0

38

39 of 48

Обещанный тест

39

for (const boundary of pumlFile.boundaries) {

   const cohesion =

GetBoundaryCohesion(boundary);

   const coupling =

GetBoundaryCoupling(boundary);

// внутренняя прочность периметра больше внешней связанности

   expect(cohesion).toBeGreaterThan(coupling);

// если периметр содержит в себе другие периметры — его прочность меньше суммы? прочностей внутренних периметров

   if (boundary.boundaries.length > 0)

     expect(cohesion).toBeLessThan(<сумма прочностей внутренних контекстов>); }  });

40 of 48

Покрытие архитектуры тестами

40

Данный пример архитектуры и реализацию простого теста на проверку правила можно посмотреть в нашем OpenSource-репозитории с инструментами для покрытия архитектуры as code тестами.

Много QR-кодов дальше, можно приготовить телефончики ☺

41 of 48

Тест на архитектуру —это как?

41

Статья стала статьёй года на Хабре �в номинации Бэкенд

42 of 48

Welcome

42

43 of 48

А что если правило нарушается?

43

44 of 48

44

Принцип каскадного снижения связанности

45 of 48

46 of 48

Открытые вопросы

46

  • Сила зависимостей
  • Разнородная прочность внутренних компонентов
  • Обкатка принципа на большем количестве архитектур

47 of 48

Руслан Сафин

Бындюсофт

Спасибо за внимание!�Есть вопросы?

48 of 48

Куаркод на опросник по докладу.

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

Оцените доклад