Обзор “Clean Architecture” (Часть II: принципы дизайна модулей и разделения по компонентам)

Рис.1 “Содержание книги и второй части обзора”

Design Principles

Цели дизайн принципов и сфера их применимости понятна и приведена на рисунке ниже

Рис.2 “Цели дизайн принципов”
Рис.3 “Принципы дизайна (SOLID)”

SRP: The Single Responsibility Principle

Этот принцип часто понимают не так, как следует. Стандартное понимание верно для функции

  • accidental duplication — когда код разных акторов зависит от общего модуля, в котором происходят изменения нужные для одного актора, но не другого. Изменения вносятся для одного актора, но влияют сразу на всех
  • merges — когда код разных акторов зависит от общего модуля, в который вносят параллельно изменения нужные как для одного актора, так и для другого. Итоговое поведение может не удовлетворять ни одного из акторов
Рис.4 “Применение принципа SRP на разных уровнях абстракции”

OCP: The Open-Closed Principle

Этот принцип был предложен Бертраном Мейером в 1988 и звучал так

LSP: The Liskov Substitution Principle

В 1988 году Барбара Лисков предложила принцип для определения подтипов

ISP: The Interface Segregation Principle

Этот принцип говорит про то, что no client should be forced to depend on methods it does not use. На уровне кода реализация этого принципа зависит от конструкций языка, доступных для определения зависимостей.

DIP: The Dependency Inversion Principle

Этот принцип говорит о том, что the most flexible systems are those in which source code dependencies refer only to abstractions, not to concretions.

Рис.5 “Советы для обеспечения стабильности абстракций”
Рис.6 “Диаграмма классов с применением Dependency Inversion Principle”

Component Principles

И начинается эта часть с обсуждения того, что такое

Components

В первом предложении дается определение

Component Cohesion

В этой главе автор рассказывает о трех принципах, которые помогают определить как разбивать классы по компонентам.

Рис.7 “Component Cohesion Principles”
Рис.8 “Cohesion principles tension diagram”

Component Coupling

В этой главе автор рассматривает взаимоотношения между компонентами. И здесь будут трения между вопросами develop-ability и logical design.

Рис.9 “Component Coupling Principles”
  • Еженедельный билд— билд всей системы раз в неделю. В наше время это кажется уже устаревшим подходом. Надо уметь билдить систему по требованию с той частотой, что нам нужна
  • Устранение циклических зависимостей — по-факту, граф зависимостей должен быть направленным ациклическим графом (directed acyclic graphDAG). Забавно, что сейчас отсутствие циклов можно контролировать на уровне CI/CD пайплайнов
  • FanIn: число входящих зависимостей для компонента (сколько компонентов от него зависят)
  • FanOut: число исходящих зависимостей для компонента (от скольких компонентов он зависит)
  • FanIn и FanOut рассчитываются как число классов извне компонентов, которые имеют зависимости на классы внутри компонентов.
  • I (Instability): I = FanOut/(FanOut+ FanIn): эта метрика принимает значения от 0 для полностью стабильного компонента, до 1 — для полностью нестабильного
Рис.10 “Примеры стабильного и нестабильного компонента”
Рис.11 “Правильное размещение стабильных и нестабильных компонент”
  • A: Abstractness. A = Na/Nc
  • Зона боли — здесь у нас полностью стабильные и неабстрактные компоненты. Проблема в том, что если потребуется поменять реализацию, то это будет очень больно
  • Зона бесполезности — здесь у нас абстрактные классы, от которых никто не зависит. Это просто бессмысленно.

--

--

Director of digital ecosystem development department at Tinkoff. Bachelor at applied math, Master at system analysis, Postgraduate studies at economics.

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Alexander Polomodov

Alexander Polomodov

Director of digital ecosystem development department at Tinkoff. Bachelor at applied math, Master at system analysis, Postgraduate studies at economics.