Чистая архитектуре - это набор архитектурных правил от Роберта Мартина, которые обобщают более чем полувековой опыт автора по разработке программного обеспечения. В этом стрим я хочу остановиться на некоторых из этих правил и сравнить со своим опытом использования. Как известно, сколько людей, столько и мнений, поэтому я не согласен со всеми выводами Роберта Мартина, хоть и считаю, что книга "Чистая архитектура" - одна из лучших книг, которые мне довелось читать по программированию.
В этом стриме рассмотрим следующие вопросы:
За долгие годы вокруг понятий "дизайн" и "архитектура" накопилось много путаницы. Что такое дизайн? Что такое архитектура? Одна из целей этой книги - устранить весь этот беспорядок и определить раз и навсегда, что такое дизайн и архитектура. Прежде всего я утверждаю, что между этими понятиями нет никакой разницы. Вообще никакой.
Это очень спорное утверждение, которые требует уточнения нескольких вещей:
Архитекторы часто попадают в ловушку, зависящую от их страха перед дублированием
Дублирование бывает:
Робертом Мартином не рассмотрен еще один важный момент - дублирование как инструмент совместной работы. Кроме необходимости внесения изменений, есть еще вопрос "синхронности" этих изменений. Очень часто, для организации совместной работы нескольких команд разработчиков используется тиражирование библиотек и другого общего кода.
При тиражировании создаются копия исходного кода, но при изменении в исходном коде (обновлении версии), в скопированных участках требуется сначала подготовить окружение, а только потом проводить изменения.
Чем больше разрыв между изначальным и тиражируемым кодом, тем больше может быть лаг по времени по внесению изменений. Таким образом "истиное" дублирование, может позволять организовать работу большого числа команд, с разбежкой по версиям.
Роберт Мартин придумал замечательные принцип, которые легли в аббревиатуру SOLID (сама аббревиатура придумана Майклом Фэзерсом). Эти принципы являются чуть ли не основой любого разговора о дизайне кода, но у них есть большая проблема - они очень абстрактны, а значит трактуются разными людьми по-разному.
Например, у принципа единственной ответственности есть аж три популярные трактовки:
На самом деле все становится проще, если ввести ряд принципов, которые формулируются сильно проще:
Основная проблема SOLID - он преувеличивает значимость зависимостей и управляет в основном ими. Что сильно "дробит" и тем самым усложняет код.
Принципы SOLID приводят нас к идеи повторного использования кода. Управлением зависимостями - это создание таких компонентов, которые могут расширяться, соответствовать требованиям и не приносить "сюрпризов". Но в повторном использовании кроется и проблема - повторное использование создает "устойчивые" компоненты, которые сопротивляются изменениям.
В "Чистой архитектуре" для решение этой проблемы используется два принципа:
Границы необходимы для нескольких целей:
Границы нужны чтобы их пересекать, для этого вводятся правила (интерфейсы) взаимодействия. На уровне кода - это способность через интерфейс обратиться к функциям за пределами границы. Границы который нельзя пересекать - это демилитаризованные зоны, пересечение таких границ делается по "шлюзовому" принципу - сторона А положила данные в шлюз, заблокировала шлюз, сторона Б открыла шлюз со своей стороны и забрала данные.
В монолите тоже есть границы, но зона развертывания едина.
Под кричащей архитектурой понимается такое описание архитектуры, которое явно показывает суть создаваемой программной системы и позволяет интерпретировать цели и задачи системы без дополнительных пояснений или чтения кода.
Роберт Мартин обращает особое внимание, что фреймворк - не должен восприниматься как архитектура, а описание архитектуры не должно однозначно определять фреймворк, который будет использоваться. Но есть и другие моменты, которые помогают более наглядно сформировать представление об архитектуре, сделать ее кричащей: