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

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

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

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