← Назад к вопросам

Почему гексагональная архитектура является шестиугольной?

1.7 Middle🔥 131 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

Давайте разберем подробно, откуда взялось это название, что оно символизирует и почему оно так важно для понимания самой архитектуры.

Происхождение термина и метафора

Термин "Hexagonal Architecture" был введен Алистером Кокберном (Alistair Cockburn) в 2005 году. Ключевая идея — визуализация.

Представьте себе шестиугольник (hexagon) в центре диаграммы.

  • В центре находится ядро системы — ваша бизнес-логика (domain layer). Это самые ценные, уникальные и независимые правила вашего приложения.
  • Стороны шестиугольника — это порты (ports). Они представляют собой интерфейсы, которые определяют, как внешний мир может взаимодействовать с ядром (входящие порты) и как ядро может взаимодействовать с внешним миром (исходящие порты).
  • За пределами шестиугольника, снаружи, находятся адаптеры (adapters). Они "прикручиваются" к портам и отвечают за преобразование данных из форматов внешнего мира (HTTP, CLI, события брокера) в формат, понятный ядру, и наоборот.
// Пример входящего порта (интерфейс, который объявляет ЯДРО)
interface OrderService {
    placeOrder(order: Order): Promise<OrderConfirmation>;
}

// Пример исходящего порта (интерфейс, который объявляет ЯДРО)
interface OrderRepository {
    save(order: Order): Promise<void>;
    findById(id: OrderId): Promise<Order | null>;
}

Почему именно ШЕСТЬ сторон? Это не математика, а семантика

Количество "шесть" здесь условно и символично. Шестиугольник был выбран, потому что он наглядно демонстрирует несколько фундаментальных принципов:

  1. Множественность каналов взаимодействия. У шестиугольника много сторон, к каждой из которых можно "присоединить" адаптер. Это иллюстрирует, что ваше ядро может иметь не один, а множество способов взаимодействия (HTTP API, консольные команды, WebSocket, GraphQL, тестовые фреймворки).
    *   **Левые стороны (Primary/Driving адаптеры):** Адаптеры, которые инициируют действие (например, REST-контроллер, обработчик CLI-команды).
    *   **Правые стороны (Secondary/Driven адаптеры):** Адаптеры, к которым обращается ядро (например, адаптер к PostgreSQL, адаптер к SMTP-серверу, адаптер к внешнему платежному API).

  1. Равноправие интерфейсов. В архитектуре, основанной на слоях (layered), часто есть неявная иерархия "сверху вниз". Шестиугольник же визуально помещает все порты (интерфейсы) на один уровень — границы. Это подчеркивает, что ядро одинаково не зависит от того, является ли адаптер HTTP-контроллером или консольной утилитой.

  2. Защита ядра. Метафора стены (шестиугольника) четко отделяет внутреннее (стабильное, важное) от внешнего (изменчивого, детального). Адаптеры — это "шлюзы" в эту крепость.

Альтернативные названия и суть

Из-за того, что буквальное число "6" сбивает с толку, у этой архитектуры появились более точные синонимы, которые раскрывают ее суть:

  • Порты и адаптеры (Ports and Adapters): Это самое точное название. Оно описывает механизм, а не метафору.
    *   **Порт** — это интерфейс (контракт).
    *   **Адаптер** — это реализация этого контракта для конкретной внешней технологии.
  • Clean Architecture / Onion Architecture: Это более поздние и развитые концепции (Роберта Мартина), которые берут принцип "зависимостей, направленных к ядру" из гексагональной архитектуры и формализуют его в виде строгих концентрических кругов с правилами зависимостей.

Практическая ценность для Frontend Developer

Даже во фронтенде эти принципы применимы и мощны:

  • Изоляция логики приложения от фреймворка. Ваши компоненты Vue/React/Svelte и хуки становятся адаптерами. Ваша бизнес-логика (управление состоянием, валидация, специфичные вычисления) живет в чистых модулях-ядрах, которые ничего не знают о React.
  • Легкая замена деталей. Хотите заменить менеджер состояния с Redux на Zustand или перейти с REST на GraphQL? Вы меняете только адаптер, не трогая ядро.
  • Тестируемость. Ядро можно тестировать юнит-тестами в полной изоляции, подменяя реальные адаптеры (например, для API-запросов) на заглушки (mocks/stubs).
// Frontend-пример: Ядро (логика получения пользователя)
interface UserService { // ПОРТ (интерфейс)
    getUser(id: string): Promise<User>;
}

// Адаптер 1: для работы с REST API
class HttpUserService implements UserService {
    async getUser(id: string): Promise<User> {
        const response = await fetch(`/api/users/${id}`);
        return response.json();
    }
}

// Адаптер 2: для тестирования или работы с моковыми данными
class MockUserService implements UserService {
    async getUser(id: string): Promise<User> {
        return { id, name: 'Test User' };
    }
}

// React-компонент (еще один адаптер, "первичный/ведущий")
const UserProfile: React.FC<{ userId: string }> = ({ userId }) => {
    const [user, setUser] = useState<User | null>(null);
    // Сервис внедряется через Dependency Injection (пропсом, контекстом, DI-контейнером)
    const userService: UserService = new HttpUserService(); // Легко заменить на MockUserService

    useEffect(() => {
        userService.getUser(userId).then(setUser);
    }, [userId]);

    return <div>{user?.name}</div>;
};

Итог

Гексагональная архитектура "шестиугольна" не в буквальном смысле счета до шести, а как мощная визуальная метафора. Она олицетворяет:

  • Защищенное ядро (домен) в центре.
  • Множество стандартизированных точек входа и выхода (порты) на его границах.
  • Легко заменяемые преобразователи (адаптеры) снаружи, которые соединяют порты с хаотичным внешним миром (базами данных, фреймворками, UI, API).

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

Почему гексагональная архитектура является шестиугольной? | PrepBro